假设我有一个ListSum列表,我想递归地向ListSum追加一个新列表,比如
appList(ListSum):-
%%generate a list: ListTemp,
append(ListTemp,ListSum,ListSum),
appList(ListSum).
但是附加(ListTemp,ListSum,ListSum)没有按照我想要的方式工作。
任何人都可以帮助我吗?
干杯
答案 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).