假设我想解决SWI-Prolog中列表的总和。最明显的解决方案是采用以下形式:
sum([],0).
sum([H|T],S) :- sum(T, SofT), S is SofT + H.
它完全按预期工作。
但是,出于好奇,我决定改写这个问题,说我们需要找到一个和,以使尾部的总和等于头部的总和。数学上应该是同一件事,尽管可能不那么自然。我把它写成
sum2([],0).
sum2([H|T],S) :- sum2(T, S-H).
然后我用一个非常简单的测试用例执行查询并获得结果:
?- sum([1], S).
S = 1.
?- sum2([1], S).
false.
SWI-Prolog似乎无法将解决方案回溯到sum2,我想知道为什么会这样。我实际上有一种直觉,感觉事情可能会那样下去,但是我仍然不确定这里到底发生了什么。我运行了一个示踪剂,但没有发现输出非常令人启发。我是Prolog的新手,所以我怀疑这个问题可能是愚蠢的或暗示我有一些可怕的误解。
任何解释将不胜感激,谢谢!
答案 0 :(得分:2)
根据this tutorial
给定两个术语 T1 和 T2 ,它们将被统一:
所以当您运行
?- sum2([1], S).
它已经运行
sum2([],S-1)
已与
统一sum2([],0)
它将将S-1统一为0,其中0和1是常数,而S是变量。
但是S-1既不是常数也不是变量,所以失败了。