Пример алгоритма объединения в WAM (абстрактная машина Уоррена)

Упражнение 2.2 в абстрактной машине Уоррена: реконструкция учебника

запрашивает представления для терминов f(X, g(X, a)) и f(b, Y), а затем выполняет объединение по адресу этих терминов (обозначается как a1 и a2 соответственно).

Я построил кучные представления для терминов, и они следующие:

f(X, g(X, a)):
0   STR     1
1           a/0
2   STR     3
3           g/2
4   REF     4
5   STR     1
6   STR     7
7           f/2
8   REF     4
9   STR     3

f(b, Y):
10  STR     11
11          b/0
12  STR     7
13  STR     11
14  REF     14

и теперь меня просят отследить унификацию (a1, a2), но, следуя алгоритму на странице 20 в 1, я получаю:

d1 = deref(a1) = deref(10) = 10
d2 = deref(a2) = deref(0) = 0

0 != 10 so we continue

<t1, v1> = STORE(d1) = STORE(10) = <STR, 11>
<t2, v2> = STORE(d2) = STORE(0) = <STR, 1>

t1 != REF and t2 != REF so we continue

f1 / n1 = STORE(v1) = STORE(11) = b / 0
f2 / n2 = STORE(v2) = STORE(1) = a / 0

and now b != a so the algorithm terminated with fail = true,
and thus unification failed, but obviously there exists
a solution with X = b and Y = g(b, a).

Где моя ошибка?

1 ответ

Решение

Я нашел решение сам. Вот мои исправления:

Каждый термин должен иметь свои собственные определения функторов (т. Е. F-функтор во втором члене должен не просто ссылаться на первый f-функтор в первом члене, но должен иметь свои собственные) и указатели на термины (a1 и а2) должен указывать на внешний термин функтор.

Это означает, что a1 = 6 и a2 = 12 в следующем макете

f(X, g(X, a)):
0   STR     1
1           a/0
2   STR     3
3           g/2
4   REF     4
5   STR     1
6   STR     7
7           f/2
8   REF     4
9   STR     3

f(b, Y):
10  STR     11
11          b/0
12  STR     13
13          f/2
14  REF     11
15  REF     15
Другие вопросы по тегам