2009-11-17 40 views
0

Q.鑑於[1,2,3]在Prolog中取回[6,5,3]通過逆積累鑑於[1,2,3]在序言取回[6,5,3]通過逆accumalation

我有開始代碼:

accumalate([H],[H]). 
accumalate([H1 | H2], [Hnew, H2]), 
     Hnew is H1 + H2. 

....

我要找基本Prolog的解決方案。

+1

這是功課?如果是這樣,請標記爲。 – Stephan202 2009-11-17 22:41:02

+0

此外,適當的詞是「積累」。你能告訴我們你到目前爲止所嘗試過的嗎?具體來說,你不明白? – Stephan202 2009-11-17 22:44:51

+1

沒有不作業,只是學習筆記,它是我被卡住的一個例子,更多的修訂。 – Dan 2009-11-17 22:47:29

回答

3

我們不是在這裏爲你做你的功課。所以我們能做的最好的就是提供一些提示。所以問自己這些問題:

  1. 這裏的基本情況是什麼(哪些輸入是即時輸出)?
    • 你有accumulate([N], [N]).,但對於空列表?
  2. 在一定的增加進行什麼樣的順序?
  3. 更具體地說,必須先添加哪些元素?

除此之外,我可以告訴你,你可以用三個子句解決這個問題。不需要其他謂詞。祝你好運!

獎金:你可能要定義的遞歸條款的頭如下:

accumulate([N|T], [N1,N2|T2]). 
+0

好了,感謝您的提示(很多幫助,因爲我想我是缺少謂語),應該保持我的忙一段時間:) – Dan 2009-11-17 22:55:56

+0

真棒,謝謝 – Dan 2009-11-17 23:10:32

0

一旦你完成了基本實現完成後,嘗試爲O解決這個問題(n)的時間。這個想法是從第一個元素開始,並繼續添加到第二個列表,直到您的原始列表爲空。輔助列表是您需要的反向列表。

如果附加在你的遞歸步驟的兩個列表,你會最終有一個O(N^2)複雜性。

1

這是我的看法:

accumulate([],[]). 
accumulate([H|T], [H1|T1]):- 
    sum([H|T],H1), 
    accumulate(T,T1). 
sum([],0). 
sum([H|T],Y):- 
    sum(T,Y1), 
    Y is H + Y1. 

當然你也可以使用內置的sumlist/2代替手工製作sum/2如果你喜歡的。

0
ac([], 0, []). 

    ac([H|T], ST, [ST|Res]) :- 
     ac(T, X, Res), 
     ST is H + X. 

    accum(List, Res) :- 
     ac(List, _, Res). 

[trace] ?- accum([1,2,3], X). 
    Call: (6) accum([1, 2, 3], _G376) ? creep 
    Call: (7) ac([1, 2, 3], _G458, _G376) ? creep 
    Call: (8) ac([2, 3], _G461, _G454) ? creep 
    Call: (9) ac([3], _G464, _G457) ? creep 
    Call: (10) ac([], _G467, _G460) ? creep 
    Exit: (10) ac([], 0, []) ? creep 
    Call: (10) _G459 is 3+0 ? creep 
    Exit: (10) 3 is 3+0 ? creep 
    Exit: (9) ac([3], 3, [3]) ? creep 
    Call: (9) _G456 is 2+3 ? creep 
    Exit: (9) 5 is 2+3 ? creep 
    Exit: (8) ac([2, 3], 5, [5, 3]) ? creep 
    Call: (8) _G453 is 1+5 ? creep 
    Exit: (8) 6 is 1+5 ? creep 
    Exit: (7) ac([1, 2, 3], 6, [6, 5, 3]) ? creep 
    Exit: (6) accum([1, 2, 3], [6, 5, 3]) ? creep 
X = [6, 5, 3].