Questions tagged «formal-languages»

与形式语言,语法和自动机理论有关的问题

2
如何证明一种语言是上下文无关的?
有许多技术可以证明某种语言不是上下文无关的,但是如何证明一种语言不是上下文无关的? 有什么技术可以证明这一点?显然,一种方法是展现该语言的上下文无关语法。是否有系统的技术来查找给定语言的无上下文语法? 对于常规语言中,有 系统的方法来得到一个正规文法/状态自动:例如,迈希尔-尼罗德定理提供了一种方法。上下文无关的语言是否有相应的技术? 在这里,我的动机是(希望)建立一个参考问题,其中包含一系列试图证明给定语言不受上下文限制时通常有用的技术。由于这里有很多问题是特殊情况,因此,如果我们能记录面对此类问题时可以使用的通用方法或通用技术,那就太好了。

6
编程语言,正则表达式和形式语言之间的关系是什么
我在网上四处寻找这个问题的答案,似乎每个人都隐含地知道答案,除了我。据推测,这是因为唯一关心的人是受过该学科高等教育的人。另一方面,我却被高中作业深深吸引。 我的问题是,编程语言与形式语言到底有什么关系?在我读过的任何地方,都说着类似“形式语言用于定义编程语言语法”的内容。 现在,根据我的能力,正式语言是一系列适用于一组特定符号(该语言的字母)的生产规则。这些生产规则定义了一组转换,例如: b -> a aaa->c 可以这样应用: abab->aaaa aaaa-> ca 顺便提一句,如果我们将形式语言的字母定义为{a,b,c},则a和b是非终结符,而c是终结符,因为它不能转换(如果我错了,请纠正我那)。 那么,考虑到所有这些,这到底在编程语言中有什么用呢?通常还会指出,正则表达式用于解析其文本形式的语言,以确保语法正确。这很有道理。然后说明正则表达式是由正式语言定义的。正则表达式返回true或false(至少以我的经验),这取决于代表正则表达式的有限状态自动机是否达到目标点。据我所知,这与转换无关。 对于程序本身的编译,我认为一种形式语言可以将代码转换为连续的较低级别的代码,并最终通过一组复杂的规则到达汇编,然后硬件可以理解这些规则。 从我的困惑来看,这就是事实。我所说的内容可能有很多根本上的错误,这就是为什么我要寻求帮助。 *除非您认为某条(a|b)*b*c->true规则类似于生产规则,否则在这种情况下该规则需要一个有限状态自动机(即regex)。就像我们刚才说的那样,这没有任何意义

1
“密集”正则表达式生成
这是一个正则表达式的猜想: 对于正则表达式,令长度是其中的符号数,忽略括号和运算符。例如RRR|R||R||R||0∪1|=|(0∪1)∗|=2|0∪1|=|(0∪1)∗|=2|0 \cup 1| = |(0 \cup 1)^*| = 2 猜想:如果并且包含长度为每个字符串 或更小,则。|R|>1|R|>1|R| > 1L(R)L(R)L(R)|R||R||R|L(R)=Σ∗L(R)=Σ∗L(R) = \Sigma^* 也就是说,如果在的长度范围内“密集” ,则实际上会生成所有东西。L(R)L(R)L(R)RRRRRR 一些可能相关的事情: 仅需要一小部分即可生成所有字符串。例如,对于二进制,将对任何。RRRR=(0∪1)∗∪SR=(0∪1)∗∪SR = (0 \cup 1)^* \cup SSSS 在某个时刻,中必须有一颗Kleene星。如果没有,它将丢失一些小于字符串。。RRR|R||R||R| 很高兴看到一个证明或反例。在某些情况下,我错过了很明显的错误吗?有人看过(或类似的)东西吗?


