Я написал эту простую программу на Прологе.
man(socrates).
mortal(X) :- man(X).
immortal(X) :- immortal(X).
Я задавал ему обычные вопросы, например, человек Сократ или смертный Сократ.
?- man(socrates).
true. //we know for a fact that Socrates is a man
?- mortal(socrates).
true. //and it can logically be inferred that Socrates is mortal
?- immortal(socrates).
//but we can't seem to figure out if he's immortal
Он разбился из-за рекурсивного определения immortal
. Циклические ссылки также вызывают сбой или ошибку с Out of stack space.
Мне кажется, что, по крайней мере, в этом случае мистеру Прологу было бы довольно тривиально заключить, что из правил программы нельзя вывести, что Сократ бессмертен. Как? Я предполагаю, что он мог бы изучить стек и увидеть, проходит ли он правило, которое уже было пройдено.
Есть ли причина, по которой это еще не реализовано? Будут ли какие-то проблемы с этим, которые я упускаю из виду, или существуют реализации Пролога, которые уже выполняют такой анализ?