我正在学习 DCG语法和解析树,使用Ivan Bratko一书:人工智能编程。
在本书中,我发现以下示例显示了DCG语法,该语法也生成了一个解析树和一个含义/ 2 谓词,用于表示一些移动后的位置。
这是代码:
move(move(Step)) --> step(Step).
move(move(Step, Move)) --> step(Step), move(Move).
step(step(up)) --> [up].
step(step(down)) --> [down].
meaning(move(Step, Move), Dist):- meaning(Step, D1),
meaning(Move, D2),
Dist is (D1 + D2).
meaning(step(Step), Dist):- meaning(Step, Dist).
meaning(step(up), 1).
meaning(step(down), -1).
在书上显示以下查询,输出如下:
move(Tree, [up,up,down, up, up], []), meaning(Tree, Dist).
Tree = move(step(up), move(step(up), move(step(down), move(step(up), move(step(up)))))),
Dist = 3
问题是,如果我尝试执行上一个查询,我总是获得FALSE(我用任何查询得到false ...)
?- move(Tree, [up,up,down, up, up], []), meaning(Tree, Dist).
false.
为什么呢?怎么了?我错过了什么?
答案 0 :(得分:1)
似乎meaning/2
的第二个条款是错误的。它应该是:
meaning(move(Step), Dist):- meaning(Step, Dist).
要确定此错误,您可以尝试一次移动:
?- move(Tree, [up], []).
Tree = move(step(up))
因此,meaning/2
中必须有一个基本案例来处理单个移动,并且检查您的代码应该恰好是第二个子句。
事实上,每个动作列表都以move(step(X))
中的X
之一{{1}}结尾{{1}}结束。