Да, Вы можете. У меня есть 64-разрядный Debian, работающий в VMware на Windows 32-разрядный XP. Пока Вы устанавливаете Гостя для использования двух процессоров, это будет работать просто великолепно.
Используйте цикл, управляемый сбоями:
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)).
Если вы хотите получить каждое решение для переменной в вызове без необходимости постоянно нажимать ';' для следующего решения вы можете использовать предикат findall следующим образом:
findall(X,test(X,1,4,5),L).
Первый аргумент указывает, какая переменная вы хотите собрать все значения, второй аргумент - это предикат вместе с его аргументами, которые вы хотите найти все решения для, а третий аргумент будет списком всех значений X из всех решений.
Итак, отсюда вы можете просто распечатать значения L, если вас устраивает формат результата список. В противном случае, как указывает Винсент Рамдхани, вам нужно будет написать рекурсивный предикат для печати содержимого L так, как вы хотите.
Вы имеете в виду автоматически? Вы можете выполнить команду возврата с помощью; и он возвращается и получает следующее значение. Но если вы хотите распечатать несколько результатов в программе, вы используете рекурсию. Расскажите подробнее о том, что вы пытаетесь сделать.
ОБНОВЛЕНИЕ: Вы не можете выпустить;. Вы должны написать процедуру для "цикла" по результатам, поэтому вам может потребоваться список результатов.
printList([]) :- write("").
printList([H|T]) :- write(H), printList(T).