匹配列表 L1,L2 在 prolog 中



我尝试编写谓词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).

最新更新