В унификации ISO Prolog определяется только для тех случаев, которые являются NSTO (не подвержены возникновению-проверке). Идея заключается в том, чтобы охватить те случаи унификации, которые в основном используются в программах и которые фактически поддерживаются всеми системами Prolog. Более конкретно, ISO/IEC 13211-1:1995 гласит:
7.3.3 При условии наличия-проверки (STO) и не подлежащего проверке (NSTO)
Множество уравнений (или двух слагаемых) "подлежит возникновению" check "(STO), если существует способ продолжения шаги алгоритма Хербранда, такие, что 7.3.2 g
случается.Множество уравнений (или двух слагаемых)" не подлежит "происходит-check" (NSTO), если нет способа продолжить через шаги алгоритма Хербранда, так что 7.3.2 g происходит.
...
Этот шаг 7.3.2 g гласит:
g) Если существует уравнение вида X = t такое, что что X - переменная, а t - непеременный член который содержит эту переменную, а затем выйти с ошибкой (не единичный, положительный результат - проверка).
Полный алгоритм называется алгоритмом Хербранда и является тем, что обычно называют алгоритмом унификации Martelli-Montanari - который, по существу, осуществляется путем переписывания наборов уравнений не детерминированным образом.
Обратите внимание, что новые уравнения вводятся с:
d) Если существует уравнение вида f (a 1, a 2,... a N) =
f (b 1, b 2,... b N), затем заменим его на набор уравнений a i= b i.
Это означает, что два составных члена с одним и тем же функтором, но с другой аристократией никогда не будут способствовать STO-ness.
Этот недетерминизм - это то, что делает STO-тест настолько сложным для реализации. В конце концов, недостаточно проверить, может ли понадобиться проверка наличия, но доказать, что для всех возможных способов выполнения алгоритма этот случай никогда не произойдет.
Вот пример, иллюстрирующий ситуацию:
?- A/B+C*D = 1/2+3*4.
Унификация может начинаться с A = 1
, но также и с любой другой пар и продолжать в любом порядке. Чтобы обеспечить собственность NSTO, необходимо обеспечить, чтобы не было пути, который мог бы создать ситуацию STO. Рассмотрим случай, который не является проблематичным для текущих реализаций, но это все еще STO:
?- 1+A = 2+s(A).
Системы пролога начинаются с перезаписи этого уравнения на:
?- 1 = 2, A = s(A).
Теперь они выбирают либо
-
1 = 2
, что приводит к выходу алгоритма с ошибкой или -
A = s(A)
, где применяется шаг g, и обнаруживается STO-ness.
Мой вопрос двоякий. Сначала речь идет о реализации в ISO Prolog unify_sto(X,Y)
(используя только определенные встроенные элементы части 1), для которых выполняется следующее:
-
если унификация является STO, тогда
unify_sto(X,Y)
вызывает ошибку, в противном случае -
если
unify_sto(X,Y)
преуспевает, тогда такжеX = Y
успешно -
Если
unify_sto(X,Y)
терпит неудачу, то такжеX = Y
не работает
и мой второй вопрос касается конкретной ошибки в этой ситуации. См. ISO классы ошибок.
Вот простой шаг для начала: все случаи успеха покрываются успехом unify_with_occurs_check(X,Y)
. Остается сделать различие между сбоем NSTO и случаями ошибок STO. Это стало началом трудностей...