看來,要生成一個序列f
,從而f(N) = f(N-1) + f(N-2) + f(N-3)
其中f(X)
的N
元素是序列表的X
個元素,0
基。三個起始元素也必須作爲規範的一部分進行預設。你似乎開始於[0,0,1, ...]
。
使用的方法從Lazy lists in Prolog?:
seqList(N,L):- N >= 3, !,
L=[0,0,1|X], N3 is N-3, take(N3, seq(0,0,1), X-[], _).
next(seq(A,B,C), D, seq(B,C,D)):- D is A+B+C.
現在,所有這些功能都可以融合和內聯,在一個遞歸定義到達。
但你可以直接做。您只需寫下問題,即可獲得解決方案。
question(N,L):-
既然你下手0,0,1,... 把它寫下來:
L = [0, 0, 1 | X],
因爲這三個要素中給出,我們只需要找出N-3
更多。 把它寫下來:
N3 is N-3,
您現在已經有所降低的問題。您現在需要找到N-3
元素並將它們放入X
列表中。使用一個工作人員謂詞。它還必須在每一步知道前三個數字:
worker(N3, 0, 0, 1, X).
所以才寫下什麼工人必須知道:
worker(N, A, B, C, X):-
如果N
是0,我們必須停止。 X
然後是一個空的列表。 寫下來。
N = 0, X = [] .
增加一個條款,因爲當N
大於0。
worker(N, A, B, C, X):-
N > 0,
我們知道下一個元素是前三個數字的總和。 寫下來。
D is A + B + C,
列表中的下一個元素是我們參數列表(最後一個參數)的頂部元素。 把它寫下來:
X = [D | X2 ],
現在有一個添加量少的元素。 把它寫下來:
N2 is N - 1,
要查找列表的其餘部分,最後三個數字是B, C,
和D
。然後剩下的就是worker
以完全相同的方式發現:
worker(N2, B, C, D, X2).
就是這樣。謂詞是您的解決方案。將它重命名爲您喜歡的。
你的謂詞的定義對我來說還不清楚。另外,你應該添加你的seq謂詞,在這裏你沒有所有的代碼。 – m09 2012-08-17 07:07:59
是否被禁止使用[reverse](http://www.swi-prolog.org/pldoc/doc_for?object=reverse/2)/ 2? – CapelliC 2012-08-17 08:25:33
現在還不清楚@Mog,我現在不在家,所有這些細節都會很快上傳給你。那麼,只要我能完成這項工作,我就可以使用任何東西,無論如何,使用反向會導致我的列表在每次遞歸到基本情況時都會繼續翻轉。@ chac – 2012-08-18 13:18:32