可以通过语法表达哪些计算模型?


18

这是语法程序的重新表述吗?以前由Vag提出,并有评论者的很多建议。

可以通过哪种方式将语法视为指定计算模型?例如,如果我们采用简单的无上下文语法,例如

G ::= '1' -> '0' '+' '1'
      '1' -> '1' '+' '0'
      '2' -> '2' '+' '0'
      '2' -> '1' '+' '1'
      '2' -> '0' '+' '2'
      '3' -> '3' '+' '0'
      '3' -> '2' '+' '1'
      '3' -> '1' '+' '2'
      '3' -> '1' '+' '2'

假设解析器不区分终端符号和终端符号,如我在此处所演示的,则可以对不超过3的数字执行简单的算法。

例如,取字符串

"2 + 0 + 1"

在此字符串上运行LR(1)解析器应为我们提供以下具体的语法树,其中计算结果存储在树的根目录中:

           '3'
         /  |  \
        /   |   \
      '2'  '+'  '1'
     / | \
    /  |  \
  '2' '+' '0' 

因此,如果我们将语法作为程序,将语法分析器生成器作为编译器,能否将语法规范语言视为一种编程语言

此外,我们是否可以通过指定语法来构建图灵完备的程序,就像您可以使用celullar自动机lambda演算来构建图灵完备的程序一样

换句话说,已知在识别语言的意义上,常规语言对应于有限状态自动机,无上下文语言对应于下推自动机,而上下文相关语言对应于线性有界自动机。但是,如果我们将语法视为计算设备(即上述示例中的程序),那么如何在Chomsky层次结构中对每类语法的计算强度进行分类?

另外,诸如此类的鲜为人知的语法子类又如何呢?

编辑:顺便说一句,这是我自己的问题,但我没有提到我没有为示例语法提供任何起始符号,并且在区分终端和非终端时需要挥手挥手。从技术上或传统上,我认为语法可能必须以这种更复杂的形式编写(其中S是起始符号,$表示流末尾):

G ::= S -> R0 '$'
      S -> R1 '$'
      S -> R2 '$'
      R0 -> '0'
      R0 -> R0 '+' '0'
      R1 -> '1'
      R1 -> R0 '+' '1'
      R1 -> '1' '+' R0
      R1 -> R0 '+' '1' '+' R0
      R2 -> '2'
      R2 -> R0 '+' '2'
      R2 -> '2' '+' R0
      R2 -> R0 '+' '2' '+' R0
      R2 -> R1 '+' '1'
      R2 -> R1 '+' '1' '+' R0

...并不是说它确实可以改变任何东西,但我想我应该提一下。

编辑:当我阅读gasche的答案时,想到的另一件事是在我的示例中树中的每个分支都代表一个子计算。如果您将每条生产规则视为一个函数,其中LHS表示结果而RHS表示其参数,则语法的结构将决定函数的组成方式。

换句话说,解析器的上下文及其先行机制不仅有助于确定要应用的功能(如参数多态性等“ kinda”),而且还应确定如何将它们组合在一起以形成新功能。

至少,我想您可以针对明确的CFG用这种方式看待它,对于其他语法而言,精神体操现在对我来说有点过分。


