Пролог несколько объединений в одну переменную - PullRequest
0 голосов
/ 22 апреля 2019

Мне нужно объединить все термины в базе данных в одну переменную.

Для данного кода:

man('a').
man('b').

main :-
        prompt(_, ''),
        man(X),
        write(X),
        nl,
        halt.

Я получаю вывод:

a

Мне нужно получить что-то вроде:

['a','b']

Возможно ли это? Я знаю о retract / 1, который удаляет термин из базы данных, я мог бы перебирать все эти факты и извлекать их из базы данных один за другим, но это похоже на выстрел в ногу. Любой данный совет ценится.

1 Ответ

3 голосов
/ 23 апреля 2019

Если у вас есть набор фактов, таких как:

man(a).
man(b).

Как было указано в комментариях, вы можете найти все решения с помощью findall:

| ?- findall(X, man(X), Solutions).
Solutions = [a, b]

Вы также можете изменить исходную программу, чтобы использовать цикл с ошибкой. fail в Прологе делает именно это: он терпит неудачу и поэтому заставляет Пролог вернуться назад. Как только man(X) не сможет найти больше решений, то первое предложение main в конечном итоге приведет к отказу Пролога во втором предложении, которое просто завершится успешно без дальнейших действий:

main :-
    man(X),
    write(X),
    nl,
    fail.
main.

Теперь, если вы запросите main, вы получите:

| ?- main.
a
b

yes
| ?-

В контексте более широкой программы, findall/3 может быть предпочтительным, так как она захватывает решения для вас, тогда как вышесказанное просто «печатает» их, не собирая их. Хотя бывают моменты, когда это все, что нужно.

...