【问题标题】:Is it possible to represent a context-free grammar with first-order logic?是否可以用一阶逻辑表示上下文无关文法?
【发布时间】:2016-04-29 20:08:05
【问题描述】:

简单地说,我有一个 EBNF 语法和一个解析树,但我不知道是否有一个程序可以在一阶逻辑中翻译它。

例如:

DR ::= E and P
P ::= B | (and P)* | (or P)*
B ::= L | P (and L P)
L ::= a

【问题讨论】:

  • 请注意,Prolog 并不完全符合 一阶逻辑。其次,this answer 可能会有所帮助。

标签: prolog ebnf first-order-logic


【解决方案1】:

是的,有。翻译表格产生式的一般模式

A ::= B C ... D

is to paraphrase 声明式地表示

终结符序列s是一个A(或者:A生成序列s,如果你更喜欢那个公式)如果:

  • ss_1s_2、...s_n

    的串联
  • s_1是一个B/B生成序列s_1,而

  • s_2是一个C/C生成序列s_2,而

  • ...

  • s_n是一个D/D生成的序列s_n

假设我们使用 generates 谓词以显而易见的方式编写这些,并且我们可以使用 || 编写连接。运算符,你的第一条规则变成(如果我猜对了 E 和 P 是非终结符并且“and”是终结符)类似于

generates(DR,s) ⊃ generates(E,s1) 
                  ∧ generates(and,s2)
                  ∧ generates(P,s3)
                  ∧ s = s1 || s2 || s3
         

要确定后件(即证明 sA),请证明前件。只要语法确实生成了一些句子,并且只要你有一些前提来定义终结符号的“生成”关系,证明就会很简单。

Prolog 定子句语法是这种模式的一个很好的实例。我们中的一些人需要一些时间来理解和欣赏 DCG 中差异列表的使用,但它们处理将 s 划分为子序列以及子序列与右侧不同部分的关联比上面给出的简单逻辑转换要优雅得多。

【讨论】:

  • 感谢您的清晰解释。无论如何,我的问题仅与 FOL 有关。怎么样||操作员?它不在 FOL 中,对吧?在你提到的规则中没有像B和L一样列出NT,这意味着我必须添加s4和s5?
  • 您使用的一阶逻辑的风格是否具有连接运算符是文档应该回答的问题。逻辑教科书中很少有关于一阶逻辑的定义可能会定义一个,但某些用于推理软件或解析的逻辑形式可以定义。答案中给出的规则是您语法中一个产生式的翻译(第一个);其他作品将需要类似的规则。您的所有作品的右侧都没有恰好五个子字符串,因此名为 s4 和 s5 的变量会令人惊讶。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2021-03-17
  • 2011-08-24
相关资源
最近更新 更多