这是我的程序:
depends(apple, tree).
depends(cider, apple).
depends(X,Y) :- X\==Y, depends(Z,Y),depends(X,Y).
如果我问以下问题:
depends(cider, tree).
我得到:
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- [apples].
apples.pro for byte code...
apples.pro compiled, 4 lines read - 765 bytes written, 28 ms
yes
| ?- depends(cider, tree).
Fatal Error: local stack overflow (size: 8192 Kb, environment variable used: LOCALSZ)
如果我运行“跟踪”,我可以看到对 X\==Y 的评估一遍又一遍地重复......
我在这里做错了什么?(除了买一本《七周内的七种语言》:-))
编辑:
所以这要归功于下面 Daniel Lyons 的注释:将事实的名称与规则的名称区分开来防止递归:
depends(apple, tree).
depends(cider, apple).
depends_on(X,Y) :- depends(X,Z),depends(Z,Y).
给出以下内容(打开“跟踪”):
{trace}
| ?- depends_on(cider, tree).
1 1 Call: depends_on(cider,tree) ?
2 2 Call: depends(cider,_79) ?
2 2 Exit: depends(cider,apple) ?
3 2 Call: depends(apple,tree) ?
3 2 Exit: depends(apple,tree) ?
1 1 Exit: depends_on(cider,tree) ?
yes