如何证明语言是正规的?


48

有很多方法可以证明某种语言不是正规语言,但是我需要做些什么来证明某种语言是正规语言呢?

例如,如果给我是规则的,那么我怎么能证明后面的L ′也是规则的呢?大号大号′

大号′:={w∈大号:üv=w 对于 ü∈Σ∗∖大号 和 v∈Σ+}

我可以画一个不确定的有限自动机来证明这一点吗?


1
您的的定义中有错别字,请编辑以解决。L′
— Ran G.

2
“绘画”没有证据;您必须提供NFA并证明它接受该语言。
— 拉斐尔

我认为语言定义仍然没有意义...
— hugomg

2
无论如何,如果问题是“我可以画一个NFA来证明它是正常的”,则该特定语言是无关紧要的。@corium,我们可以编辑问题以反映更笼统的问题:“如何证明特定的是规则的”吗?大号
— Ran G.

Answers:


48

是的,如果您可以提出以下任何一项建议:

对于某些语言,则L是规则的。还有更多的等效模型,但以上是最常见的。大号大号

在“计算”世界之外,还有一些有用的属性。如果也是正规的大号

  • 这是有限的
  • 您可以通过对常规语言执行某些操作来构造它,而这些操作对于常规语言是封闭的,例如

    • 路口,
    • 补充,
    • 同态
    • 逆转
    • 左或右商
    • 定期转导

    还有更多,或者

  • 如果L的等价类的数量是有限的,则使用Myhill-Nerode定理。大号

在给定的示例中,我们有一些(常规)语言作为基础,并且想说一些关于从中衍生的语言L 的信息。遵循第一种方法-为L '构建一个合适的模型-我们可以假设我们想要的L的任何等效模型;当然,由于L未知,它将保持抽象。在第二种方法中,我们可以直接使用L并对其应用闭包属性,以获得对L '的描述。大号大号′大号′大号大号大号大号′


4
值得一提的是,证明一种语言是有限的就足以表明它是正规的。这很有用,特别是在非构造性案例证明中。
— Patrick87

2
编程语言中发现的regexp可以做的比常规语言要多得多。您必须限制为“经典”构造。
— 大卫·路易斯

4
@DavidLewis:在此站点上,您可能会假设“正则表达式”是指经典概念。
— 拉斐尔

@DavidLewis我同意,应该在理论上避免“ regexp”,以避免混淆。
— 拉斐尔

请注意,对于前四个项目符号中的任何一个,您都需要证明您的陈述确实正确的证据。
— 拉斐尔

10

基本方法

  1. 有限自动机(可能不确定,具有空过渡)。
  2. 常用表达。
  3. 右(或左,但不是全部)线性方程,例如,其中K和L是规则的。X=KX+LKL
  4. 常规(第3类)语法。
  5. 保留常规语言的运算(布尔运算,乘积,星号,混洗,态射,态射逆,反转等)
  6. 由有限的半边形识别。

逻辑方法(通常用于形式验证)

  1. Monadic二阶逻辑(布奇定理)。
  2. 线性时间逻辑(坎普定理)。
  3. 拉宾树定理(具有两个后继的单子二阶逻辑)。很强大。

先进的方法

  1. 复杂的抽水引理。例如,参见
    [1] J. Jaffe,《常规语言的必要而充分的抽取引理》,Sigact News-SIGACT 10(1978)48-49。
    [2] A. Ehrenfeucht,R。Parikh和G. Rozenberg,《常规集的抽水引理》,SIAM J. Comput。 10(1981),536-541。
    [3] S. Varricchio,规则集的抽水条件,SIAM J. Comput。 26(1997)764-771。

  2. 好准订单。参见
    [4] W. Bucher,A。Ehrenfeucht,D。Haussler,关于由导数关系产生的总调节器,Theor。计算 科学 40(1985)131–148。
    [5] M. Kunz,语言不等式和良好拟序的正则解。

  3. 支持有理数列。ñ

  4. 基于转导的代数方法(另请参见保留常规语言的操作)。


4

