prolog中的独特含义是什么?

时间:2016-10-15 18:45:44

标签: prolog

我试图理解唯一谓词:

例如:

unique([H|T],[H|TU]) :- delete(T,E,TN), unique(TN,TU).

delete(T,E,TN) is true if a list TN is identical to a list T
删除所有出现的元素E后

 delete([H|T],H,TN) :- delete(T,H,TN).
 delete([H|T],E,[H|TN]) :- \+ H=E, delete(T,E,TN).
 delete([],_,[]).



unique(['a','b','a','c'],X).

 X = [a, b, c]   <- Enter was pressed

 Yes

所以比较两个列表 T = [&#39; a&#39;,&#39;&#39;&#39; d&#39;,&#39; f&#39;,&#39; t&#39;] TN = [&#39; a&#39;,&#39; b&#39;,&#39; d&#39;]

删除公共元素的出现次数

这是整个代码:

 % delete(L,E,LN) is true if a list LN is identical to a list L
 % after removing all occurences of an element E.
 delete([H|T],H,TN) :- delete(T,H,TN).
 delete([H|T],E,[H|TN]) :- \+ H=E, delete(T,E,TN).
 delete([],_,[]).

 % unique(L,LN) is true if a list LN is identical to a list L
 % without all repeated elements.
 unique([H|T],[H|TU]) :- delete(T,E,TN), unique(TN,TU).
 unique([],[]).

请在这里指导 非常感谢

1 个答案:

答案 0 :(得分:1)

首先,您需要更改
unique([H|T],[H|TU]) :- delete(T,E,TN), unique(TN,TU).
 至:  unique([H|T],[H|TU]) :- delete(T,H,TN), unique(TN,TU).

唯一谓词的作用是删除列表中的元素重复项,并仅保留第一次出现的元素重复项。但是你的谓词失败了,因为你没有处理空列表的情况,所以如果你添加条款:

unique([],[]).

工作正常:

?- unique([a,b,a,c],X).
X = [a, b, c].

在此示例中,它调用unique([a,b,a,c],X)。调用delete([b,a,c],a,TN)和TN成为[b,c],调用unique([b,c],TU),最后返回[a|TU]。 通过调用unique([b,c],TU)以相同的方式递归地找到TU 返回TU=[b|TU2],通过调用unique([c],TU2)递归[c]递归给出TU2。