为什么以下函数不能用于递归附加到swi prolog中的列表?

时间:2013-05-08 12:36:57

标签: prolog

我有一个列表L,我需要将每个元素拆分成一个单独的列表并再次将它们附加在一起。这是我为此制作的代码。

split([],[]).
split([H|T],Ls):-split(T,Ls),splist(H,[]).
make(Val,[H1|List],[H1|Res]):- make(Val,List,Res). make(Val, List,[Val|List]).
splist(H,L2):- make(Sum,[],L1),append(L1,L2,NewL).

当我使用这段代码时,L的每个元素以递归方式从split()传递到splist(),并通过make()生成一个单元素的列表L1。我需要附加以保持连接L1和L2。但事实并非如此

例如,我有L = [1,2,3]。现在我需要完成以下过程。

H = 1,L1 = [1],L2 = [1]。接下来H = 2,L1 = [2],L2 = [1,2]。接着,H = 3,L1 = [3],L2 = [1,2,3]。

我需要如上所述的输出,但这是我的代码所做的。

H = 1,L1 = [1],L2 = [1]。接下来H = 2,L1 = [2],L2 = [2]。接下来H = 3,L1 = [3],L2 = [3]。

1 个答案:

答案 0 :(得分:1)

我的代码无法理解。 make定义不完整。原样,它什么都不做,然后失败。

您的split相当于split(X,[]):- reverse(X,R), maplist(spl([]),R). spl(B,A):-splist(A,B).,即它为输入列表splist(H,[])的每个元素H尝试X,向后看,看它是否失败 - 这是唯一的结果,因为论证是固定的 - H[]

命名你的谓词splitsplist是一个非常糟糕的主意 - 我们人类将这些词与其开头区分开来,并且这些名称中唯一不同的字母隐藏在远离终点的位置。 IOW这两个名字非常相似,很容易误读和错误输入。

最后,对于splist(H,L2):- make(Sum,[],L1),append(L1,L2,NewL).,由于make cn只会失败,因此splist也会失败。但是即使makeL1中凭空创造了一些内容 - Sum开始未经实例化的思考你 - 它对L2有什么看法?它可以附加到列表L1?任何列表都可以附加到任何其他列表,说没有任何内容。

?? :)