提示不回来

时间:2015-01-07 00:12:30

标签: prolog successor-arithmetics non-termination

我尝试做一些练习 - 用“s表示”表示数字,这意味着'0'为零,s(0)为1,s(s(0))为2,依此类推。 我试着写谓词来添加“数字”: 谓词s2int将“s number”转换为int。

s2int(0, 0).
s2int(s(X), Y) :-
   s2int(X, Y1),
   Y is 1 + Y1.

add(X, Y, Z) :-
   s2int(X, SX),
   s2int(Y, SY),
   s2int(Z, SZ),
   SZ is SX + SY.

当我查询添加时,它会写出正确的答案,但提示不会回来。 有什么问题?

1 个答案:

答案 0 :(得分:4)

如果给出了所有三个参数,那么add/3的定义可以正常工作,并且也会终止。如果将其中一个作为变量保留,则其中一个目标s2int(XYZ, SXYZ)将两个未实例化的变量作为参数。因此它描述了一个无限大的集合,其完整的枚举需要无限长的时间。

不确定您的目标是什么,但可能您想为继任者算术定义add/3。你可以这样做,而不需要求助于0,1,2整数!试试吧!否则搜索