2017-10-24 7 views
1

私は両方のバックチェーン手順を描くことで、より効率的なメンバの実装を決定しようとしています。Prolog標準メンバー/ 2対メンバー/ 2はappendで実装されていますか?

標準実装:

isMember(X,[X|Tail]). 
isMember(X,[H|Tail]) :- isMember(X,Tail). 

追加実装:(私のクラスのノートより)

appendMember(X,List). 
appendMember(X,List) :- myAppend(List1,[X|List2],List). 

myAppend([],List,List). 
myAppend([H|List1],List2,[H|Result]) :- myAppend(List1,List2,Result). 

私はTKのEclipse上でトレーサーを使用するとき、私は再帰的で標準的な実装のために期待される出力を得ますappend実装はただちに正常終了します。

私はそれがなぜ、そしてappendメソッドのバックチェインの手順を描くのかと思います。

ありがとうございます!

+1

さらに効率的です['memberd/2'](https://stackoverflow.com/a/21971885/772868) – false

答えて

2

appendMember(X,List).は、2つの引数が何であっても、接続されていない、インスタンス化されていない変数であるため、すぐに満たされます。

このように、私はあなたがそれを削除する必要がありますと思います。

+0

ありがとう!私はそれを見ていて、どうやってバックチェーンプロセスを開始するのか考えましたか?私がそれを取り除くと、トレーサーは何が起きているのかをはっきりと示しています。 – Ruhe

+0

申し訳ありませんが、どちらが大きなリストの方が効率的かわかりますか?彼らは両方とも、私のテストケース...メンバー(p、[d、f、p、r])に対して同じ量のステップを取っているようです。 – Ruhe

+0

@Ruhe、SWIプロローグには[実行時統計情報を取得する]ための述語があります(http://www.swi-prolog.org/pldoc/man?section=statistics)。 – lurker

関連する問題