程序是;“平均值”;Prolog中的解析树,don';行不通

程序是;“平均值”;Prolog中的解析树,don';行不通,prolog,dcg,Prolog,Dcg,我正在使用Ivan Bratko的书《人工智能编程》学习DCG语法和解析树 在这本书中,我发现了以下示例,其中显示了一个DCG语法,该语法还生成了一个解析树和一个语义/2谓词,用于表示移动后的位置 代码如下: move(move(Step)) --> step(Step). move(move(Step, Move)) --> step(Step), move(Move). step(step(up)) --> [up]. step(step(down)) --> [d

我正在使用Ivan Bratko的书《人工智能编程》学习DCG语法和解析树

在这本书中,我发现了以下示例,其中显示了一个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…)


为什么??怎么了?我遗漏了什么?

看来
意思/2
的第二个从句是错的。应该是:

meaning(move(Step), Dist):- meaning(Step, Dist).
要精确定位此错误,您可以尝试单次移动:

?- move(Tree, [up], []).
Tree = move(step(up))
因此,在
means/2
中必须有一个处理单个移动的基本情况,并且检查您的代码它应该正好是第二个子句

事实上,每一个移动列表都以这类术语中的一个结尾,
move(步骤(X))
with
X
In{up,down}

?- move(Tree, [up], []).
Tree = move(step(up))