2011-09-05 36 views
1

下面的謂詞將項目X添加到列表S.它工作正常。序言:添加列表設置

addToSet(X, S, S) :- 
    atomic(X), 
    member(X, S), 
    !. 
addToSet(X, S, [X|S]) :- 
    atomic(X). 

我試圖把它擴大到它增加了列表中的謂語[H | T]設置S.它可以完美的,如果[H | T]只有2項長...即如果T也原子。

addToSet([], S, S). 
addToSet([H,T], S, S2) :- 
    addToSet(H, S, S1), 
    addToSet(T, S1, S2). 

例如addToSet([5,6],[1,2,3,4],X)。按我的願望工作。但是,addToSet([5,6,7],[1,2,3,4],X)。根本不起作用。我很難過......我的代碼的最後2-3行顯然有些問題,但我無法弄清楚。有小費嗎?

謝謝!

+1

考慮檢查集合相關的謂詞(如果它存在於你的序言系統中)swi-prolog,這裏有一些http://www.swi-prolog.org/pldoc/doc_for?object=section%282,% 27A.12%27,swi%28%27/doc/Manual/lists.html%27%29%29 –

回答

3

addToSet([H,T], S, S2)應該是addToSet([H|T], S, S2)。實際上,您正在匹配包含HT的列表,而不是包含頭H和尾部T的列表。看起來只是一個錯字。

+0

哇......太尷尬了。我發誓我盯着這件事一個多小時,認爲它必須是一個簡單的錯字。不能相信我錯過了這一點。非常感謝! – The111

+0

發生在我們身上。 :) – Ben