これ以上必要になることはありません。あなたの言語は次のような特徴があります
- はRHSがちょうど
2
秒 ある
=
-
- 途中
にLHSが始まり、終了
2
とし、
2
sおよび
*
秒を持っている途中に持っています
- LHSとRHS上の
2
の数は等しい
- LHSには
**
が含まれていません。
これらのルールは、文法に入れるのは簡単です:
(P1) S -> 2=2
(P2) S -> 2S2
(P3) S -> 2*S2
最初のルールは、当社の基本ケースであると=
は常にLHS
とRHS
分離しなければならないことを立証します。また、LHS
は2
で終わらなければならず、RHSは2
で始まる必要があります。
第2および第3の規則は、2
を追加して、言語でより長い文字列を取得できるようにします。 2番目のルールでは、「いつでも2
をLHSの前面に置くことができます。そうした場合は、RHSの最後に1つ置く必要があります。 3番目のルールは、私たちがいる限り、我々はRHS」上に少なくとも1つのSを置くようLHSに*
を配置することができます
あなたの例:。
222*2*22=222222
S
2S2 P2
22S22 P2
222*S222 P3
222*2*S2222 P3
222*2*2S22222 P2
222*2*22=222222 P1
2*2*2=222
S
2*S2 P2
2*2*S22 P2
2*2*2=222 P3
2*222222*22=222222222
S
2*S2 P3
2*2S22 P2
2*22S222 P2
2*222S2222 P2
2*2222S22222 P2
2*22222S222222 P2
2*222222*S2222222 P3
2*222222*2S22222222 P2
2*222222*22=222222222 P1
ことを示し伴うだろうこの文法のための形式的な正しさの証明(a)言語のすべての文字列が生成され、(2)生成されたすべての文字列が言語に含まれています。 、P1によって生成されます。短い文字列は生成されません。 誘導仮説:長さがk
未満のすべての文字列が生成され、その言語で設定されていることを前提としています(これらの文字セットは長さが同じで、長さはk
です)。 誘導ステップ:k
以上の長さの文字列も一致している必要があります。長さがk
以上の文字列(あるいは文法によって生成されたもの)の場合は、22x22
または2*x2
の形式である必要があります。x
は別の文字列です(あるいは、文法によって生成されます)。 x
の長さがk
より小さいか、またはこの引数がx
自体に再帰的に適用されます。 x
は長さがk
未満であるため、誘導仮説は文法によって生成されることができることを意味します(あるいは、それは言語内にあります)。 P2の2つのアプリケーションとP3の1つのアプリケーション(または、言語そのものの定義によって)によって、両方の形式を生成することができます(あるいは、言語でもあります)。
UPDATE:
コメントは*
の数が2に固定されることになっていることを私の注意にしました。これには、文法の定義を変更する必要があります。
S -> 2S2 | 2*R2
R -> 2R2 | 2*T2
T -> 2T2 | 2=2
これは、上記の議論を比較的軽微で予測可能な方法で変更します。基本的には、P3のアプリケーション数を追跡し、2回目以降のアプリケーションを許可しないで、同時に2つ以上のアプリケーションを見た後ですべての非終端点を排除することができます。
これは明らかではありません - 有効な*数学的方程式だけを受け入れる文法を特定しようとしていますか? –
あなたが望むものは明確ではありません。通常、set-builderの表記法を使用するとき、 "|"の左側にあるのは、命題ではなく式です(セットの要素自体が真理値にならない限り)。 – pyon
また、公式言語理論では、通常、乗算およびべき乗演算子は、文字列の連結および繰り返しを示すためにオーバーロードされます。あなたが「2^x」と言うとき、xを2乗したり、「2」、「x回」を繰り返すことを意味します。 – pyon