我正在尝试在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小时了,它还没有'刚刚点击'......
答案 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]
。
目标是递归定义,如示例网站所示,有必要降低到差异不变的水平。
在你的情况下,得到一致的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).