2011-12-08 4 views
4

最後の 要素の決定性を持つmember/2をどのようにコード化できますか?現在、私は使用しています:いくつかの決定性のあるメンバー/ 2のコード

member(X,[X|_]). 
member(X,[_|Y]) :- member(X,Y). 

を、私は、次のクエリを実行すると:

?- member(X,[1,2]). 
X = 1 ; 
X = 2 ; 
No 

インタプリタはまだ選択肢ポイント残っている2 ので、帰国後に検索を続行します。メンバー/ 2 を実装するにはどうしたらいいですか?

しかし、メンバー/ 2の完全なセマンティックが保存されなければならない、すなわちなど 答え:

?- member(X,Y) 
Y = [X|_1] ; 
Y = [_1,X|_2] ; 
etc.. 

はまだbeforとして動作するはずです。

+1

他の述語に波及します。メンバーが最後の要素に対して決定的である場合、メンバーを使用する他の述部もまたより決定論的になります。 Prologインタプリタは、環境をトリミングしてガベージコレクションを実行できるため、決定性は良好です。 –

+1

あなたはswi plのメンバー/ 2を見ることができるようです、それは最後の要素で決定論的です。 – m09

答えて

4
member(B, [C|A]) :- 
    member_(A, B, C). 
member_(_, A, A). 
member_([C|A], B, _) :- 
    member_(A, B, C). 

さようならはSWI上の2つのリストの呼び出しの結果です。

+1

ええと、それはインデックス付けがオンのときに決定論的に機能します。大丈夫です。 –

関連する問題