我尝试编写谓词one_occurence(L1, L2)
如果L1
的每个元素在L2
中出现一次,则谓词是正确的。
delete([H|T], H, TN) :- delete(T, H, TN).
delete([H|T], E, [H|TN]) :- + H = E, delete(T, E, TN).
delete([], _, []).
/*one_occurence(L,LN) is true if a list LN is identical to a list L
without all repeated elements.*/
one_occurence([],[]).
one_occurence([H|T], [H|TU]) :- delete(T, E, TN), one_occurence(TN, TU).
但是当我问one_occurence([a,b,a,a,b,c,d,c],N)
我N=[a,a,c,c]
哪个是错误的。我应该得到N=[a,b,c,d]
.我做错了什么?
我做错了什么?
只是一个错字,您将变量H
拼写为E
:
one_occurence([],[]).
one_occurence([H|T],[H|TU]) :- delete(T,H,TN), one_occurence(TN,TU).
SWI-Prolog编译器会警告你这样的问题...
Swi prolog 有: list_to_set(+List, ?设置)。
或从头开始:
mymember(X,[X|_]).
mymember(X,[_|T]) :- mymember(X,T).
not(A) :- + call(A).
set([],[]).
set([H|T],[H|Out]) :-
not(mymember(H,T)),
set(T,Out).
set([H|T],Out) :-
mymember(H,T),
set(T,Out).
once_occurrence(L1,L2):-set(L1,L2).