我无法弄清楚为什么来自给定 Prolog 代码的以下查询会生成错误Out of local stack
。
序言代码:
likes(g,c).
likes(c,a).
likes(c,b).
likes(b,a).
likes(b,d).
likes(X,Z) :- likes(X,Y), likes(Y,Z).
查询
?- likes(g,X).
结果是
X = c ;
X = a ;
X = b ;
ERROR: Out of local stack
编辑1这是我认为Prolog应该处理这个查询的方式,
likes(g,c) is a fact, so X={c}
likes(g,b) <= likes(g,c) and likes(c,b), so X={c,b}
likes(g,a) <= likes(g,b) and likes(b,a), so X={c,b,a}
likes(g,d) <= likes(g,b) and likes(b,d), so X={c,b,a,d}
likes(g,a) and false, so nothing to add to X
likes(g,d) and false, so nothing to add to X
end of backtracking search.
编辑 2通过以下代码修改,我设法得到了我想要的东西:
likes(g,c).
likes(c,a).
likes(c,b).
likes(b,a).
likes(b,d).
indirect_likes(A,B):- likes(A,B).
indirect_likes(A,C):- likes(B,C), indirect_likes(A,B).
查询
?- 间接喜欢(g,哪个)。
结果是
Which = c ;
Which = a ;
Which = b ;
Which = a ;
Which = d ;
false.
但是,仍然有一些我无法弄清楚背后的理由。如果我将最后一条规则更改为
indirect_likes(A,C):- indirect_likes(A,B), likes(B,C).
然后我得到ERROR: Out of local stack
!据我所知,逻辑合取是可交换的。