Пролог, как показать множественный вывод в write () - PullRequest
5 голосов
/ 08 сентября 2011
go :-   match(Mn,Fn),
        write('--Matching Result--'),
        nl,
        write(Mn),
        write(' match with '),
        write(Fn),
        match(Mn1,Fn1).


person(may,female,25,blue).
person(rose,female,20,blue).
person(hock,male,30,blue).
person(ali,male,24,blue).
match(Mn,Fn):-person(Fn,'female',Fage,Fatt),
person(Mn,'male',Mage,Matt),
Mage>=Fage,
Fatt=Matt.

Привет, это мой код ... но он может показывать только 1 результат ... но есть три пары совпадений в совпадении (X, Y). Как показать их все в моей функции go.

Спасибо

Ответы [ 3 ]

11 голосов
/ 08 сентября 2011

Вы получаете все свои совпадения, если принудительно откатываетесь, обычно вводя ; (например, в SWI Prolog).Но вы также видите, что получаете ненужные результаты true.Это потому, что последнее предложение в go является match(Mn1,Fn1).Это предложение выполняется три раза успешно и связывает переменные Mn1,Fn1, но затем выводится только true, поскольку после этого предложения вы не write().Четвертый раз match(Mn1,Fn1) завершается неудачно, и, возвращаясь назад, вы возвращаетесь к первому пункту match(Mn,Fn), который соответствует, соответствие выводится и т. Д.

Вы, конечно, не хотите иметь такое поведение.Вы должны удалить последнее предложение match(Mn1,Fn1) в go.Теперь, нажав ;, вы получите 3 совпадения без каких-либо выходных данных true между ними.

Но вы, вероятно, захотите, чтобы программа выполняла возврат.Чтобы добиться этого, вам просто нужно принудительно вернуться, добавив false в качестве последнего предложения.Чтобы получить правильное форматирование вывода, используйте следующую программу.Последнее предложение go2. добавлено, чтобы получить true в самом конце.

go2 :- write('--Matching Result--'), nl,
    match(Mn,Fn),
    write(Mn), write(' match with '), write(Fn), nl,
    fail.
go2.

Этот метод называется отказоустойчивый цикл .

3 голосов
/ 08 сентября 2011

Если у вас есть какой-либо предикат с несколькими результатами и вы хотите найти все из них, вы должны использовать findall/3

Например, в вашем случае вы можете сделать что-то вроде:

findall([X,Y], match(X,Y),L).

L будет списком, который будет содержать все X, Y, которые удовлетворяют соответствию (X, Y) в формате [X, Y].например, при условии, что:

match(m1,f1).
match(m2,f2).

результат будет L = [[m1, f1], [m2, f2]]

обратите внимание, что вы можете определить формат по своему желаниюНапример, вы могли бы написать:

findall(pair(X,Y), match(X,Y), L).
L = [ pair(m1,f1), pair(m2,f2) ]

findall( X, match(X,Y), L).
L = [ m1, m2]

findall( 42, match(X,Y), L).
L = [42, 42]

, затем вам нужно будет вернуться в список, чтобы распечатать их.

Однако, если вы хотите найти один результат, запустите некоторый код и затем продолжитеВы можете использовать forall / 2:

forall(match(X,Y), my_print(X,Y).
0 голосов
/ 08 сентября 2011

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

Если ваш код работает (я не пробовал), то вам следует попытаться запустить выражение match, как это, в вашем инспекторе прологов:*

Инспектор прологов вернет все состояния и распечатает их для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...