2012-10-14 84 views
2

我正在嘗試編寫一個遞歸函數,該列表向下傳遞一個列表,並在每個級別向該列表中添加一個元素。最終列表應作爲謂詞的解決方案報告。但我無法弄清楚如何做到這一點。問題的形式基本上是這樣的:使用Prolog中的遞歸創建數據列表

solve(List, NumberOfSteps) :- NumberOfSteps = 10 . //Stops after 10 recursive steps 
solve(List, NumberOfSteps) :- 
    append NumberOfSteps to List, 
    NumberOfStepsIncremented is NumberOfSteps + 1, 
    solve(List, NumberOfStepsIncremented) . 

所以我在這裏,我想打電話給解決(表1),並序言回來,看起來像一個答案:

List = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ; 
true 

我可以讓Prolog創建列表並在最後打印出來。我可以通過使用內置的預測附加(List,NumberOfSteps,List2),然後通過遞歸傳遞List2並在最後打印它來完成此操作,但List和List2在這裏並不統一,Prolog給出的實際答案我是List = []; true

我有一種感覺,我可能會以錯誤的方式接近問題,但我卡住了!

謝謝。

回答

1

我想通了。這是它應該看起來像:

solve(List, NumberOfSteps) :- NumberOfSteps = 10 . //Stops after 10 recursive steps 
solve([LHead | LTail], NumberOfSteps) :- 
    LHead = NumberOfSteps, 
    NumberOfStepsIncremented is NumberOfSteps + 1, 
    solve(LTail, NumberOfStepsIncremented) . 
+0

這裏發生了什麼事時,我試了一下:' ? - 解決(X,3)。 X = [3,4,5,6,7,8,9 | _G335]; (我在這裏按';') 錯誤:(user:// 1:23): 不在全局堆棧中 –

1

我會威爾內斯延長評論你的答案,並會顯示簡單的修正:

solve([NumberOfSteps], NumberOfSteps) :- 
    NumberOfSteps = 10, !. % Stops after 10 recursive steps 
solve([LHead | LTail], NumberOfSteps) :- 
    LHead = NumberOfSteps, 
    NumberOfStepsIncremented is NumberOfSteps + 1, 
    solve(LTail, NumberOfStepsIncremented) . 
+0

這個人還沒有聯機。 :) –