2010-11-22 61 views
3

蓄電池Prolog的,我試圖解決以下問題,用蓄電池:問題在序言

寫謂詞addone2 /它的第一個參數是整數列表,並且其第二個參數是通過將第一個列表中的每個整數加1得到的整數列表。例如,查詢

 addone([1,2,7,2],X). 

應該給

 X = [2,3,8,3]. 

我創建了下面的代碼:

addone([], _). 
addone([E|Tail], [R|Rs]) :- 
    NewE is E+1, 
    append([R|Rs], [NewE], NewRs), 
    addone(Tail, NewRs). 

但它不工作。有人能告訴我爲什麼嗎?那麼,如何在Prolog中使用累加器呢?

謝謝!爲了NewRs

回答

4

Anthares旅館連接是,你必須優化您的基本情況是正確的。但是,您也可以通過撥打append來降低效率。在Prolog中,需要一些時間來適應統一的力量,但是例如,在這種情況下,它可以幫助您立即設置結果列表。請嘗試以下操作:

addone([E|Tail], [E1|Rs]) :- 
    E1 is E+1, 
    addone(Tail, Rs). 

這就是它的全部。通過立即將E1置於第二個參數的模式中,您已經創建了結果列表的第一個元素。其餘元素Rs將在遞歸期間創建。一個非常典型的Prolog模式。

+0

謝謝你的幫助弗蘭克!沒有使用列表追加現在沒有關於那個「竅門」。還要感謝anthares糾正我的基本情況! – 2010-11-22 09:06:39

+0

謝謝弗蘭克!這個技巧根本不明顯,非常方便! – ProfVersaggi 2012-03-21 11:43:01

1

你遞歸的底部應addone([],[]).與[]