为什么当我用相反的短语表达时,Prolog为什么找不到总和?

时间:2018-09-06 18:09:43

标签: prolog

假设我想解决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的新手,所以我怀疑这个问题可能是愚蠢的或暗示我有一些可怕的误解。

任何解释将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:2)

根据this tutorial
给定两个术语 T1 T2 ,它们将被统一:

  • 如果 T1 T2 是常数(即原子或数字),则如果它们相同则成功。否则会失败。
  • 如果 T1 是变量,则将 T1 实例化为 T2
  • 否则,如果 T2 是变量,则将 T2 实例化为 T1
  • 否则,如果 T1 T2 是具有相同Arity(自变量数量)的复杂术语,请找到< strong> T1 和 T2 的主要函子 F2 。如果这些相同,则采用 T1 的有序参数集和 T2 的有序的参数 强>。对于术语中处于同一位置的每对参数 Am Bm Am 必须与 Bm 统一。
  • 否则失败。

所以当您运行

?- sum2([1], S).

它已经运行

sum2([],S-1)

已与

统一
sum2([],0)

它将将S-1统一为0,其中0和1是常数,而S是变量。
但是S-1既不是常数也不是变量,所以失败了。