Ran G.的答案给出了相当广泛的等效模型列表,这些等效模型可用于指定常规语言(列表还在继续,双向自动机,MSO逻辑,但是在“更多等效模型”下的链接涵盖了')。正如拉斐尔(Raphael)强调的那样,我们需要一个论点来说服听众相信所选择的陈述确实是正确的。

重新考虑该问题,它添加了“例如 ”。这意味着我们必须给出一个有效的构造,在给定上述任何模型的情况下,我们假定指定语言L,都将该模型转换为L ′。通常,这将是同一类型的模型,但不必是:例如,我们可以从L的确定性FSA开始,到L '的确定性FSA 结束。…大号大号′大号大号′

这包括可能使用闭合操作:在例子中,明确给出的操作,我们有。大号′=(Σ∗∖大号)⋅Σ∗

因此,我的观点是,答案很不错,但是当我们不从头开始构建特定语言时,应该添加“从到L '的构造”。大号大号′


1
我不太确定你在做什么。如果我有某些模型,则可以将其转换为其他任何等效模型。L′
— 拉斐尔

@Raphael抱歉,我的意思是正确的。较早的答案似乎解释了我们可以构造语言的描述(如自动机,操作等)。我同意。但是,问题似乎与闭包属性有关,请参见给出的示例。在其他答案中,我没有提到这一点:要证明闭包属性,您假设您有一个描述,然后构造一个新的描述。
— Hendrik

1
啊,这个 !现在我明白了,我的坏。我同意,Ran的答案缺少这一方面。大号′
— 拉斐尔

1
我不确定为什么会丢失(或到底缺少了什么)。假设你有一个经常,和你想证明大号是有规律的,以及,你可以开始大号'的DFA,并用它来建立一个DFA的大号。但是,这是由“构造DFA的覆盖大号 ” ..有没有限制使用大号“自动完成这项任务(自然,如果大号通过定义大号',你将被迫使用大号' 的自动机。) 。这同样适用于正则表达式,闭合,语法等L′LL′LLL′LL′L′
— 冉G.

1
哦好的。实际上,我宁愿编辑问题,并删除“例如”部分,从而使问题更笼统,并为以后的类似问题提供参考。.(:
— Ran G.

4

有时你会遇到指定为“所有字符串语言,每一个ķ的-元素串小号满足,其中” ķ是一些固定不变的。在这种情况下,语言将是常规的。这里的想法是定义一个有限自动机,其某些状态“记住”最近出现的k个输入符号,如对该问题的回答。sķs<some property>ķķ


4

上面的答案未涵盖的另一种方法是有限自动机转换。举一个简单的例子,让我们展示在shuffle操作下常规语言是关闭的,定义如下: 您可以使用闭包属性在shuffle下显示闭包,但也可以直接使用DFA显示它。假设甲我 = ⟨ &Sigma; ,Q 我,˚F 我,δ

L1S⁡L2={x1y1…xnyn∈Σ∗:x1…xn∈L1,y1…yn∈L2}
是一个DFA接受大号我(为我= 1 ,2)。我们构建了一个新的DFA ⟨ &Sigma; ,Q ,˚F ,δ ,q 0 ⟩如下:Ai=⟨Σ,Qi,Fi,δi,q0i⟩Li一世=1个,2⟨Σ,问,F,δ,q0⟩
  • 状态集合是,其中,所述第三分量记住下一个符号是否是X 我(当1)或Ý 我(当2)。Q1×Q2×{1,2}xiyi
  • 初始状态是。q0=⟨q01,q02,1⟩
  • 接受状态为。F=F1×F2×{1}
  • 转移函数由下式定义和 δ (⟨ q 1,q 2,2 ⟩ ,σ )= ⟨ q 1,δ 2(q 2,σδ(⟨q1,q2,1⟩,σ)=⟨δ1(q1,σ),q2,2⟩。δ(⟨q1,q2,2⟩,σ)=⟨q1,δ2(q2,σ),1⟩

此方法的更复杂的版本涉及猜测。例如,让我们说明正则语言在反向(即 L下是关闭的 (这里(w 1 … w n )R = w n … w 1

LR={wR:w∈Σ∗}。
(w1…wn)R=wn…w1。)这是标准的闭包操作之一,反转下的闭包很容易来自对正则表达式的操作(可以将其视为正则表达式的有限自动机转换的对应项)–只需逆转正则表达式即可。但是您也可以使用NFA证明关闭。假设由DFA接受⟨ &Sigma; ,Q ,˚F ,δ ,q 0 ⟩。我们构造一个NFA ⟨ &Sigma; ,Q ',˚F ',δ ',q ' 0 ⟩,其中L⟨Σ,Q,F,δ,q0⟩⟨Σ,Q′,F′,δ′,q0′⟩
  • 状态集合是。Q′=Q∪{q0′}
  • 初始状态是。q0′
  • 唯一接受状态是。q0
  • 转换函数定义如下:,并且对于任何状态q ∈ Q和δ′(q0′,ϵ)=Fq∈Q, δ (q ',σ )= { q :δ (q ,σ )= q ' }。σ∈Σδ(q′,σ)={q:δ(q,σ)=q′}

(我们可以摆脱,如果我们允许多个初始状态。)这里的猜测成分是反转后的单词的最终状态。q0′


猜测通常还涉及验证。一个简单的例子是下闭合转动: 假设大号由DFA接受⟨ &Sigma; ,Q ,0 ⟩,其操作如下。NFA首先猜测q = δ (q 0,x )。然后验证δ

R(L)={yx∈Σ∗:xy∈L}.
L。我们构造一个NFA ⟨ &Sigma; ,Q ',˚F ',δ ',q '⟨Σ,Q,F,δ,q0⟩⟨Σ,Q′,F′,δ′,q0′⟩q=δ(q0,x)和 δ (q 0,X )= q,从移动 ÿ到 X的非确定性。可以将其形式化如下:δ(q,y)∈Fδ(q0,x)=qyx
  • 的状态是。除了初始状态q ' 0,状态是⟨ q ,Q′={q0′}∪Q×Q×{1,2}q0′,其中 q是,我们猜测的状态下, q Ç ù - [R [R是当前状态,和 š指定我们是否在该 ÿ⟨q,qcurr,s⟩qqcurrsy输入的一部分(1时)或输入的部分(2时)。x
  • 最终状态为:我们接受当 δ (q 0,X )= q。F′={⟨q,q,2⟩:q∈Q}δ(q0,x)=q
  • 跃迁实现猜测q。δ′(q0′,ϵ)={⟨q,q,1⟩:q∈Q}q
  • 过渡(每 q ,q Ç ù - [R [R ∈ Q和小号∈ { 1 ,2 })模拟原来的DFA。δ′(⟨q,qcurr,s⟩,σ)=⟨q,δ(qcurr,σ),s⟩q,qcurr∈Qs∈{1,2}
  • 过渡,对于每个 q ∈ Q和 q ˚F ∈ ˚F,实现从移动 ÿ部到 X部分。仅当我们在 y部分达到最终状态时,才允许这样做。δ′(⟨q,qf,1⟩,ϵ)=⟨q,q0,2⟩q∈Qqf∈Fyxy

该技术的另一种变体包括有界计数器。作为一个例子,让我们考虑改变编辑距离闭合: 给定一个DFA ⟨ &Sigma; ,Q ,˚F ,δ ,q 0 ⟩为大号,例如构建一个NFA ⟨ &Sigma; ,Q '

Ek(L)={x∈Σ∗: there exists y∈L whose edit distance from x is at most k}.
⟨Σ,Q,F,δ,q0⟩L为 ë ķ(大号)如下:⟨Σ,Q′,F′,δ′,q0′⟩Ek(L)
  • 状态集为,其中第二项计算到目前为止所做的更改次数。Q′=Q×{0,…,k}
  • 初始状态是。q0′=⟨q0,0⟩
  • 接受状态为。F′=F×{0,…,k}
  • 对于每一个我们必须转变⟨ δq,σ,i。⟨δ(q,σ),i⟩∈δ′(⟨q,i⟩,σ)
  • 插入由转换处理为所有 q ,σ ,我使得我< ķ。⟨q,i+1⟩∈δ′(⟨q,i⟩,σ)q,σ,ii<k
  • 缺失通过转换处理为所有q ,σ ,我使得我< ķ。⟨δ(q,σ),i+1⟩∈δ′(⟨q,i⟩,ϵ)q,σ,ii<k
  • 取代是类似地通过过渡手柄对所有q ,σ ,τ ,我使得我< ķ。⟨δ(q,σ),i+1⟩∈δ′(⟨q,i⟩,τ)q,σ,τ,ii<k

3

语言是常规语言,如果您可以编写一个扫描程序来决定任意字符串,则是否使用不超过固定数量的内存即可确定它们是否属于该语言-即可以在O(1)空间中进行识别。


O(1)空间,是什么意思?无论如何,DFA就足够了;可能值得在编程上明确指出这种等效性。
— 拉斐尔

是的,这只是一个不同的观点。
— reinierpost

3

正则表达式转换是证明某些操作下关闭的一种方法。简单的两个例子是在封闭的逆转之下,封闭同态。

rLLRL

  • ϵR=ϵσR=σ∅R=∅
  • (r1+r2)R=(r1R+r2R)(r∗)R=(rR)∗(r1r2)R=r2Rr1R

(r1r2)R=r2Rr1R(0∗1∗)R=1∗0∗rRLR

h:Σ→Δ∗rLh(L)σrh(σ)


0

另一种方法是使用您知道它们已关闭的操作来构建语言。这是对显示正则表达式的扩展,因为您还有更多可用的操作(反转字符串,补码,交点,切段,仅保留一部分,同构和反同构,...)


2
Ran的答案中已经提到了这一点。
— 拉斐尔
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.