2011-05-10 19 views
4

我試圖在Prolog中實現一個簡單的常見差異算法(http://www.purplemath.com/modules/nextnumb.htm)(我很新),我似乎無法制定正確的規則。 我:Prolog常見差異,多項式序列中的下一個數

nextitem([A|B], NextI):-lastitem([A|B],X), 
rowbelow([A|B],[Z]),lastitem([Z],Y), nextI is X+Y. 
nextitem([],0). 

%% recursive case: ignore first item, seek last item of rest of list 
lastitem([First | Rest], Last) :-lastitem(Rest, Last). 
lastitem([OnlyOne], OnlyOne). 

%%at least two things in the list 
rowbelow([A,B|T], [X|Y]) :-X is B-A, rowbelow([B|T],Y). 
rowbelow([A,B|T], [X]) :-X is B-A. 

的問題似乎是在我的下一個項目,(和感覺我應該有下一個項目遞歸調用的地方,但也許不是?)

例如: rowbelow([6,7,14,33],X)。 產生適當的[1,7,19](對於聚的x^3 + 6)

但下一個項目中不產生70 ..

跟蹤好像我的行下面呼叫中的下一項是錯誤,我想我錯過了一個遞歸調用,以繼續移動到該行...

任何想法如何解決nextitem規則?真的很感謝任何幫助,因爲我可能在這20小時,它並沒有'只是點擊'尚未...

+0

我沒有得到你想要在這裏計算。但是這裏有一些注意事項:nextI在nextitem中拼寫錯誤(它應該是NextI)。它也似乎是,當你調用rowrowow它應該是rowbelow([A | B],Z),而不是rowbelow([A | B],[Z])。 rowbelow的第二個子句我認爲應該是rowbelow([_],[]),因爲它是基本的情況 – gusbro 2011-05-10 16:16:20

回答

3

你有一個錯字在你的nextitem規則,NextI應區分大小寫,你有它如定義中的nextI。另外,你是否需要[Z]rowbelow的結果列表中的那個操作數的列表括號,所以它們是不需要的。所以,你最終用:

nextitem([A|B], NextI):-lastitem([A|B],X), 
rowbelow([A|B],Z),lastitem(Z,Y), NextI is X+Y. 
nextitem([],0). 

有了到位,nextitem([6,7,14,33],X)結果X = 52,這是就會叫你在的地方邏輯給出。

要跟蹤通過:

  • lastitem([6,7,14,33],X)將使X = 33
  • rowbelow([6,7,14,33], Z)會給Z = [1,7,19]爲你的國家
  • lastitem([1,7,19],Y)使得Y = 19
  • NextI is 33+19NextI = 52

您只是評估第一級別的差異,爲了獲得x^3 + 6的序列中的下一個條目,如您所說,它是70,您需要將37添加到之前的值(33),即之前的值相差19,再加上18,由下面的水平nextitem給出,這將是[6,12]

目標是遞歸定義,正如示例網站顯示的那樣,有必要降低差異恆定的水平。

Difference example, purplemath.com

在你的情況下,越來越下降到一個一致的6

重新定義你的nextitem規則來處理rowbelow返回的列表將產生你的願望是什麼,還需要對單的附加規則名單,因爲你沒有涵蓋這種可能性。

nextitem([A|B], NextI):-lastitem([A|B],X), rowbelow([A|B],Z), nextitem(Z,Y), NextI is X+Y. 
nextitem([A],A). 
nextitem([],0).