Код для member/2 с некоторым детерминизмом

Как я могу закодировать member/2, у которого есть детерминизм для последнего элемента. В настоящее время я использую:

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

Когда я запрашиваю следующее:

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

Интерпретатор продолжает поиск после возврата 2, так как еще остается точка выбора. Как мне реализовать member/2, чтобы этого больше не происходило?

Но должна быть сохранена полная семантика member/2, т.е. такие ответы, как:

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

Должен работать как прежде.

Пока


person Mostowski Collapse    schedule 08.12.2011    source источник
comment
Что ж, это отразится на других предикатах. Когда член является детерминированным для последнего элемента, другие предикаты, использующие член, также становятся более детерминированными. Детерминизм хорош тем, что позволяет интерпретатору Пролога обрезать среду и выполнять сборку мусора.   -  person Mostowski Collapse    schedule 09.12.2011
comment
кажется, вы можете посмотреть на swi pl's member/2, он детерминирован для последнего элемента.   -  person m09    schedule 09.12.2011


Ответы (1)


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

Является результатом двух листинговых вызовов на swi.

person m09    schedule 08.12.2011