Цикличное выполнение пролога, хотя переменная заканчивается

Да, Вы можете. У меня есть 64-разрядный Debian, работающий в VMware на Windows  32-разрядный XP. Пока Вы устанавливаете Гостя для использования двух процессоров, это будет работать просто великолепно.

5
задан Junuxx 10 October 2012 в 14:56
поделиться

3 ответа

Используйте цикл, управляемый сбоями:

test(X, 1, 4, 5), writeln(X), fail ; true.

или то же самое в более удобочитаемом виде, используя forall / 2 :

forall(test(X, 1, 4, 5), writeln(X)).

Нет необходимости создавать список всех решений (для этого предназначен findall / 3 ), если вам не нужен этот список для чего-то другого, кроме его распечатки.

Если в вашем Прологе нет forall / 2 , то реализуйте его самостоятельно следующим образом:

forall(A, B) :-
    \+ (call(A), \+ call(B)).
7
ответ дан 13 December 2019 в 19:29
поделиться

Если вы хотите получить каждое решение для переменной в вызове без необходимости постоянно нажимать ';' для следующего решения вы можете использовать предикат findall следующим образом:

findall(X,test(X,1,4,5),L).

Первый аргумент указывает, какая переменная вы хотите собрать все значения, второй аргумент - это предикат вместе с его аргументами, которые вы хотите найти все решения для, а третий аргумент будет списком всех значений X из всех решений.

Итак, отсюда вы можете просто распечатать значения L, если вас устраивает формат результата список. В противном случае, как указывает Винсент Рамдхани, вам нужно будет написать рекурсивный предикат для печати содержимого L так, как вы хотите.

2
ответ дан 13 December 2019 в 19:29
поделиться

Вы имеете в виду автоматически? Вы можете выполнить команду возврата с помощью; и он возвращается и получает следующее значение. Но если вы хотите распечатать несколько результатов в программе, вы используете рекурсию. Расскажите подробнее о том, что вы пытаетесь сделать.

ОБНОВЛЕНИЕ: Вы не можете выпустить;. Вы должны написать процедуру для "цикла" по результатам, поэтому вам может потребоваться список результатов.

   printList([]) :- write("").
   printList([H|T]) :- write(H), printList(T).
2
ответ дан 13 December 2019 в 19:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: