- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 Prolog 中的语法,我对从经典 BNF 语法到 Prolog DCG 语法形式的转换有一点疑问。
例如我有以下 BNF 语法:
<s> ::= a b
<s> ::= a <s> b
通过重写,生成所有类型的字符串:
ab
aabb
aaabbb
aaaabbbb
.....
.....
a^n b^n
查看 Ivan Bratko 的书 Programming for Artificial Intelligence 他以这种方式将此 BNF 文法转换为 DCG 文法:
s --> [a],[b].
s --> [a],s,[b].
乍一看,这在我看来与经典的 BNF 语法形式非常相似,但我对 DCG 中使用的 , 符号只有疑问
这不是 Prolog 中逻辑 OR 的符号,它只是生成序列中字符的分隔符。
是吗?
最佳答案
您可以将 DCG 中的 ,
读取为 and then 或 concatenated with:
s -->
[a],
[b].
和
t -->
[a,b].
是一样的:
?- phrase(s,X).
X = [a, b].
?- phrase(t,X).
X = [a, b].
它不同于 ,
在非 DCG/常规 Prolog 规则中表示逻辑合取 (AND):
a.
b.
u :-
a,
b.
?- u.
true.
即如果 a
和 b
为真(这里就是这种情况),则 u
为真。
另一个区别也是谓词 s/0
不存在:
?- s.
ERROR: Undefined procedure: s/0
ERROR: However, there are definitions for:
ERROR: s/2
false.
原因是语法规则 s
被翻译成 Prolog 谓词,但这需要额外的参数。评估语法规则的预期方法是使用 phrase/2
如上所述 (phrase(startrule,List)
)。如果你愿意,我可以添加关于从 DCG 到普通规则的翻译的解释,但我不知道如果你是 Prolog 的初学者,这是否太困惑了。
附录:一个更好的例子是将 t
定义为:
t -->
[b],
[a].
在 [b,a]
列表中使用短语的评估结果(这与 [a,b]
绝对不同):
?- phrase(t,X).
X = [b, a].
但是如果我们重新排列规则中的目标,谓词为真的情况永远不会改变 (*),所以在我们的例子中,定义
v :-
b,
a.
等同于u
。
(*) 由于 prolog 使用深度优先搜索来寻找解决方案,因此在重新排序后找到解决方案之前,它可能需要尝试无限多的候选者。 (用更专业的术语来说,解决方案不会改变,但如果您重新排序目标,您的搜索可能不会终止)。
关于parsing - 关于BNF文法和Prolog的DCG文法的一些疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16545870/
我正在尝试实现一个表达式处理语法(处理嵌套括号和其他内容)。到目前为止我有以下内容,但它们无法处理某些情况(成功/失败情况出现在以下代码块之后)。有人知道这是怎么回事吗? 注意:varname +=
我在 ANTLR 语法中写下了以下语句: loopStatement : 'loop' (statement|exit)* 'end' 'loop' ';' ; 如果我没理解错的话,
为 C 的一个子集编写一个简单的 BNF 语法,它支持多个语句,包括赋值、if-else 和没有 block 语句的 while 语句。为你的非终结符使用有意义的名字(相对于神秘的字母)。假设变量由单
我正在尝试为以下语法创建一个 LALR(1) 解析器并发现一些移位/归约冲突。 S := expr expr := lval | ID '[' expr ']' OF expr lval := ID
根据这个paper的规则: If A is the start nonterminal, put EOF in FOLLOW(A) Find the productions with A on the
为 k > 1 制作人工 LR(k) 文法很容易: Input: A1 B x Input: A2 B y (introduce reduce-reduce con
在使用 make 和 bison 的项目中,我很难指定编译语法 grammar.tab.c 依赖于语法输入 grammar.y,每个目标文件都依赖于相应的源文件(包括 grammar.tab.o),并
我正在尝试从语法分析树中提取乔姆斯基范式 (CNF) - 句子的语法产生式: (ROOT (S (NP (DT the) (NNS kids)) (VP (VBD opened)
我知道 ANTLR 可以接受 LL(*) 文法。但是,有没有办法使用 ANTLR 检查语法是否是 LL(1)? 最佳答案 options { k = 1; } 如果您的语法不在 LL(1) 中,
我还没有找到答案。是否存在无法转换为 LL(1) 的上下文无关且无歧义的语法? 我发现了一个我不知道如何转换为 LL(1) 的作品:parameter-type-list C99中的生产: param
我是一名优秀的程序员,十分优秀!