一些疑问与解释Prolog中DCG语法解析树的意义谓词的工作方式有关
我正在学习Ivan Bratko的书《人工智能编程》中的PrologDCG语法*和**解析树 下面的示例提供了一个DCG语法,该语法从属于定义语言的字符串创建解析树,我发现了一些困难 定义的语言是机械臂的移动列表,只能有两种类型:向上和向下因此[up,up,down,up,up]属于我的DCG语法定义的语言 该程序还提供了一个语义/2谓词,该谓词解释与某个字符串相关联的解析树,表示机器人手臂穿过的距离(而它与向上移动值+1以及向下移动值-1相关联) 例如,对于列表[up,up,down,up,up],平均值/2谓词计算+3距离 这是我的示例代码(工作正常): 因此,我有含义/2谓词,它获取解析树并计算移动的总距离 因此,我有2个基本情况,表示与单个移动(到一个步骤)相关的距离值,对于上一步可以是+1,对于下一步可以是-1:一些疑问与解释Prolog中DCG语法解析树的意义谓词的工作方式有关,prolog,dcg,Prolog,Dcg,我正在学习Ivan Bratko的书《人工智能编程》中的PrologDCG语法*和**解析树 下面的示例提供了一个DCG语法,该语法从属于定义语言的字符串创建解析树,我发现了一些困难 定义的语言是机械臂的移动列表,只能有两种类型:向上和向下因此[up,up,down,up,up]属于我的DCG语法定义的语言 该程序还提供了一个语义/2谓词,该谓词解释与某个字符串相关联的解析树,表示机器人手臂穿过的距离(而它与向上移动值+1以及向下移动值-1相关联) 例如,对于列表[up,up,down,up,u
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.