2016-06-29 51 views
2

我試圖定義函數int(?X)在序言這是一個非零整數發生器,它是這樣工作的非零整數的列表:試圖生成的Prolog

?- int(X). X = 1 ; X = -1 ; X = 2 ; X = -2 ; 

我嘗試以下沒有運氣:

int(X):- positives(Y), Y is abs(X). 

positives(1). 
positives(X):- positives(Y), X is Y+1. 

,但我發現了以下錯誤:

ERROR: is/2: Arguments are not sufficiently instantiated 

我如何可一個做這項工作?謝謝!

+2

請保留與解決您的問題相關的標籤。這些標籤旨在幫助**其他讀者**找到與他們正在尋找的主題相關的答案,而不是反映教師的非感性要求!我已經恢復了[tag:clpfd]標籤,因爲使用CLP(FD)約束擺脫了[tag:instantiation-error]這是你的問題和其他許多人在stackoverflow上的核心問題。這是因爲教師目前仍然在30年前教Prolog,隨着時間的推移,這些問題將通過將他們指向聲明性解決方案來解決。 – mat

回答

4

有一種簡單的方法來查找和糾正這些問題。

  1. 步驟一:把限制在你的程序。要做到這一點,只需由CLP(FD) 約束  (#=)/2,如更換(is)/2

    int(X) :- positives(Y), Y #= abs(X). 
    
    positives(1). 
    positives(X):- positives(Y), X #= Y+1. 
    
  2. 步驟二:查詢現在完成沒有錯誤,並顯示你你所描述的:

    ?- int(X). 
    X in -1\/1 ; 
    X in -2\/2 ; 
    X in -3\/3 ; 
    X in -4\/4 . 
    

    所以,從上面的,你看,你所描述的是不 足夠獲得地面解決方案:你們的關係還有一定程度的自由。

  3. 第三步:要真正解決問題,我們會考慮我們實際上想要描述的內容。這裏是一個開始:

    int(X) :- positives(Y), (X #= Y ; X #= -Y). 
    
  4. 第四步:我們嘗試一下:

    ?- int(X). 
    X = 1 ; 
    X = -1 ; 
    X = 2 ; 
    X = -2 ; 
    X = 3 ; 
    etc. 
    

似乎工作OK,除了一個事實,即自然 數實際上從不消極。我留下修正你的問題的標題和你描述爲 你的關係之間的差異。

TL; DR:當在整數推理,使用系統的CLP(FD) 約束,然後把它從 那裏。


我假設你已經把:- use_module(library(clpfd)).某處你的初始文件,這樣就可以在所有的程序中使用CLP(FD)的約束。

+0

這是一個很好的解決方案,但我需要一個不使用clpfd或任何其他庫。沒有必要使用我的代碼並嘗試修復它。我可以接受與我寫的完全不同的解決方案。 –

+4

爲了滿足對1970式解決方案的渴望,您可以簡單地執行步驟1:在我們找到的解決方案中用'(is)/ 2'替換'(#=)/ 2',*voilà*,無意義的要求被實現了! – mat

+0

非常好,工作正常。謝謝! –