Prolog问题! '单打'!

时间:2011-05-31 21:49:24

标签: prolog

我有一个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部分,任何人都可以帮助我吗?

2 个答案:

答案 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)).