2013-02-14 101 views
1

如何在Prolog中從起始編號到結束編號​​找到序列。我的功能看起來應該開始結束編號

findSequence(-4,-6,Z)---> Z=-4;Z=-5;Z=-6 
+0

我寫了以下兩行,如果我跟蹤它正在按照我的預期行進,但它正在打印最終值:
2013-02-14 16:59:07

+0

以下兩行在哪裏? – 2013-02-14 17:02:57

+0

@DanieLyons和Alejandro:我寫了下面的findSequence(X,X,X)。 findSequence(X,Y,Z):-Y> X,X1是X + 1,findSequence(X1,Y,Z)。這裏的問題是印刷最終的價值。我想在遞歸中爲每個X的值打印它。 – 2013-02-14 17:06:14

回答

2

這裏頭腦簡單的程序

findSequence(N, N, N) :- !. 
findSequence(S, E, N) :- 
    S < E, (N = S ; T is S + 1, findSequence(T, E, N)). 
findSequence(S, E, N) :- 
    S > E, (N = S ; T is S - 1, findSequence(T, E, N)). 

對於任何實際用途,你應該檢查是否between/3可以工作。

+0

完美答案。 – 2013-02-15 02:11:49

0

考慮使用中,你積累了遞歸謂詞(列表中的)值從起始值(-4),以最終值(-6)。

0

這應該工作。這考慮到從< =到。

?-findSequence(1,3,List). 
List=[1,2,3]. 
yes 
+0

' - findSequence(-4,-6,S).'循環。 – false 2013-02-14 14:09:42

+0

這裏的問題是-4> -6 ...如果您想要反向操作,請將+ 1更改爲From-1。所以調用它的正確方法是:findSequence(-6,-4,S)。 – Alejandro 2013-02-14 14:15:34

+0

問題是您對切割的不正確使用。嘗試'findSequence(1,3,[_,_,_,_ | _])'應該失敗。對於'-4','-6'或者失敗(如果你限制自己)或者預期成功。但不能循環。 – false 2013-02-14 14:23:55

0

這是什麼你問是不是特別難一個有趣的情況:如果你想檢查是否

findSequence(X,X,[X]):-!. 
findSequence(From,To,[From|Rest]):-SuccFrom is From +1, findSequence(SuccFrom ,To, Rest). 

這返回一個列表,即稍微複雜一些可以寫成但是你設法以這樣一種迂迴的方式來問它,我們花了很多時間試圖弄清楚你想要什麼。你根本不需要一個序列(即一個列表),你需要連續的答案。而且你希望它能夠處理所有的整數,而不僅僅是自然數 - 這在你的例子中是隱含的,但沒有說明。另外,你的例子並不適用於天真的解決方案,因爲-4大於-6,這與通常寫入該謂詞的方式相反。

爲了應對這一切,我在信心最簡單的事情,需要圖書館clpfd

:- use_module(library(clpfd)). 

我們需要一些幫助的謂詞:

min(X, Y, Z) :- X < Y -> Z = X ; Z = Y. 
max(X, Y, Z) :- X < Y -> Z = Y ; Z = X. 

這些只是找到最小值和最大值;我通常會每行寫兩行,但這樣更方便。現在的解決方案:

findSequence(X, Y, Z) :- 
    min(X, Y, Low), 
    max(X, Y, High), 
    Z in Low..High, 
    label([Z]). 

這照顧你的用例和明顯的。

相關問題