3
您忘记提及可视下推式自动机(嵌套单词)了,它是一个如此可爱而有前途的设备!这很重要,因为对正则表达式的解析似乎很小,它能够解析以流行编程语言编写的程序。(cis.upenn.edu/~alur/nw.html
安格

1
谢谢,这非常有趣,我还没有查找!还有其他几个我也踊跃,如确定性的上下文,树毗邻,索引等等,我想这可能是有点多的一个问题...但也许我也会将它们添加
Rehno Lindeque

1
@imz是指语法,它们是在chomsky层次结构中正式定义的(即,表示形式)。由于我确切地说的是您的意思:语法是程序,所以它仅表示可以用语法表示的程序类别(这是问题所在)。
雷诺·林德克

1
@imz说实话,我真的不熟悉索引语法,我只是将它们添加为事后思考。
Rehno Lindeque'5

1
我开始认为将这个问题发布到LtU论坛而不是看酷的讨论:P可能是一个好主意。顺便说一句,@ imz,也许最好将问题读为“ Jukka在Marc Hamman的答案中描述的'功能性'意义上的哪些语法类别与哪些程序相对应”。也许我应该让事情更清楚...
Rehno Lindeque 2011年

Answers:


10

乔姆斯基0型语法和图灵机之间存在一对一的对应关系。

这是在Thue编程语言中开发的,该语言可让您编写由初始字符串和一组字符串重写规则(半Thue语法,等效于0型语法)指定的图灵完整程序。

更新:

除了像Thue这样深奥的“ Turing tar-pit”语言之外,在分析编译阶段,可以使用允许程序员扩展自己的语法的各种通用语言来执行Turing-complete计算。

Lisp家族中的语言,尤其是Common Lisp,可能是最明显的例子,但是,从广义上讲,具有静态类型检查且不需要总是停止的语言,例如带有模板的C ++ScalaQi


但是问题是,事情反方向起作用:得出的结果不是通过根据规则重写符号的初始序列而得出的,而是在该问题中由语法定义的计算的“结果”是初始的可以根据语法规则产生“输入”序列的符号。
imz –伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2011年

2
concat(quote(in),out)TM(in)=out

我同意Type0语法和TM之间的对应关系是对问题的有效答案(特别是,如果仅限于计算是/否函数)。通过引入一些约定如何表示输入输出对来用语法为任意TM建模的进一步建议在我看来与原始问题的预期目的不符
:(待续

我将其理解为一个问题,该问题是为了充分利用现有的语法框架和相应的解析器来执行计算,即,函数f和语法之间的转换的允许形式只能是:输入I被解析为S表示f(我)= S。
imz –伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2011年

1
从表面上看,Thue编程语言似乎不属于这种使用语法框架的语言:尽管它具有重写规则(如语法),但输入结果的计算却朝着规则的方向发展,而不是相反Rehno想要的方向。(但是也许只是改变生产中箭头的方向而已:将这个Q的意义上的“作为解析器的计算”语法转换为Thue可能只是改变规则的方向,然后是Thue程序会到达结果的起始符号,不是吗?。)
imz – Ivan Zakharyaschev 2011年

6

我的回答并非旨在成为正式,精确且绝对是主题性的。我认为马克·哈曼(Marc Hamman)的回答很扎实,但是您的问题使我想到了一个相关的话题。

语法可以看作是演绎系统的特殊情况:输入是判断,而解析树是判断的派生,或者证明证明是有效的(根据(语法)规则)。

从这个意义上讲,您的问题可能与逻辑编程/证明搜索社区的某些部分的方法(例如,我在考虑Dale Miller)有关,即证明搜索具有计算内容,而不是经典的类型/证明理论的观点,计算是证明归一化

备注:重新阅读我的答案,我认为“解析树构造就是证明搜索”的想法在这里有点牵强。证明搜索的方向相反:从给定的,相当复杂的判断开始,并且通过反复使用在证明结构上使用的推理规则,人们有望获得不需要进一步证明的更简单的公理。因此,用语法术语将复杂的判断视为非终结点,将原子视为终结点,并将证明搜索视为单词生成问题或非空性测试,将更为自然。


很有意思的话。我的大脑有点累了,无法立即做出好的响应,但是在我的示例中,树的分支实质上代表了根据解析规则组成的子计算……
Rehno Lindeque 2011年

6

此外,我们可以通过指定语法来构建图灵完备的程序吗?

我不确定我是否正确理解了您的问题,但是如果您正在寻找一种基于字符串重写系统的编程语言,您可能会对Refal感兴趣,后者是基于Markov算法形式主义(一种Turing-完整的形式主义,也是类似语法的字符串重写系统)。


1
我通过以下方式理解了这个问题:Rehno对Bootom-up解析过程(由语法定义)感兴趣,可以将其视为结果的计算。计算应从与语法产生规则相反的方向上的各个部分构建结果。Refal的重写规则(IIUC,类似于上面提到的Thue编程语言)将朝另一个方向发展(从输入到结果)。
imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2011年

现在,我考虑了一下,上下文相关的语法在生产规则的LHS上有多个符号。因此,我认为没有实际的实际差异。无论您如何看待,上下文相关语言的解析器都将是字符串重写系统。
雷诺·林德克

@imz感谢您对Rehno问题的澄清。@Rehno“上下文敏感语言的解析器将是一个字符串重写系统,无论您如何看待它正确吗?” —可能有意义,是的。
Artem Pelenitsyn

但是,Refal的重写规则是否得到不确定性的对待?(或者换句话说:Refal会在寻找有效的重写路径时进行回溯吗?)如果我们要使用反向的重写规则来对这种“作为计算进行解析”的方法进行建模,则需要非确定性规则;考虑一下语法S -> A a; S -> B b; A -> 0; B -> 0。如果我们通过逆转规则对此进行编程,则需要0在运行时选择不同的规则进行处理,以将“ 0a”或“ 0b”评估为S
imz –伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2011年

6

(仅是一些琐碎的考虑。可以是评论,但时间太长。)

实际上,您所描述的内容实际上是一种关于语言是什么(在人类对“语言”及其目的的理解)以及语法如何定义语言的非常自然的观点

一种语言包含(无限多种)正确的语法形式,这些语法形式被解释为提供语义值

如果解释是可计算的,则可以将语言的语法形式视为计算语义值的程序。

如果我们假设一种语言是作为一种有限的设备实现的,则可以将这种语言的有限表示形式称为“语法”。根据这种理解,语法不仅关心语法,而且也关心语义,即,如何根据表达式的各个部分的值(原子部分及其值存储在“词典”中)来计算整个表达式的语义值。 。

一些自然语言理论具有这样的形式(与上述考虑相一致的形式; @gasche的答案已在此处提及):一种演绎系统,用于搜索输入的派生(加上语义的计算)值或证明条款的建立;请参阅Curry-Horward对应)。因此,如果我们查看这样的系统并考虑它们的语法,那么您的问题就变得微不足道了:这些系统是完全按照您描述的方式进行计算的。

fGI f(I)=SISG

(实际上,用于编程语言的真正的编译器看起来更像是一个具有语法和语义的系统:它们将程序的句法形式转换为可执行文件,这是程序的语义,而不仅仅是到起始符号。的语法。)


4

只需添加:

纯逻辑程序具有声明性阅读和过程性阅读。本报告讨论了可以通过语法阅读来补充这些思想的想法,其中子句被认为是语法的重写规则。目的是表明这种观点有助于将专业知识从逻辑编程转移到其他有关编程语言的研究,反之亦然。讨论了此类转移的一些示例。另一方面,所呈现的语法观点证明了对纯逻辑编程的一些特殊扩展是合理的,并促进了此类扩展的理论基础的发展。

Pierre Deransart和Jan Maluszynski 的逻辑编程语法视图


显然,Prolog源自属性语法,因此这种观点是逻辑编程的开始。
reinierpost 2014年

1

像Peano数字这样的东西呢:

S    -> int
int  -> zero
int  -> succ
zero -> "0"
succ -> "#" int

它将识别此格式的任何字符串(数字):

0   // zero
#0  // one
##0 // two

它应该返回一个嵌套结构,深度为数字。

但是当人们只想说加法时,它就会变得复杂起来:

S    -> int
int  -> sum
int  -> zero
int  -> succ
zero -> "0"
succ -> "#" int
sum  -> int "+" int

这是完全合理的,因为它将只识别格式良好的int,如下所示:

#####0 + ####0

但是,只要有总和,此语法就会在解析树中引入一个拆分,因此,我们没有一个直接映射到数字的漂亮的一枝树,而是拥有表达式的结构,但距离有效值还有一些计算值。因此,不进行任何计算,仅进行识别。问题可能不是语法而是解析器。一个人可以改用别的东西,比如idk ...我想到的另一点是语法形式主义足以表达计算。当您查看Peano公理(采用类似Haskell的表示法)时:

1) Nat = Zero
2) Nat = Succ Nat
3) Sum ( Succ X ) ( Y ) = Succ ( X + Y )
4) Sum Zero X = X

第三条规则明确规定了转换。谁能想象在上下文无关的语法规则中具有相同的含义。如果是这样,怎么!?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.