Что делает Пролог, если вы X = f (X)?

Что это значит в прологе, сравнивающем предикат с несвязанной переменной?

2 ответов


результат X = f(X) цель зависит от реализации Пролога, в некоторых системах, как отметил Карло в своем ответе, результат может управляться настраиваемым пользователем флагом. Предикат объединения,(=)/2, может быть реализован с или без того, что называется регистрация происходит. Эта проверка проверяет, происходит ли переменная в одном операнде в под-Терме в другом операнде. Когда предикат объединения реализует эту проверку, цель X = f(X) не удается. Но, для представления причины, предикат унификации часто реализуется без этой проверки. Стандарт ISO Prolog определяет альтернативный предикат унификации, метко названный unify_with_occurs_check/2, Это можно использовать, когда такие цели, как этот, могут привести к неприятностям.

В настоящее время несколько реализаций поддерживают циклические термины, также известный как рациональное термины, которые создаются такими целями, как X = f(X). К ним относятся CxProlog, ECLiPSe, Sicstus Prolog, SWI-Prolog и YAP. Отмечать, однако уровень поддержки рациональных терминов варьируется в разных системах. Минимальная поддержка будет (1), чтобы иметь возможность создавать рациональные условия (без переполнение стека!), (2) возможность унифицировать два рациональных термина и (3) возможность печатать привязки запросов, включающие рациональные термины, неоднозначным образом. С помощью этих трех функций вы можете, например, реализовать Программирование коиндуктивной логики, что полезно для нескольких классов проблем.


В Пролог (=)/2 это не сравнение, а фундаментальная операция, называемая объединение.

выражение, которое вы показываете в заголовке вопроса, если вызывается, когда X является свободной переменной, создаст цикловой термин. В SWI-Prolog

?- X=f(X),write(X).
@(S_1,[S_1=f(S_1)])
X = f(X).

циклические термины проблематичны для обработки, обычно создаются ошибками программирования: поведение SWI-Prolog (и других) можно контролировать с помощью глобального флага, см. occurs_check.