为什么Prolog会返回true到这个查询
序言新手在这里。 我有这个计划:为什么Prolog会返回true到这个查询,prolog,Prolog,序言新手在这里。 我有这个计划: edge(a,b). edge(b,c). path(X,X). path(X,Y):- edge(X,Z),path(Z,Y). 我不明白为什么Prolog会返回true: path(a,c)它返回true,因为prolog引擎可以证明您的查询 您可以想象prolog引擎在查询路径(a,c)时会这样做: path/2的第一个子句失败,因为它不能同时将X与a和c统一起来 因此它进入第二个子句,其中X与a和Y与c统一,然后它调用edge(a,Z) 由于存在一
edge(a,b).
edge(b,c).
path(X,X).
path(X,Y):- edge(X,Z),path(Z,Y).
我不明白为什么Prolog会返回true:
path(a,c)
它返回true
,因为prolog引擎可以证明您的查询
您可以想象prolog引擎在查询路径(a,c)时会这样做:
的第一个子句失败,因为它不能同时将path/2
与X
和a
统一起来c
- 因此它进入第二个子句,其中
与X
和a
与Y
统一,然后它调用c
李>edge(a,Z)
- 由于存在一个事实
,边缘(a,b)
与Z
统一。然后它试图证明路径(b,c)b
的第一个子句再次失败,因为它不能同时将path/2
与X
和b
统一起来c
- 因此它进入第二个子句,其中
与X
和b
与Y
统一,然后它调用c
。请注意,此变量(edge(b,Z)
、X
、Y
与第一次调用path时的变量不同)。然后它试图证明路径(c,c)Z
- 现在,path/2的第一个子句成功了,因为它将
与X
统一起来,并且没有进一步的目标c
- 前面对path/2的调用也成功了,因为它们位于每个子句的最终目标