Prolog公共差异,多项式序列中的下一个数字

时间:2011-05-10 15:29:29

标签: math prolog

我正在尝试在Prolog中实现一个简单的常见差异算法(http://www.purplemath.com/modules/nextnumb.htm)(我很新),我似乎遇到了麻烦正确的规则。  我有:

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](对于poly x ^ 3 + 6)

但是下一个项目不会产生70 ..

跟踪看起来像下一个项目下面的行调用是错误的,我想我错过了一个递归调用以继续移动到行...

任何想法如何修复nextitem规则?非常感谢任何帮助,因为我可能已经20小时了,它还没有'刚刚点击'......

1 个答案:

答案 0 :(得分: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+19提供NextI = 52

您只是评估第一级别的差异,为了获得x^3 + 6序列中的下一个条目,如您所说的那样,您需要将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).