List 成员/2的代码,带有某种确定性
如何对最后一个具有确定性的成员/2进行编码 元素。目前我正在使用:List 成员/2的代码,带有某种确定性,list,prolog,deterministic,List,Prolog,Deterministic,如何对最后一个具有确定性的成员/2进行编码 元素。目前我正在使用: member(X,[X|_]). member(X,[_|Y]) :- member(X,Y). 当我询问以下问题时: ?- member(X,[1,2]). X = 1 ; X = 2 ; No 口译员在返回2后继续搜索 还有一个选择余地。我如何实现成员/2 这样就不会再发生这种事了 但是应该保留member/2的完整语义,即。 答案如下: ?- member(X,Y) Y = [X|_1] ; Y = [_1,X|
member(X,[X|_]).
member(X,[_|Y]) :- member(X,Y).
当我询问以下问题时:
?- member(X,[1,2]).
X = 1 ;
X = 2 ;
No
口译员在返回2后继续搜索
还有一个选择余地。我如何实现成员/2
这样就不会再发生这种事了
但是应该保留member/2的完整语义,即。
答案如下:
?- member(X,Y)
Y = [X|_1] ;
Y = [_1,X|_2] ;
etc..
应该仍然像以前一样工作
再见
是swi上两个列表调用的结果。它会波及到其他谓词。当最后一个元素的成员是确定性的时,使用成员的其他谓词也会变得更具确定性。确定性很好,因为它允许Prolog解释器修剪环境并执行垃圾收集。看起来您可以查看swi pl的member/2,它在最后一个元素上是确定性的。
member(B, [C|A]) :-
member_(A, B, C).
member_(_, A, A).
member_([C|A], B, _) :-
member_(A, B, C).