一些疑问与解释Prolog中DCG语法解析树的意义谓词的工作方式有关

一些疑问与解释Prolog中DCG语法解析树的意义谓词的工作方式有关,prolog,dcg,Prolog,Dcg,我正在学习Ivan Bratko的书《人工智能编程》中的PrologDCG语法*和**解析树 下面的示例提供了一个DCG语法,该语法从属于定义语言的字符串创建解析树,我发现了一些困难 定义的语言是机械臂的移动列表,只能有两种类型:向上和向下因此[up,up,down,up,up]属于我的DCG语法定义的语言 该程序还提供了一个语义/2谓词,该谓词解释与某个字符串相关联的解析树,表示机器人手臂穿过的距离(而它与向上移动值+1以及向下移动值-1相关联) 例如,对于列表[up,up,down,up,u

我正在学习Ivan Bratko的书《人工智能编程》中的PrologDCG语法*和**解析树

下面的示例提供了一个DCG语法,该语法从属于定义语言的字符串创建解析树,我发现了一些困难

定义的语言是机械臂的移动列表,只能有两种类型:向上向下因此[up,up,down,up,up]属于我的DCG语法定义的语言

该程序还提供了一个语义/2谓词,该谓词解释与某个字符串相关联的解析树表示机器人手臂穿过的距离(而它与向上移动值+1以及向下移动值-1相关联)

例如,对于列表[up,up,down,up,up]平均值/2谓词计算+3距离

这是我的示例代码(工作正常):

因此,我有含义/2谓词,它获取解析树并计算移动的总距离

因此,我有2个基本情况,表示与单个移动(到一个步骤)相关的距离值,对于上一步可以是+1,对于下一步可以是-1:

meaning(step(up), 1).
meaning(step(down), -1).
means/2采用一个解析树,根据DCG语法的定义,该解析树有一个move节点作为根:这个根将有一个左子节点,它是一个步骤节点(因此它是一个单独的移动,因此它有一个与之相关联的特定距离+1或-1),一个右子节点是move节点(因此它表示另一个子树)

因此,总距离是当前步骤距离的总和,即+1或-1(当前移动根的左子级)+右子树中的距离

我认为这是正确的,这对我来说非常清楚

我不明白的是,代码中这两个谓词代表了什么:

meaning(step(Step), Dist):- meaning(Step, Dist).
meaning(move(Step), Dist):- meaning(Step, Dist).

我不能把它们放在我的推理中:-(

我们这样使用这些规则

4 ?- phrase(move(X), [up,up,down,up,up]).
X = move(step(up), move(step(up), move(step(down), move(step(up), 
      move(step(up)))))) ;
false.

5 ?- meaning($X,N).
N = 3 ;
false.
产生的术语高度嵌套:

move(step(up),                           % move/2: step/1 , 
     move(step(up),                      %   move/2: step/1 ,
          move(step(down),               %     move/2: step/1 ,
               move(step(up),            %       move/2: step/1 ,
                    move(step(up))))))   %         move/1: step/1 .
你所问的代码,从复合词中去掉了原子,找到了它的“核心”,即
up
down
atom:

(2)
意思(步骤,距离):-意思(步骤,距离)。

“查找一元复合词
的“含义”步骤(X)
,与查找
X
的“含义”相同。”

(3)
意思(移动(步),距离):-意思(步,距离)。

“查找一元复合词
move(X)
的“含义”与查找
X
的“含义”相同。”

(4)基本情况:“'的意思”表示
1
-1
,表示
向上
向下
原子

meaning(step(up), 1).                    % clashes with rule (2)
meaning(step(down), -1).                 % clashes with rule (2)
(1),主案例处理与函子移动的二进制复合词:

meaning(move(Step, Move), Dist):- 
    meaning(Step, D1),
    meaning(Move, D2),
    Dist is (D1 + D2).
move/2
是(非空)列表的自定义版本,
。/2
,实际上:

1 ?- write_canonical([1,2,3]).
'.'(1,'.'(2,'.'(3,[])))
true.

2 ?- write_canonical([step(up),step(down),step(up)]).
'.'(step(up),'.'(step(down),'.'(step(up),[])))
true.

means/2
是一个问题。

是否真的有必要复制整个问题和书籍部分,以获得关于这四行代码的帮助?此外,您是否尝试过运行代码?这些规则的作用很明显:它们允许您直接从DCG中调用包装事实的
means/2
。它们只需打开额外的结构层。我逻辑化,如果有时我提出一个很长的问题,但是我害怕在这个问题上不清楚questions@AndreaNobili你进展顺利,开始更多地相信自己的能力,并对其进行解释和总结;更重要的是,让Prolog代码自己说话
1 ?- write_canonical([1,2,3]).
'.'(1,'.'(2,'.'(3,[])))
true.

2 ?- write_canonical([step(up),step(down),step(up)]).
'.'(step(up),'.'(step(down),'.'(step(up),[])))
true.