Как получить все факты, используемые для получения решения запроса в Прологе?

Я пытаюсь напечатать все факты, использованные для решения вопроса, и надеюсь ничего не напечатать, если объединение не удалось. Итак, я пишу это:

a:-
    b,c,writeln(b^c->a).
b:-
    d,writeln(d->b).
c:-
    fail,writeln(e->c).
d:-
    writeln(d).
a:-
    b,d,writeln(b^d->a).

Тем не менее, когда я запрашиваю a.Я получил следующий вывод, к сожалению:

d
d->b
d
d->b
d
b^d->a
true.

Кто-то, кажется, говорит мне, что у Пролога есть встроенный механизм, чтобы показать все факты, используемые для выполнения запроса. Он правда? Как я могу получить правильный вывод?

1 ответ

В вашей программе нет переменных, и, следовательно, нет объединения.

edit: Или лучше, в абстрактном смысле, Prolog выбрать между списком предложений Horn, объединяющих текущую цель с каждой главой правила. Но настоящие прологи заменяют этап выбора индексированием для повышения производительности и пытаются объединить аргументы.

Когда вы вызываете a, что вызывает b а также cи напечатайте выражение.

Встроенный механизм для отображения всех правил, используемых в запросе, вероятно, является трассировкой. Подробности смотрите в руководстве по Prolog, это довольно сложный аргумент, включающий внутреннюю работу системы и "архитектуру" языка, на который вы ориентируетесь.

Там, конечно, нет правильного вывода, кроме того, что вы можете увидеть. Это семантика, которую вы написали.

Другие вопросы по тегам