2009-11-08 3 views
5

У меня есть небольшая программа, написанная в Prolog. На данный момент я могу напечатать первый результат сПролог зацикливается с переменными результатами

test(X, 1, 4, 5). 
write(X). 

Но если есть более чем один результат для X, Как напечатать следующие из них?

Спасибо.

ответ

7

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

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)). 
+0

forall, похоже, не существует в GNU-Prolog, но работает с ошибкой. Благодарю. – Kutzi

+0

@ Kutzi: Я добавил реализацию forall/2 – Kaarel

2

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

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

printList([]) :- write(""). 
    printList([H|T]) :- write(H), printList(T). 
+0

Я хочу, чтобы приложение Выдать; команда зацикливать, хотя результаты. –

+0

Пример содержит синтаксическую ошибку: replace ';' с '.'. Но даже после исправления этой ошибки программа работает некорректно, например. "? - printList ([a, b, c])". выходы "abc []", где конечный "[]", вероятно, не нужен. – Kaarel

2

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^