2009-04-01 10 views
0

私はと同じ番号で始まり、終わるすべての単語について、アルファベットのΣ = {a,b}にCFGを書こうとしています。中央には少なくとも1つのbがあります。文脈自由文法を書くにはどうすればいいですか?

私はCFG、変数、生産ルールなどの基本的な概念を理解しています。残念ながら、私は前述のCFGを書くためのアイディアを使い果たしました。私がこれまで持っているすべては、私はプロダクションルールSXはできるだけ多くしてくれ両側に2つの** a ** sの文字列を与えることを考える

S → aYXYa 
X → XbX | b | λ 
Y → ??? 

です** b **私は好きなように真ん中にいる。しかし、** b **の両側に** a **の数をどのように置くことができるのかよく分かりませんが、両側に** a **の数が正確に同じであることを確認しています。

どのような提案、解決策でも大歓迎です。ありがとう。

+0

両側に同じ数のaがあることを確認するには、制作ルールが常にaと一致していることを確認してください。 – Albert

+1

こんにちはアルバート、例を挙げていただけますか?ありがとう –

+0

ルール "X→XbX | b |λ"は必要以上に複雑ですが、はい、任意の数のbを作成します。 – Albert

答えて

3
 
S → aSa | B 
B → b | bB 

これはあなたが探しているCFGである必要があります。最初と最後で同じことを扱ったときは、同じvarが同じ方法で満たされることを保証できないことに注意してください。したがって、あなたはそれらを明示的にする必要があります。

+0

ありがとうございました!今度は私はついにつくることができます。 :) –

+0

それを言及しないでください。私は理論計算機科学へのイントロと私のユニークな楽しみを持っています(私のユニはそれを呼び出すのが好きです) – DBendit

+0

ハハ。あなたの幸せを祈ります! :) –

7

前にこのクラスを教えてくれた元教授のように、私はあなたに答えを与えるつもりはありません。しかし、私はあなたにヒントを与えるでしょう:

あなたは2つの部分、aとそれ以外の部分に分ける正しい考えがあります。しかし、あなたはどちらかを正しく実行していません。

最初に試してみてください:n ba nそこから分岐します。

希望に役立ちます。

+0

私のルールは、bを中央に配置する前に、まず両側にバランスの取れたaを配置する必要があることを意味しますか? –

+0

まあ、S = aSa | b最初に...次に2行目を見つけてください...しかし、うん... –

1

は、それは私のCS大学生の日以来、しばらくしているが、これは合理的になります。

S - > ASA | bX

X - > bX | E

基本的には、Sで始まり、必要な数だけaのペアを追加してから、Xに切り替えてbを必要な数だけ追加します。

+0

DBenditは6秒で私を打ち負かしました:) –

+0

心配しないで、あなたの答えもありがとう。私は少しだけあなたのソリューションを修正して、開始変数がaとbの追加を可能にする余分な変数(繰り返しのビット)を両側に受け入れるようにしました。 :) –

関連する問題