语法本身就是递归对象,因此答案似乎很明显:归纳法。就是说,细节往往很难正确。在续篇中,我将介绍一种技术,该技术可以减少对机械步骤的语法正确性证明,但前提是要进行一些创造性的预处理。
基本思想是不局限于语法和语言单词;以这种方式很难掌握语法的结构。相反,我们将讨论语法可以创建的一组句子。此外,我们将一个艰巨的证明目标分成许多更容易处理的小目标。
令为具有非终结点,终结点,规则和起始符号的形式语法。我们用表示可以从给定派生的句子集合,即。生成的语言是。假设我们想证明对于某些。ñ Ť δ 小号∈ Ñ θ (ģ )小号δ α ∈ θ (ģ )G=(N,T,δ,S)NTδS∈Nϑ(G)Sδģ 大号(ģ )= θ (ģ )∩ Ť *大号= 大号(ģ )大号⊆ Ť *α∈ϑ(G)⟺S⇒∗αGL(G)=ϑ(G)∩T∗L = L(G )大号⊆ Ť∗
安萨兹
这就是我们要做的。我们定义中号1个,… ,Mķ⊆ (Ñ∪ Ť)∗,使得
- ϑ (G )= ⋃我= 1ķ中号一世和
- 。Ť∗∩ ⋃我= 1ķ中号一世= L
虽然2.通常通过的定义是很清楚的,但是1.需要一些认真的工作。这两个项目一起明确表示L(G )= L(根据需要)。中号一世L(G)=L
为了便于表示法,让我们分别表示。中号= ⋃ķ我= 1中号一世
坎road的路
进行这种证明有两个主要步骤。
这是很具体的。细节取决于手头的语法和语言。
例
考虑语言
L = { añbñC米| Ñ ,米∈ Ñ }
语法,δ为G = ({ S,A},{a,b,c},δ,S)δ
SA→Sc∣A→aAb∣ε
为此,我们要证明。这个语法的工作阶段是什么?好吧,它首先生成c m,然后生成a n b n。这立即通知我们选择M i,即L=L(G)cmanbnMi
M0M1M2={Scm∣m∈N},={anAbncm∣m,n∈N},={anbncm∣m,n∈N}.
如和中号0 ∩ Ť * = 中号1 ∩ Ť * = ∅,第2项已经照顾。对于1.,我们将证明分为宣布的两部分。M2=L中号0∩ Ť∗= M1个∩ Ť∗= ∅
θ (ģ )⊆ 中号
我们按照的规则进行结构归纳。G
IA:由于我们成功地锚。小号= SC0∈ 中号0
IH:承担一些句子的集合,我们也知道X ⊆ 中号。X⊆ θ (ģ )X⊆ 中号
IS:设任意的。我们必须表明,任何形式的α具有和任何规则应用于未来,我们不会离开中号。我们通过完全区分大小写来做到这一点。通过归纳假设,我们知道(确切地)以下情况之一适用:α ∈ X⊆ θ (ģ )∩ 中号α中号
- ,即瓦特= 小号Ç 米一些米∈ Ñ。
可以应用两个规则,这两个规则都可以得出 M中的一个句子:
w ^ ∈ 中号0w = SC米米∈ Ñ
中号
- 和小号C米⇒小号Cm + 1∈ 中号0
- 。小号C米⇒甲 Ç米= 一个0一b0C米∈ 中号1个
- w∈M1w=anAbncmm,n∈N
- w⇒an+1Abn+1cm∈M1
- w⇒anbncm∈M2
- w∈M3w∈T∗
Since we have successfully covered all cases, the induction is complete.
ϑ(G)⊇M
We perform one (simple) proof per Mi. Note how we chain the proofs so "later" Mi can anchor using the "earlier" Mi.
- M1: We perform an induction over m, anchoring in Sc0=S and using S→Sc in the step.
- M2: We fix m to an arbitrary value and induce over n. We anchor in Acm, using that S⇒∗Scm⇒Acm by the former proof. The step progresses via A→aAb.
- M3: For arbitrary m,n∈N we use the former proof for S⇒∗anAbncm⇒anbncm.
This concludes the second direction of the proof of 1., and we are done.
We can see that we heavily exploit that the grammar is linear. For non-linear grammars, we need Mi with more than one variable parameter (in the proof(s)), which can become ugly. If we have control over the grammar, this teaches us to keep it simple. Consider as deterring example this grammar which is equivalent to G:
SAC→aAbC∣ε→aAb∣ε→cC∣ε
Exercise
Give a grammar for
L={bkal(bc)manbo| ķ ,升,米,Ñ ,Õ ∈ Ñ,ķ ≠ Ô ,2 升= Ñ ,米≥ 2 }
并证明其正确性。
如果遇到麻烦,请使用以下语法:
考虑 G = ({ S,B[R,B升,A ,C} ,{ a ,b ,c } ,δ,小号) 与生产
小号乙升乙[R一种C→ b Sb | 乙升∣ B[R→ b B升∣ b A→ B[Rb | 一b→ a A a a ∣ C→ b C C∣ b c b c
和 中号一世:
中号0中号1个中号2中号3中号4中号5= { b一世小号b一世| 我∈ Ñ }= { b一世乙升bØ| ø ∈ Ñ,我≥ ö }= { bķ乙[Rb一世| ķ ∈ Ñ,我≥ ķ }= { bķ一种一世一个一个2 我bØ| ķ ,ö ,我∈ Ñ,ķ ≠ ö }= { bķ一种升(b c )一世C一种2 升bØ| ķ ,ö ,升,我∈ Ñ,ķ ≠ ö }= L
非线性语法呢?
上下文无关语言类别的特征是Dyck语言:本质上,每种上下文无关语言都可以表示为Dyck语言和常规语言的交集。不幸的是,戴克语言不是线性的,也就是说,我们不能给出固有地适合这种方法的语法。
当然,我们仍然可以定义 中号一世并做证明,但对于嵌套归纳法和非嵌套归纳法而言,必将更加艰巨。我知道有一种可以在某种程度上有所帮助的一般方法。我们将ansatz更改为显示我们至少生成了所有必需的单词,并且生成了正确数量的单词(每长度)。正式地,我们表明
- θ (ģ )⊇ 大号 和
- | 大号(ģ)∩ Ťñ| = | 大号∩ Ťñ| 对所有人 Ñ ∈ Ñ。
这样,我们可以将自己限制在原始ansatz的“轻松”方向上,并利用该语言的结构,而忽略语法可能具有的过于复杂的功能。当然,没有免费的午餐:我们得到了数词的全新任务G为每个产生 Ñ ∈ Ñ。对我们来说幸运的是,这通常很容易处理。有关详细信息,请参见此处和此处 ¹。您可以在我的学士论文中找到一些例子。
对于模棱两可且不依赖上下文的语法,恐怕我们会回到ansatz语法和上限。
- 当使用该特定方法进行计数时,我们得到的好处是语法是明确的。反过来,这也意味着该技术必须针对模棱两可的语法而失败,因为我们永远无法证明2。