Как получить все факты, используемые для получения решения запроса в Прологе?
Я пытаюсь напечатать все факты, использованные для решения вопроса, и надеюсь ничего не напечатать, если объединение не удалось. Итак, я пишу это:
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, это довольно сложный аргумент, включающий внутреннюю работу системы и "архитектуру" языка, на который вы ориентируетесь.
Там, конечно, нет правильного вывода, кроме того, что вы можете увидеть. Это семантика, которую вы написали.