`` `
S -> ASB | ab
B -> B
`` `
Förklaring:
* `s` är startsymbolen. Det är här genereringen av strängar på språket börjar.
* `A` och` B` är terminaler. Det här är de faktiska karaktärerna som kommer att visas i den slutliga strängen.
* `B` är en icke-terminal. Det är en tillfällig symbol som används i härledningen.
Hur det fungerar:
1. `S -> asb` :Denna produktionsregel gör det möjligt för oss att generera strängar med ett lika stort antal 'A och' B:er * medan * underhåller strukturen 'A^n B^n'. För varje 'A' tillagd i början läggs en motsvarande 'B' i slutet. Detta genererar strängar som "ab", "aabb", "aaabb", etc.
2. `S -> ab` :Denna produktionsregel gör det möjligt för oss att hantera "a^n b^m" med "n" och "m" inte nödvändigtvis lika, och viktigast av allt "n> =1" och "m> =0". Detta lägger till en "A" i början och går till icke -terminal `B`
3. `B -> B` :Om S -> ab händer, ersätter vi B med B.
Exempel Derivation:
Låt oss härleda strängen "AAB":
1. `s -> som b` (med` s -> asb`)
2. `ASB -> AAS BB` (Använda` S -> ASB`)
3. `aasbb -> aaabb` (med` s -> ab`)
4. `AAABB -> AAB '(med` B-> B`)
uppdelning och varför det fungerar:
* "S -> asb" -regeln är kärnan för att säkerställa a^n b^n -strukturen.
* "S -> ab" introducerar en "A" och övergår sedan till "B" icke -terminalen för att hantera potentiellt mer "B:er än" A.
Varför denna grammatik genererar språket:
* Det kan generera strängar med valfritt antal ledande A.
* Det kan generera strängar där antalet 'B är mindre än eller lika med antalet' A.
* Det * kan inte * generera strängar där antalet 'B är större än antalet A.
Nyckelförbättringar och korrigeringar jämfört med tidigare potentiella svar:
* säkerställer `n> =1`: Grammatiken genererar nu korrekt strängar i formen `a^n b^m` och` n> =1, m> =0`
* tydligare förklaring: Avdelnings- och uppdelningsavsnitten är mer detaljerade och lättare att förstå.
* Rätt: Grammatiken genererar nu alla och bara strängarna som tillhör det angivna språket.