Recursion swi prolog奇怪递归写入
我有一个类似的递归函数:Recursion swi prolog奇怪递归写入,recursion,prolog,Recursion,Prolog,我有一个类似的递归函数: fillTable(X0,Y0,Yn,Yh):- checkPoint(X0,Y0), Ynext = Y0+Yh, Ynext=<Yn, fillTable(X0,Ynext,Yn,Yh). checkPoint(X,Y):- (-X-1)<Y, X<0, Y<0, write(X), writeq(' '), write(Y),write(' in 1 area'), nl,
fillTable(X0,Y0,Yn,Yh):-
checkPoint(X0,Y0),
Ynext = Y0+Yh,
Ynext=<Yn,
fillTable(X0,Ynext,Yn,Yh).
checkPoint(X,Y):-
(-X-1)<Y,
X<0, Y<0,
write(X), writeq(' '), write(Y),write(' in 1 area'),
nl,
!
;
(-X+1)>Y, X>0, Y>0,
write(X),write(' '), write(Y),write(' in 2 area'),
nl,
!
;
write(X),write(' '),write(Y),write(' not in area'),nl.
fillTable(X0,Y0,Yn,Yh):-
检查点(X0,Y0),
Ynext=Y0+Yh,
Ynext=在Prolog中,这是一个常见的初学者将“统一”与“赋值”混淆的问题
你的表情:
Ynext = Y0+Yh,
(-X+1)>Y
不将Y0+Yh
的值分配给变量Ynext
。谓词=/2
是统一谓词,它将接受两侧的表达式并统一它们。这些表达式是Ynext
,一个变量和Y0+Yh
,后者是应用于两个其他变量的函子+/2
(在您的例子中,这两个变量是实例化的)。换句话说,它将Ynext
与+(Y0,Yh)
统一起来,并且不计算它
假设Y0
实例化为-1
和Yh
实例化为0.2
。那么,上面的统一表达式将是:
Ynext = -1+0.2,
这将导致Ynext
具有值-1+0.2
(在prolog中,该值与+(-1,0.2)
相同)
如果要计算算术表达式并分配它,可以使用is/2
:
Ynext is Y0 + Yh,
请注意,不等式/2
等会进行计算。因此表达式:
Ynext = Y0+Yh,
(-X+1)>Y
将执行您期望的操作,即成功或失败取决于算术表达式(-X+1)
的值是否小于Y
的值