Prolog:为自己附上一份清单

时间:2011-09-06 04:04:19

标签: prolog

假设我有一个ListSum列表,我想递归地向ListSum追加一个新列表,比如

appList(ListSum):-
    %%generate a list: ListTemp,
    append(ListTemp,ListSum,ListSum),
    appList(ListSum).

但是附加(ListTemp,ListSum,ListSum)没有按照我想要的方式工作。

任何人都可以帮助我吗?

干杯

2 个答案:

答案 0 :(得分:2)

您必须了解统一的概念(或实际上在Prolog中实现的“匹配”)。您不能将两个或多个值绑定到同一个变量。 Prolog中的变量一旦匹配,它的价值就会持续到最终目标,或者在某个地方失败。之后,如果有更多可能性,那么变量将使用另一个值重新实例化,依此类推。

例如,如果我查询appList([]),那么将测试append以匹配为:

append(ListTemp,[],[])

如果ListTemp不是空列表,则该子句将失败,因为append的语义是“将第一个参数附加到第二个,两个都是列表,导致第三个”。对appList(ListSum)的递归调用将被称为appList([]),因为ListSum先前与[]匹配,导致无限递归(幸运的是,如果ListTemp不是[],则不会达到此值)。

子句中必须有两个参数,其中一个是原始列表,另一个是结果列表。 append的前两个参数是ListSum和ListTemp(取决于你想要的附加顺序),而第三个是结果列表。完成,不需要递归。

答案 1 :(得分:0)

这是一个非递归解决方案,不确定为什么你甚至需要递归:

appself(L,X) :- append(L,L,X).