3
NFA的等效DFA达到最大大小的条件是什么?
我们知道DFA在表达能力上等同于NFA。还有一种已知算法的NFA转换成有限自动机(可惜我现在知道算法的发明者),在最坏的情况下为我们提供了2S2S2^S状态,如果我们的NFA有SSS的状态。 我的问题是:什么决定最坏的情况? 这是模棱两可的情况下算法的转录: 令为NFA。我们构建了一个DFA 甲' = (Q ',Σ ,δ ',q ' 0,˚F '),其中A=(Q,Σ,δ,q0,F)A=(Q,Σ,δ,q0,F)A = (Q,\Sigma,\delta,q_0,F)A′=(Q′,Σ,δ′,q′0,F′)A′=(Q′,Σ,δ′,q0′,F′)A' = (Q',\Sigma,\delta',q'_0,F') ,Q′=P(Q)Q′=P(Q)Q' = \mathcal{P}(Q) ,F′={S∈Q′|F∩S≠∅}F′={S∈Q′|F∩S≠∅}F' = \{S \in Q' | F \cap S \neq \emptyset \} ,和δ′(S,a)=⋃s∈S(δ(s,a)∪δ^(s,ε))δ′(S,a)=⋃s∈S(δ(s,a)∪δ^(s,ε))\delta'(S,a) =\bigcup_{s \in S} (\delta(s,a) \cup \hat \delta(s,\varepsilon)) ,q′0={q0}∪δ^(q0,ε)q0′={q0}∪δ^(q0,ε)q'_0 = \{q_0\} \cup \hat \delta(q_0, \varepsilon) 其中δ是所述扩展过渡函数甲。δ^δ^\hat\deltaAAA

4
建构主义逻辑中是否存在不确定的语言?
建构主义逻辑是一个排除公理的排除中间定律和双重否定的系统。它在Wikipedia的此处和此处进行了描述。特别是,该系统不允许矛盾证明。 我想知道,是否有人熟悉这如何影响有关Turing Machines和形式语言的结果?我注意到,几乎所有关于语言不确定性的证明都依赖于矛盾证明。对角化论证和归约概念都以这种方式工作。会否存在一种不确定语言存在的“建设性”证据?如果是,那它将是什么样? 编辑:很清楚,我对建构主义逻辑中的矛盾证明的理解是错误的,答案已经澄清了这一点。

1
是否有任何可识别EPAL的非常规CFG解析算法?
EPAL,甚至回文的语言,被定义为以下明确的上下文无关语法生成的语言: S→aaS→aaS \rightarrow a a S→bbS→bbS \rightarrow b b S→aSaS→aSaS \rightarrow a S a S→bSbS→bSbS \rightarrow b S b EPAL是许多解析算法的“祸根”:我还没有遇到任何能够解析任何描述该语言的语法的CFG解析算法。它通常用于表明存在明确的CFG,而这些CFG无法被特定的解析器解析。这激发了我的问题: 是否有一些解析算法仅接受适用于EPAL的明确CFG? 当然,可以为语法设计一个临时的两次通过语法分析器,以线性时间解析语言。我对解析不是专门为EPAL设计的方法感兴趣。

2
与Perl兼容的正则表达式可以识别哪些语言?
就像标题所说的那样,上周末我花了几个小时试图确定与Perl兼容的正则表达式匹配的语言类别,但不包括允许在模式内执行任意代码的任何匹配运算符。 如果您不知道什么是PCRE,请阅读此内容和本内容。 问题在于,Internet上可用的资源几乎都停留在上下文无关的语言中,PCRE可以匹配的资源更多(参见下文);但是我真的不知道在哪里可以找到更多关于这类东西的定理或论文。 特别是:PCRE显然是常规语言的超集(因为PCRE语法具有所有常规语言运算符)。 任何CFG都可以Greibach正常形式放置,从而消除了左递归。我认为可以通过(?(DEFINE)...)组的方式将语法“翻译”为匹配的子例程,从而避免通过翻译而使左递归阻塞: 每个生产的开头的非终止符成为子例程 (?<HEAD>...) 每个产品的主体都放在子例程中;终端保持原样,非终端成为过程调用(即(?&NONTERMINAL)); 通过|操作员将所有具有与头部相同的非终结符的产品进行“或” 运算((?:...)如果需要,还可以加上与的附加分组) 然后,模式变成一个(?(DEFINE)...)包含所有“翻译的”产生式的组,以及对起始符号过程的调用,以匹配整个字符串,即^(?(DEFINE)...)(?&START)$ 这应该处理任何CFG。因此,PCRE应该能够匹配任何CFL。 还有更多:让我们采用简单的语言 即字符串的语言重复两次。该语言不是CFL-CFL的抽奖引理失败。(尤其要注意 必须保持,因此,您不能仅泵送两个重复字符串的开头或结尾。)| v x w | ≤ pL = { w w | w ^ ∈ Λ∗}大号={ww|w∈Λ∗}L = \{ ww | w \in \Lambda^* \} | vxw | ≤p|vXw|≤p |vxw| \leq p 但是,PCRE可以轻松匹配此语言:^(.*)\1$。因此,我们绝对超越CFL。 以上多少?好吧,正如我所说,我不知道。我找不到关于CSL或介于两者之间的所有其他类的任何资源来下定决心。有专家愿意讨论这个吗? 附录:要求我确切指定必须允许PCRE语法的哪个子集。正如我在文章开头所写的那样,我想排除任何允许在模式内部执行任意代码的运算符,例如??{}。 就参数而言,我认为我们可以坚持使用pcresyntax(3)手册页定义的语法,该语法是Perl 5.10-5.12提供的内容的合理子集,减去了标注(因为它们不在模式内)。我不确定添加或删除回溯控制动词会改变我们可以识别的语言;如果是这样,那么弄清楚我们有哪些类和没有这些类会很好。

1
如何显示L = L(G)?
通过提供正式的语法来指定正式的语言是一项常见的任务:我们不仅需要语法来描述语言,而且还要解析它们,甚至需要进行适当的科学学习。在所有情况下,重要的是手头的语法正确无误,即能准确生成所需的单词。 我们经常可以在较高层次上争论为什么语法可以充分表达所需语言,而没有形式化证明。但是如果我们出于某种原因有疑问或需要正式证明怎么办?我们可以应用哪些技术? 这应该成为参考问题。因此,请谨慎给出一般的,有说服力的答案,至少由一个例子说明了这一点,但仍然涵盖了许多情况。谢谢!

2
是否有一种“自然的”不确定的语言?
是否有任何无法确定的“自然”语言? “自然”是指直接由字符串属性定义的语言,而不是通过机器及其等效语言定义的语言。换句话说,如果语言看起来像 其中,中号是TM,DFA(或普通EXP),PDA(或语法),等,然后大号是不自然的。然而大号= { X Ÿ ... | X 是Y的前缀... }是很自然的。大号= { ⟨ 中号⟩ | ... }大号={⟨中号⟩∣…} L = \{ \langle M \rangle \mid \ldots \}中号中号M大号大号L L = { x y... | X 是Y的前缀... }大号={Xÿ…∣X 是y的前缀…}L = \{xy \ldots \mid x \text{ is a prefix of y} \ldots \}


1
无上下文语言的机器,不会因不确定性而获得额外的功能
考虑计算的机器模型时,Chomsky层次结构通常由(按顺序),有限自动机,下推自动机,线性界自动机和图灵机来表征。 对于第一个和最后一个级别1(常规语言和递归可枚举语言),无论我们考虑确定性机器还是非确定性机器,即DFA等同于NFA,DTM等同于NTM 2,对模型的功能都没有影响。 但是对于PDA和LBA,情况则有所不同。与非确定性PDA相比,确定性PDA识别的语言严格更少。确定性LBA是否与非确定性LBA一样强大,这也是一个重大的开放性问题[1]。 这提示了我的问题: 是否存在一种可以描述上下文无关语言的机器模型,但对于非确定性而言,机器模型没有额外的功能吗?(如果没有,那么CFL是否具有某些特性可以说明其原因?) (对我而言)似乎不太可能证明无上下文语言以某种方式需要非确定性,但是似乎没有(确定的)确定性机器足以满足要求的机器模型。 扩展问题是相同的,但是对于上下文相关的语言。 参考文献 S.-Y. Kuroda,“语言和线性绑定自动机的类”,信息与控制,7:207-223,1964。 脚注 意见的补充问题是,乔姆斯基层次结构的级别(按集合包含排序)是否为3到0而不是0到3? 明确地说,我说的是只能识别的语言。显然,复杂性问题会受到这种变化的根本影响。

2
我们知道,上下文无关的语言不会在补充条件下封闭。 据我了解,上下文无关的语言是某些字母的的子集,在complement(!?)下关闭 a ,b一种∗b∗a∗b∗a^*b^*一,ba,ba,b 这是我的论点。每个CF语言都有一个半线性的Parikh图像。半线性集在补码下是封闭的。代表半线性集的向量集可以轻松地转换为线性语法。π (大号)= { (米,Ñ )| 一米b Ñ ∈ 大号}大号LLπ(L )= { (m ,n )∣ a米bñ∈ 大号}π(L)={(m,n)∣ambn∈L}\pi(L) = \{ (m,n) \mid a^mb^n \in L \} 题。是否有对此事实的易于访问的参考? 从技术上讲,这些语言称为有界语言,即的某些单词。 w 1,… ,w kw∗1个… w∗ķw1∗…wk∗w_1^* \dots w_k^*w1个,… ,wķw1,…,wkw_1,\dots,w_k 我对此问题的动机来自于最近一个关于的上下文无关性的问题。在补码似乎更易于处理。a ∗ b ∗{ añb米| ñ2≠ m }{anbm∣n2≠m}\{ a^nb^m \mid n^2 \neq …

3
简单有限正则语言的抽取引理
维基百科对常规语言的抽水引理有以下定义... 令为常规语言。然后存在一个整数 ≥1仅取决于使得每个字符串在至少长度的(被称为“抽长度”)可被写为 = (即,可分为三个子字符串),满足以下条件:p L w L p p w x y z wLLLpppLLLwwwLLLppppppwwwxyzxyzxyzwww | | ≥1yyy | | ≤pxyxyxyppp 对于所有 ≥0, ∈X ÿ 我 ž 大号iiixyizxyizxy^izLLL 我看不到对于简单的有限规则语言是如何满足的。如果我有{字母表 }和正则表达式然后只包含一个字,其中接着。现在,我想看看我的普通语言是否满足抽水式引理。a b L a ba,ba,ba,babababLLLaaabbb 由于在我的正则表达式中没有任何重复,因此的值必须为空,以便对所有都满足条件3 。但是,如果是这样,则它会失败,条件1说长度必须至少为1!我ÿyyyiiiyyy 相反,如果我让为,或那么它将满足条件1但失败条件3,因为它实际上从未重复过。a b a byyyaaabbbababab 我显然很想念一些显而易见的东西。哪一个

3
解析任意上下文无关的语法,主要是简短的摘要
我想解析用户定义的域特定语言。这些语言通常接近数学符号(我不是在解析自然语言)。用户以BNF表示法定义其DSL,如下所示: expr ::= LiteralInteger | ( expr ) | expr + expr | expr * expr 像输入1 + ( 2 * 3 )必须接受,而像输入1 +必须予以拒绝为不正确,并输入像1 + 2 * 3必须被拒绝暧昧。 这里的中心难题是以一种用户友好的方式处理模棱两可的语法。限制语法的唯一性不是一种选择:这就是语言的方式-想法是作者宁愿在不必要时避免使用括号来避免歧义。只要表达式不是模棱两可的,我就需要解析它,如果不是,我就必须拒绝它。 我的解析器必须能够处理任何与上下文无关的语法,即使是模棱两可的语法,也必须接受所有明确的输入。我需要所有接受的输入的分析树。对于无效或模棱两可的输入,理想情况下,我希望得到良好的错误消息,但首先,我将尽我所能。 通常,我将在相对较短的输入上调用解析器,而偶尔会有较长的输入。因此,渐近更快的算法可能不是最佳选择。我想针对少于80个符号长的输入,大约20%和50个符号之间的19%以及很少的较长输入的1%的分布进行优化。无效输入的速度不是主要问题。此外,我希望大约每1000至100000个输入都可以修改DSL。我可以花几秒钟来预处理我的语法,而不是几分钟。 给定我的典型输入大小,我应该研究哪种解析算法?错误报告应该成为我选择的一个因素,还是应该专注于解析明确的输入并可能运行一个完全独立的,较慢的解析器以提供错误反馈? (在需要时(前一段时间)的项目中,我使用了CYK,实现起来并不难,并且可以很好地适应我的输入大小,但不会产生非常好的错误。)

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.