我的简单prolog递归有什么问题



我是Prolog的新手。尝试编写一个名为leaftree的谓词,如果给定的树是叶树,则为True。如果一棵树的所有叶子都是原子,或者它是空的,那么它就是一棵叶子树。这是我的断言:

leaftree(nil).
leaftree(t(nil, X, nil)):-
atom(X).
leaftree(t(L, X, R)):-  
leaftree(L), leaftree(R).

这是我用来测试这个谓词的输入:

leaftree(t(t(nil, 5, nil), X, nil)). 

输出是True,但应该是False,因为5不是原子。我玩了leaftree(t(nil, X, nil)):- atom(X)部分;看起来谓词被调用了,但它总是返回True。即使我明确地写了fail或其他错误的语句。如果重要的话,我正在使用Swish。我喜欢你的想法!

提前非常感谢。奥利尔

输入的结果为true,因为它匹配谓词的第三个定义。因此,它存在一个对您的查询为真的谓词。

这是因为在第三个定义中,X是自由的。事实上,当我用swi-prolog查阅你的文件时,我收到了一条警告:Singleton variable[X]。

您可以将第二个和第三个定义替换为以下(包括两者(

leaftree(t(L, X, R)):-  
leaftree(L), atom(X), leaftree(R).

非常感谢!感谢你的评论,我发现了这个问题。

由于不是叶子的节点不一定是原子,我感觉我仍然应该使用两个不同的谓词。我添加了一个!并替换了singleton变量X,现在它工作得很好:

leaftree(nil).
leaftree(t(nil, X, nil)):-
!, atom(X).
leaftree(t(L, _, R)):-  
leaftree(L), leaftree(R).

非常感谢!奥利尔

最新更新