2014-02-28 168 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與否值失敗。