Algorithm WAM中的统一算法示例(Warren&x27;s抽象机)
中的练习2.2 要求对术语f(X,g(X,a))和f(b,Y)进行表示,然后对这些术语的地址进行统一(分别表示为a1和a2) 我已经为这些术语构建了堆表示,它们如下所示: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(
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