Как использовать backtrack для бесконечного увеличения переменной в Прологе
В настоящее время я читаю книгу по Прологу и застрял на одном из заданий. Я должен создать предикат с одним аргументом. Когда этот аргумент является переменной, он вернет следующее с возвратом, и X продолжит увеличиваться без ограничения.
Х = 0, Х = 1, Х = 2, Х = 3, Х = ...
Ниже я сделал простой предикат, который возвращает 0-2, но я не могу найти способ заставить его продолжать бесконечно.
backtracking_exercise(X) :-
X = 0;
X = 1;
X = 2.
Я подумывал об использовании предиката между /3, но это даст только конечное количество чисел. Я также экспериментировал с предикатом плюс /3 и рекурсией, но не повезло. Это то, что я придумал, но, как вы можете сказать, в настоящее время это бесполезно.
backtracking_excercise2(X) :-
X = 0,
plus(X,1,Y),
backtracking_excercise2(Y).
Любые советы о том, как поступить, будет принята с благодарностью.
Заранее спасибо.
2 ответа
Хвосто-рекурсивный вариант решения Джима:
plus(N) :-
next_integer(1, N).
next_integer(I, I).
next_integer(I, K) :-
J is I + 1,
next_integer(J, K).
Чтобы не попасть в бесконечный цикл, когда plus/1
Предикат вызывается с аргументированным аргументом, т. е. чтобы предикат был только генератором, первое предложение можно изменить на:
plus(N) :-
var(N),
next_integer(1, N).
Вы пометили свой вопрос как "рекурсия" (с тех пор как его удалили), но пока не реализовали рекурсию. Я предполагаю, что этот вызов взят из главы о рекурсии, поэтому я даю следующие подсказки (за которыми следует решение):
Подсказка 1:
Каков базовый случай? Если вы хотите прервать рекурсивный вызов, он должен иметь базовый регистр.
Ваш базовый случай
X = 0.
Подсказка 2:
Что такое рекурсивный шаг? Что нужно сделать с предыдущей итерацией, чтобы сгенерировать следующий шаг в последовательности?
Ваш шаг
X is OldX + 1.
Решение:
plus(0).
plus(X) :- plus(N), X is N + 1.
Дополнительная информация:
Это решение будет бесконечным для
plus(-1).
(и, действительно, все отрицательные X).
Чтобы избежать этого, вам понадобятся более продвинутые инструменты (такие какDCG
или жеCLP(FD)
).