我尝试做一些练习 - 用“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.
当我查询添加时,它会写出正确的答案,但提示不会回来。 有什么问题?
答案 0 :(得分:4)
如果给出了所有三个参数,那么add/3
的定义可以正常工作,并且也会终止。如果将其中一个作为变量保留,则其中一个目标s2int(XYZ, SXYZ)
将两个未实例化的变量作为参数。因此它描述了一个无限大的集合,其完整的枚举需要无限长的时间。
不确定您的目标是什么,但可能您想为继任者算术定义add/3
。你可以这样做,而不需要求助于0,1,2整数!试试吧!否则搜索successor-arithmetics。