我正在学习Prolog中的语法,我对从经典BNF语法到Prolog DCG语法形式的转换产生了怀疑。
例如,我有以下BNF语法:
<s> ::= a b
<s> ::= a <s> b
通过重写,生成所有类型的字符串:
ab
aabb
aaabbb
aaaabbbb
.....
.....
a^n b^n
在Ivan Bratko的“人工智能编程”一书中,他将这种BNF语法转换为DCG语法:
s --> [a],[b].
s --> [a],s,[b].
初看起来,这在我看来与经典的BNF语法形式非常相似,但我只对DCG中使用的,符号有疑问
这不是Prolog中逻辑 OR 的符号,但它只是生成序列中字符的分隔符。
是不是?
答案 0 :(得分:4)
您可以在DCG中阅读“然后”/“与”联合:
s -->
[a],
[b].
和
t -->
[a,b].
是一样的:
?- phrase(s,X).
X = [a, b].
?- phrase(t,X).
X = [a, b].
与prolog规则不同,这意味着逻辑连接:
a.
b.
u :-
a,
b.
?- u.
true.
即。如果a和b为真,则为真(这是这种情况)。
另一个区别是谓词s / 0不存在:
?- s.
ERROR: Undefined procedure: s/0
ERROR: However, there are definitions for:
ERROR: s/2
false.
原因是语法规则被转换为prolog谓词,但这需要额外的参数。评估语法规则的预期方法是使用如上所述的短语/ 2(短语(startrule,List))。如果你愿意,我可以添加关于从dcg到prolog的翻译的解释,但是如果你是prolog的初学者,我不知道这是不是太混乱。
附录: 一个更好的例子就是将t定义为:
t -->
[b],
[a].
使用短语的评价结果列表[b,a](与[a,b]明确不同):
?- phrase(t,X).
X = [b, a].
但是如果我们对规则中的目标进行重新排序,那么谓词为真的情况永远不会改变(*),所以在我们的例子中,定义
v :-
b,
a.
相当于你。
(*)因为prolog使用深度优先搜索来找到解决方案,所以可能需要在重新排序之后找到解决方案之前尝试无限多个候选者。 (在更多技术术语中,解决方案不会更改,但如果您重新排序目标,则搜索可能不会终止。)