2013-12-08 87 views
1

我想要做什麼: 我想寫一個尾遞歸Prolog程序,它搜索最長的遞增序列的整數列表並保存開始和結束此子列表的索引。尋找一個滿足特定條件的子列表和一個尾遞歸的Prolog程序

例如

?- longest_asc_sublist([1,2,3,2,8,4,7,8,10,11,7,-1],From,To). 
From = 6, 
To = 10. 

什麼我這麼遠,什麼我的問題是: 基本上我試圖實現一個算法通過它的僞代碼,會做正是我需要的,但我的問題是,我不能似乎要弄清楚如何可以使這項工作if語句,沒有「其他」下他們,在他們的聲明中多次行動或做沒有如果是

longest_asc_sublist(List,_,_) :- longest_asc_sublist(List,1,1,1,0,1,1). 
longest_asc_sublist([],V,K,K,_,V,_). 
longest_asc_sublist([X,Xs|Xss],_,_,K,T,V,M) :- 

          K1 is K+1, T1 is T+1, 

          Xs < X, !,   % this would be an if condition 
          T1 is 1, V1 is K, % and this the statement 

          T1 > M, !,      % 2.if condition 
          M1 is T1, To1 is K, From1 is V, % statement 

          longest_asc_sublist(Xss,To1,From1,K1,T1,V1,M1). 

我最大的問題是,我不能讓他走在「Xs < X」之後,只要它的計算結果爲false,程序就會終止並返回false。

所以我的2個問題是:

我如何才能讓當「兩個X < X」是假的不終止這一計劃?

是否有實現這些,如果是這樣的?:

(Xs < X -> 
(T1 is 1, V1 is K)), 

沒有它導致終止,如果計算結果爲假的方法嗎?

回答

1

最簡單的答案,沒有進入你的代碼,就是:

( condition 
-> if condition is true 
) 

等同於:

( condition 
-> if condition is true 
; false 
) 

(因爲你已經注意到自己)

什麼你可能需要是:

( condition 
-> if condition is true 
; true 
) 

if-else then-else if-then...看起來是這樣的:

( if 
-> then 
; else if 
-> then 
    % and so on 
) 

,另外兩個if年代後對方,當然,

( if 
-> then 
; true 
), 
( if 
-> then 
; true 
) 

而現在有關is:如果你真的想簡單統一的變量與另一個,你不能簡單地使用相同的變量名,那麼你應該統一明確,然後直接做它,使用=

T1 = 1 
+0

謝謝,這真的幫了我,我不知道我可以說:其他的真實。我仍然試圖找出如何在遞歸調用之前管理所有變量,但我應該可以自己管理^^ – sLeitner

+0

非常感謝您的幫助!我必須承認,我不明白'is'和'='之間的區別,因爲'='運算符不允許我更改已經有值的變量,就像'is'運算符一樣,但是我設法通過將這些if語句翻譯爲子句並使用額外變量來解決問題,因爲在我的情況下,如果塊更改不同的變量,那麼我的else語句現在只需將相同的值分配給新變量,例如T3就是T1。 – sLeitner

+1

@elefish,'is'運算符在左邊實例化一個單一的變量,右邊是一個計算出來的完全實例化的表達式。例如,'Y = 12,Z = 2,X是Y + 2 * Z.'將用'16'實例化'X'。如果'Y'或'Z'沒有實例化,就會發生錯誤。 '='運算符試圖將兩邊實例化爲相同的項並且不計算表達式。所以'Y = 12,Z = 2,X = Y + 2 * Z'將導致'X = 12 + 2 * 2'(等價於X = +(12,*(2,2))' 。 – lurker