List Prolog成员谓词
我需要编写一个Prolog谓词,以避免在列表中多次出现重复的答案,如以下示例查询所示:List Prolog成员谓词,list,prolog,List,Prolog,我需要编写一个Prolog谓词,以避免在列表中多次出现重复的答案,如以下示例查询所示: ?- member(a, [a, b, a]). true ?- member(X, [a, b, a]). X = a ; X = b ; false. ?- member(X, [a, b, a, c, a, d, b]). X = a ; X = b ; X = c ; X = d ; false. 我知道,无论重复多少次,以下内容都会输出所有内容: member(X, [X|_]). member(
?- member(a, [a, b, a]).
true
?- member(X, [a, b, a]).
X = a ;
X = b ;
false.
?- member(X, [a, b, a, c, a, d, b]).
X = a ;
X = b ;
X = c ;
X = d ;
false.
我知道,无论重复多少次,以下内容都会输出所有内容:
member(X, [X|_]).
member(X, [_|T]) :- member(X, T).
比较这两个条款,是否有两种情况都适用
member(X, [X|_T]).
member(X, [_Y| T]) :- member(X, T).
只需将两个条款的标题相互比较即可。或者,让Prolog为您完成:
?- member(X, [X|_T]) = member(X, [_Y| T]).
X = _Y, _T = T.
因此\u Y
和X
必须相同。它们什么时候是一样的?始终,如果第一条是真的!因此,我们需要通过在第二条中添加另一个条件来排除这种情况,即它们必须是不同的
memberd(X, [X|_T]).
memberd(X, [Y| T]) :- dif(X,Y), memberd(X, T).
最后一个查询可以使用library(reif)
进行改进,我在Scryer中使用了library(reif)
,但它也可用于|:
?- member(X, [a, b, a, c, a, d, b]).
X = a
; X = b
; X = a
; X = c
; X = a
; X = d
; X = b
; false.
?- memberd(X, [a, b, a, c, a, d, b]).
X = a
; X = b
; X = c
; X = d
; false.
?- memberd(a, [a, b, a, c, a, d, b]).
true
; false.
:- use_module(library(reif)).
memberd(E, [X|Xs]) :-
if_(E = X, true, memberd(E, Xs) ).
?- memberd(a, [a, b, a, c, a, d, b]).
true.