Что делает Пролог, если вы 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.