Algorithm WAM中的统一算法示例(Warren&x27;s抽象机)

Algorithm WAM中的统一算法示例(Warren&x27;s抽象机),algorithm,prolog,unification,union-find,warren-abstract-machine,Algorithm,Prolog,Unification,Union Find,Warren Abstract Machine,中的练习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(

中的练习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
现在我被要求跟踪unify(a1,a2),但按照第20页的算法,我得到:

d1=deref(a1)=deref(10)=10
d2=deref(a2)=deref(0)=0
0 != 10所以我们继续
=店铺(d1)=店铺(10)=
=门店(d2)=门店(0)=
t1!=REF和t2!=所以我们继续
f1/n1=门店(v1)=门店(11)=b/0
f2/n2=门店(v2)=门店(1)=a/0
现在b!=a因此算法以fail=true终止,
因此,统一失败了,但显然是存在的
X=b,Y=g(b,a)的解。

我的错误在哪里?

我自己找到了解决办法。以下是我的更正:

每个术语都应该有自己的函子定义(即,第二个术语中的f函子不应该只链接到第一个术语中的第一个f函子,而应该有自己的定义),并且指向术语(a1和a2)的指针应该指向最外层的术语函子

这意味着以下布局中的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
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