2015-04-05 45 views
1

我正在編寫一個prolog程序,並且遇到以下問題:我已經定義了謂詞鄰居(+,+,+,+,?),如下所示:Prolog錯誤:未定義的過程,<=涉及

neighbors(X, Y, Height, Width, Neighbors):- 
    Xup is X-1, 
    Xdown is X+1, 
    Yleft is Y-1, 
    Yright is Y+1, 
    findall((A,B,C),(
      between(Xup, Xdown, A), 
      between(Yleft, Yright, B), 
      A>=1, 
      B>=1), 
      Neighbors). 

現在查詢鄰居(5,5,5,5,X)按預期工作,統一X與它的鄰居列表,即

X = [ (4, 4, _G2809), (4, 5, _G2800), (4, 6, _G2791), (5, 4, _G2782), (5, 5, _G2773), (5, 6, _G2764), (6, 4, _G2755), (6, ..., ...), (..., ...)] . 

然而,當我嘗試出現問題添加以下幾行到我的findall目標:

A<=Height, 
B<=Width 

全謂詞是這樣的:

neighbors(X, Y, Height, Width, Neighbors):- 
    Xup is X-1, 
    Xdown is X+1, 
    Yleft is Y-1, 
    Yright is Y+1, 
    findall((A,B,C),(
      between(Xup, Xdown, A), 
      between(Yleft, Yright, B), 
      A>=1, 
      B>=1, 
      A<=Height, 
      B<=Width 
      ), 
      Neighbors). 

現在同樣的查詢,鄰居(5,5,5,5,X)。導致我得到以下錯誤:

ERROR: Undefined procedure: neighbors/5 
ERROR:  However, there are definitions for: 
ERROR:   neighbor/2 
ERROR:   neighbors/2 
false. 

可能是什麼原因?我想這是與我比較這些變量的方式有關,但由於寬度和高度被實例化,我認爲這應該工作。謝謝。

回答

1

問題出在你的比較操作符上。小於或等於運算符的語法是=</2。所以你的目標應該是:

... 
A=<Height, 
B=<Width 
... 
+0

它實際上是另一種方式,> =,但這確實是問題,謝謝! – Marcin 2015-04-05 21:04:33

+0

@Marcin你確定嗎?你已經有兩個條件'> =/2',爲什麼你使用相同的運算符再次比較相同的變量(A和B)?,這將是多餘的。 – Yasel 2015-04-05 21:08:37

+0

我試圖找到從1到垂直高度和1到水平寬度編號的網格上的字段(A,B)的鄰居,因此,我希望x> 1且<=高度,並且y要> = 1和<=寬度。 編輯:其實= <非常好,我很抱歉我誤讀了。 – Marcin 2015-04-05 21:13:43