2011-05-31 21 views
2

我有一個序言功課,應該像這樣工作:序言問題! '單身'!

singles([1,2,3,2,2,4,1], [3,4]). 
    true 

現在我想通了,我應該測試,如果一個元素是列表中的一個,然後把所有的單個元素together..then我寫的下:

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但沒有X不在新名單L1,像1[2,1,3]但不是在[2,3] ,但可悲的是,整個事情不像我想的那樣工作:(

我認爲問題是在isSingle部分,任何人都可以幫助我嗎?

回答

3

切換not(member(X,L1))append(Y,Z,L1)的順序,並且您的代碼有效。我不是Prolog的專家,所以我對此並不完全確定,但是,經歷這些痕跡,似乎與使用not的微妙之處有關。您在位之前統一L1之前強制member的評估。

+0

哦謝謝!我自己已經明白了這一點!訂單很重要!你的解釋是完美的,完全解決了我的困惑,再次感謝:) – bearzk 2011-05-31 22:44:51

+0

@bearzk你也可以使用select/3如果你允許:http://www.swi-prolog.org/pldoc/doc_for?object=select/ 3 – 2011-06-01 08:34:15

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