首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对BNF文法和Prolog的DCG文法的几点质疑

对BNF文法和Prolog的DCG文法的几点质疑
EN

Stack Overflow用户
提问于 2013-05-14 22:27:42
回答 1查看 695关注 0票数 2

我正在学习Prolog中的文法,我对从经典的BNF文法到Prolog DCG文法形式的转换有一点怀疑。

例如,我有以下BNF语法:

代码语言:javascript
复制
::= a b
 ::= a  b

通过重写,生成以下类型的所有字符串:

代码语言:javascript
复制
ab
aabb
aaabbb
aaaabbbb
.....
.....
a^n b^n

在Ivan Bratko的书《人工智能的编程》中,他以这种方式将BNF语法转换为DCG语法:

代码语言:javascript
复制
s --> [a],[b].
s --> [a],s,[b].

乍一看,这似乎与经典的BNF语法形式非常相似,但我只对

DCG中使用的符号

这不是逻辑上的符号

或者

在Prolog中,但它只是生成序列中字符的分隔符。

对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-15 23:39:49

您可以阅读

在DCGs中作为

然后

或者

与连接

代码语言:javascript
复制
s --> 
   [a],
   [b].

代码语言:javascript
复制
t -->
  [a,b].

是相同的:

代码语言:javascript
复制
?- phrase(s,X).
X = [a, b].

?- phrase(t,X).
X = [a, b].

这是不同的

在表示逻辑合取(AND)的非DCG/常规Prolog规则中:

代码语言:javascript
复制
a.
b.

u :-
 a,
 b.

?- u.
true.

在以下情况下为真

都是真的(这里就是这种情况)。

另一个不同之处还在于,谓词

不存在:

代码语言:javascript
复制
?- s.
ERROR: Undefined procedure: s/0
ERROR:     However, there are definitions for:
ERROR:         s/2
false.

这样做的原因是语法规则

转换为Prolog谓词,但这需要额外的参数。评估语法规则的预期方法是使用

如上(

)。如果你愿意,我可以添加关于从DCG到普通规则的转换的解释,但如果你是Prolog的初学者,我不知道这是否太令人困惑。

附录:一个更好的例子应该是定义

作为:

代码语言:javascript
复制
t --> 
  [b],
  [a].

其中,带有短语的求值结果出现在列表中

(这绝对不同于

):

代码语言:javascript
复制
?- phrase(t,X).
X = [b, a].

但是如果我们对规则中的目标进行重新排序,则谓词为真的情况永远不会改变(

*

),所以在我们的例子中,定义

代码语言:javascript
复制
v :-
  b,
  a.

等同于

..。

(

*

)因为prolog使用深度优先搜索来找到解决方案,所以它可能需要尝试无限多个候选,然后才能在重新排序后找到解决方案。(在更专业的术语中,解决方案不会改变,但如果您重新排序目标,您的搜索可能不会终止)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16545870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档