2011-09-05 40 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