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
的值