Code for member/2 with some Determinism

人盡茶涼 提交于 2019-12-04 04:11:58

问题


How can I code member/2 that has determinism for the last element. Currently I am using:

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

When I query the following:

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

The interpreter continues searching after returning 2 since there is still a choice point left. How could I implement member/2 so that this does not happen anymore?

But the full semantic of member/2 should be preserved, i.e. answers such as:

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

Should still work as befor.

Bye


回答1:


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

Is the result of two listing calls on swi.



来源:https://stackoverflow.com/questions/8436568/code-for-member-2-with-some-determinism

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!