У вас есть опечатка в вашем правиле 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
, которая равна 70как вы говорите, вам нужно будет добавить 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).