我试图理解唯一谓词:
例如:
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([],[]).
请在这里指导 非常感谢
答案 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。