2014-12-06 49 views
0

我試圖創建一個程序,其中給定N,我需要Q = 0 ... N。序言:獲取值從0到K - 1

因此,如果給定的N = 1:Q = 0。如果給定N = 5:Q = 0,Q = 1,...,Q = 4

我嘗試到目前爲止:

values(N,Q) :- values_helper(0,N,Q). 

values_helper(N, N, Q). 
values_helper(X,N,Q) :- X0 is X + 1, X0 < N, values_helper(X0,N,X0). 

我的邏輯是我增加X直到它達到N的值,此時程序停止。但是,我沒有得到Q的任何綁定,只是一個空集。我也知道,我忽略停在N - 1。

編輯:修正含糊不清的描述。

回答

1

這兩個values_helper子句都不符合您的期望。如果前兩個參數相同,則第一個成功,並且不對Q強加任何約束。實際上,您希望Q被設置爲等於第一個參數,只要它小於第二個參數:

values_helper(Q, N, Q) :- Q < N. 

在第二個條款中,你再也不使用Q了。遞歸調用應該是values_helper(X0, N, Q),得到:

values_helper(X, N, Q) :- X0 is X + 1, X0 < N, values_helper(X0, N, Q). 

這些子句得到預期的輸出:

?- values(5,Q).               
Q = 0 ? ; 
Q = 1 ? ; 
Q = 2 ? ; 
Q = 3 ? ; 
Q = 4 ? ; 
no  

注意,對任意n < = 0時,該結束沒有發現對於Q的任何值,這是我相信是預期的行爲。

+0

所有這一切都有道理。謝謝! – user2962883 2014-12-06 06:58:23