为什么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
    统一。然后它试图证明路径(b,c)
  • path/2
    的第一个子句再次失败,因为它不能同时将
    X
    b
    c
    统一起来
  • 因此它进入第二个子句,其中
    X
    b
    Y
    c
    统一,然后它调用
    edge(b,Z)
    。请注意,此变量(
    X
    Y
    Z
    与第一次调用path时的变量不同)。然后它试图证明路径(c,c)
  • 现在,path/2的第一个子句成功了,因为它将
    X
    c
    统一起来,并且没有进一步的目标
  • 前面对path/2的调用也成功了,因为它们位于每个子句的最终目标

为什么您希望查询失败?