Я написал эту простую программу на Прологе.
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.
Мне кажется, что, по крайней мере, в этом случае г-н Прологу будет довольно тривиально сделать вывод, что из правил в программе оннельзя сделать вывод, что Сократ бессмертен.Как?Я полагаю, что он может исследовать стек и посмотреть, пересекает ли оно уже пройденное правило.
Есть ли причина, по которой это еще не реализовано?Будет ли какая-то проблема с этим, что я пропускаю, или есть реализации Пролога, которые уже проводят такой анализ?