Предикат членства в Прологе без DIF или когда - PullRequest
0 голосов
/ 14 апреля 2020

Следующие логи пролога c

memberd(X, [X|_T]).
memberd(X, [Y| T]) :- dif(X,Y), memberd(X, T).

будут выдавать

?- memberd(a, [a, b, a]).
true
?- memberd(X, [a, b, a]).
X = a ;
X = b ;
false.
?- memberd(X, [a, b, a, c, a, d, b]).
X = a ;
X = b ;
X = c ;
X = d ;
false.

, есть ли логи пролога c, которые можно использовать для получения того же результата без использования when () или dif () функция или что-либо из загруженной прологической библиотеки. Просто используя чистую логику c?

1 Ответ

3 голосов
/ 14 апреля 2020

Чтобы ответить на ваш вопрос буквально, просто используйте:

?- setof(t, member(X, [a,b,a]), _).
   X = a
;  X = b.

Однако некоторые ответы будут неоптимальными:

?- setof(t,member(a,[a,X]),_).
   true
;  X = a.  % redundant

... тогда как memberd/2 ответы в совершенстве:

?- memberd(a,[a,X]).
   true
;  false.

Фактически, если вы используете library(reif) с

memberd(E, [X|Xs]) :-
   if_(E = X, true, memberd(E, Xs) ).

, вы получите наилучший возможный ответ:

?- memberd(a,[a,X]).
   true.
...