Как использовать 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)).

Другие вопросы по тегам