2012-08-17 24 views
2

這個問題要求我編寫一個謂詞seqList(N, L),當L是列表[f0, . . . , fN]時,這是滿足的。序言 - 序列從f0到fN的列表

fN = fN-1 + fN-2 + fN-3

我的代碼是給定一個列表的頭部進行比較,進行比較時將返回true或false。

seqList(_,[]). 
seqList(N,[H|T]) :- 
    N1 is N - 1, 
    seq(N,H), 
    seqList(N1,T). 

然而,僅當有效的值被反轉,例如 seqList(3,[1,1,0,0])將返回true,但該列表應返回爲true, seqList(3,[0,0,1,1])。有什麼方法可以讓我扭轉列表並驗證它是否正確?

+1

你的謂詞的定義對我來說還不清楚。另外,你應該添加你的seq謂詞,在這裏你沒有所有的代碼。 – m09 2012-08-17 07:07:59

+0

是否被禁止使用[reverse](http://www.swi-prolog.org/pldoc/doc_for?object=reverse/2)/ 2? – CapelliC 2012-08-17 08:25:33

+0

現在還不清楚@Mog,我現在不在家,所有這些細節都會很快上傳給你。那麼,只要我能完成這項工作,我就可以使用任何東西,無論如何,使用反向會導致我的列表在每次遞歸到基本情況時都會繼續翻轉。@ chac – 2012-08-18 13:18:32

回答

3

看來,要生成一個序列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). 

就是這樣。謂詞是您的解決方案。將它重命名爲您喜歡的。