Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog成员谓词_List_Prolog - Fatal编程技术网

List 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(

我需要编写一个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(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.