2014-02-28 136 views
1

我有一个类似的递归函数:SWI-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, 
    ! 
    ; 
    (-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. 

其中X,Y和其他变种的是float,但是当它是由write()写的,它打印-1+0.2+0.2+0.2+...-0.8, -0.6或其他。

我该如何解决?

回答

2

在Prolog中,这是一个常见的初学者问题,将“统一”与“分配”混为一谈。

你的表达:

Ynext = Y0+Yh, 

分配Y0+Yh值的变量Ynext。谓词=/2是统一谓词,它将把双方的表达式统一起来。这些表达式是Ynext,一个变量,和Y0+Yh,它是应用于其他两个变量(在您的情况下,被实例化)的函子+/2。换句话说,它统一Ynext+(Y0,Yh)并不评估它。

让我们假设你有Y0实例化为-1Yh0.2。然后,上面的统一表达将是:

Ynext = -1+0.2, 

这将导致在Ynext具有价值-1+0.2(这是在序言中,同为+(-1,0.2)

如果要评估算术表达式和分配给它,你会使用is/2

Ynext is Y0 + Yh, 

注意,不平等</2>/2等做评估所以表达式:

(-X+1)>Y 

会做你指望它有什么,这是成功还是取决于算术表达式(-X+1)的值是否小于Y与否值失败。