Как стандарт ISO Prolog требует сохранения идентификатора переменной при преобразовании из условия в термин?
Я что-то упускаю при чтении ISO / IEC 13211-1, подпункты 7.6.3 и 7.6.4:
7.6.3 Преобразование главы предложения в термин
Голова
H
с предикатным индикаторомP/N
может быть преобразован в терминT
:а) если
N
тогда нольT
это атомP
,б) если
N
ненулевой тогдаT
является переименованной копией (7.1.6.2)TT
гдеTT
это сложный термин, основной функтор которогоP/N
и аргументыH
а такжеTT
идентичны7.6.4 Преобразование тела предложения в термин
Цель
G
который является предикатом с предикатным индикаторомP/N
может быть преобразован в терминT
:а) если
N
тогда нольT
это атомP
,б) если
N
ненулевой тогдаT
является переименованной копией (7.1.6.2)TT
гдеTT
это сложный термин, основной функтор которогоP/N
и аргументыG
а такжеTT
идентичныв) если
G
контрольная конструкция, которая появляется в таблице 9, тоT
это термин с соответствующим главным функтором. Если главный функторT
являетсяcall/1
или жеcatch/3
или жеthrow/1
тогда аргументыG
а такжеT
идентичны, иначе, если главный функторT
является(',')/2
или же(;)/2
или же(->)/2
тогда каждый аргументG
также должны быть преобразованы в термин.
Предположим, у нас есть открытый (7.5.3) (например, динамический) пользовательский предикат a/1
, определяется следующим единственным предложением:
a(X) :- b(X).
Очевидно, цель
?- clause(a(A), b(B)), A == B.
должен преуспеть. Цитирую часть определения clause/2
(8.8.1.1):
a) Выполняет последовательный поиск по каждой общедоступной пользовательской процедуре в базе данных и создает список
L
всех условийclause(H, B)
такой, что1) база данных содержит пункт, глава которого может быть преобразована в термин
H
(7.6.3), и чье тело может быть преобразовано в терминB
(7.6.4) и2)
H
объединяется сHead
, а также3)
B
объединяется сBody
,
Преобразование заголовка вышеупомянутого пункта в термин, 7.6.3 b) применяется, и мы создаем переименованную копию a(A)
из a(X)
, Точно так же применяется преобразование тела пункта, 7.6.4 b), и мы создаем переименованную копию b(B)
из b(X)
,
Проблема в том, что a(A)
а также b(B)
отдельные переименованные копии. Как это требуется, что A
а также B
одинаковые переменные, как и следовало ожидать?
Тот же вопрос можно задать для оговорки
p :- q(X), r(X).
Когда мы преобразовываем основную часть этого условия в термин, применяется пункт 7.6.4 c), и основным функтором термина должен быть (',')/2
с двумя аргументами, являющимися целями q(X)
а также r(X)
преобразованы в условия. Но это предсказания, и применяется 7.6.4 b), поэтому снова два результирующих термина являются отдельно переименованными копиями.
Что мне не хватает?