我有一个prolog作业,应该是这样的:
singles([1,2,3,2,2,4,1], [3,4]).
true
现在我已经想通了我应该测试一个元素是否在列表中是单个然后将所有单个元素放在一起..然后我写下来了:
singles(L,SL):-findall(X,isSingle(X,L),SL).
isSingle(X,L):-member(X,L),append(Y,[X|Z],L),not(member(X,L1)),append(Y,Z,L1).
isSingle
函数中的 X
应位于列表L
中,但不应放在没有L1
的新列表X
中,例如1
在[2,1,3]
但不在[2,3]
中,但遗憾的是,整件事情并没有像我想象的那样有效:(
我认为问题出在isSingle
部分,任何人都可以帮助我吗?
答案 0 :(得分:3)
切换not(member(X,L1))
和append(Y,Z,L1)
的顺序,您的代码有效。我不是Prolog专家,所以我对此并不完全确定,但是,通过跟踪,它似乎与使用not
的微妙之处有关。在member
位统一L1
之前,您强制对append(Y,Z,L1)
上的{{1}}进行评估。
答案 1 :(得分:1)
singles(List,SelectList) :-
singles(List,List,SelectList).
singles([],List,[]).
singles([A|R1],List,[A|R2]) :-
unique(A,List),
singles(R1,List,R2).
singles([A|R1],List,R2) :-
\+(unique(A,List)),
singles(R1,List,R2).
unique(A,List) :-
append(L0,[A|R],List),
\+(append(_,[A|_],L0)),
\+(append(_,[A|_],R)).