是否可以用一阶逻辑表示无上下文语法?

时间:2016-04-29 20:08:05

标签: prolog ebnf first-order-logic

简单地说,我有一个EBNF语法,所以有一个解析树,但我不知道是否有一个程序要在First Order Logic中翻译它。

例如:

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

1 个答案:

答案 0 :(得分:1)

是的,有。翻译表格制作的一般模式

A :: = B C ... D

是以声明的方式解释

  

一系列终端 s A (或者: A 生成序列 s ,如果你喜欢这个配方)如果:

     
      
  • s s_1 s_2 ,... s_n 的串联,以及< / p>

  •   
  • s_1 B / B 生成序列 s_1

  •   
  • s_2 C / C 生成序列 s_2

  •   
  • ...

  •   
  • s_n D / D 生成序列 s_n

    < / LI>   

假设我们使用生成谓词以明显的方式编写这些,并且我们可以使用||编写连接运营商,你的第一条规则成为(如果我猜对了E和P是非终端,而“和”是终端符号)就像

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

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

Prolog定义子句语法是这种模式的一个美丽的实例。我们需要花一些时间来理解和欣赏DCG中差异列表的使用,但是它们处理 s 到子序列的分区以及子序列与右侧不同部分的关联比上面给出的简单的逻辑翻译更优雅。