Пролог: общие различия, следующее число в полиномиальной последовательности - PullRequest
4 голосов
/ 10 мая 2011

Я пытаюсь реализовать простой алгоритм для общих различий (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] (для поли х ^ 3 + 6)

, но следующий элемент не производит 70 ..

Трассировка выглядит так, как будто мой вызов строки ниже в следующем элементе неверен, и я думаю, что мне не хватает рекурсивного вызова для продолжения перехода к строке ...

Есть идеи, как исправить правила следующего элемента ??Очень ценю любую помощь, так как я, вероятно, уже 20 часов на это, и она еще не «просто нажала» ...

1 Ответ

3 голосов
/ 10 мая 2011

У вас есть опечатка в вашем правиле 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].

Цель - рекурсивное определение. Как показывает пример веб-сайта, необходимо опуститься до уровня, на котором разница постоянна.

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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...