====== Úkol 2 ====== Bc. Jan Kaláb %%%% ===== Příklad 1 ===== **Uvažte jazyk //L//₁ = {//wcⁱ// | //w// ∈ {//a//, //b//}* ∧ (#//a//(//w//) = //i// ∨ #//b//(//w//) = //i//)}**. **Sestavte gramatiku //G//₁ takovou, že //L//(//G//₁) = //L//₁.** //G//₁ = ({//S//, //A//, //B//}, {//a//, //b//, //c//}, //P//, //S//) //P//: * //S// → //A// | //B// | //ε// * //A// → //aAc// | //bA// | //ε// * //B// → //bBc// | //aB// | //ε// **Algoritmickým postupem převeďte gramatiku //G//₁ na zásobníkový automat provádějící syntaktickou analýzu zdola nahoru.** //M// = ({//q//, //r//}, {//a//, //b//, //c//}, {//S//, //A//, //B//, //a//, //b//, //c//, //#//}, //δ//, //q//, //#//, {//r//}) Reduce: * //δ//(//q//, //ε//, //A//) = {(//q//, //S//)} * //δ//(//q//, //ε//, //B//) = {(//q//, //S//)} * //δ//(//q//, //ε//, //bA//) = {(//q//, //A//)} * //δ//(//q//, //ε//, //aAc//) = {(//q//, //A//)} * //δ//(//q//, //ε//, //aB//) = {(//q//, //B//)} * //δ//(//q//, //ε//, //bBc//) = {(//q//, //B//)} * //δ//(//q//, //ε//, //ε//) = {(//q//, //A//), (//q//, //B//), (//q//, //S//)} Shift: * //δ//(//q//, //a//, //ε//) = {(//q//, //a//)} * //δ//(//q//, //b//, //ε//) = {(//q//, //b//)} * //δ//(//q//, //c//, //ε//) = {(//q//, //c//)} Accept: * //δ//(//q//, //ε//, //S#//) = {(//r//, //ε//)} **Lze jazyk //L//₁ přijmout deterministickým zásobníkovým automatem (DZA)? Zdůvodněte své tvrzení (formální důkaz se nepožaduje).** Nelze. Kvůli ∨ v zadání nevíme, zda použít podmínku #//a//(//w//) nebo #//b//(//w//), a nevíme tedy, zda na zasobníku počítat //b// nebo //a//. ===== Příklad 2 ===== **Mějme jazyky //L//₁ = {//aⁱbʲcⁱdʲ// | //i//, //j// ∈ ℕ} a //L//₂ = {//aⁱbⁱcʲdʲ// | //i//, //j// ∈ ℕ}.((0 ∈ ℕ)) Pro každý z jazyků //L//₁ a //L//₂ dokažte, nebo vyvraťte, zda je bezkontextový.** ==== L₁ ==== Důkaz sporem. Předpokládejme, že jazyk //L//₁ je bezkontextový. Pak podle pumping lemmatu pro bezkontextové jazyky existuje konstanta //k// taková, že je-li //z// ∈ //L//₁ a |//z//| ≥ //k//, pak lze //z// napsat ve tvaru: //z// = //uvwxy//, //vx// ≠ //ε//, |//vwx//| ≤ //k// a pro všechna //i// ≥ 0 je //uvⁱwxⁱy// ∈ //L//1. Zvolíme si //z// = //uᵏvᵏwᵏxᵏyᵏ//, |//z//| > //k//, //i// > 1, pak může dojít k následujícímu rozdělení: * //vwx// = //aᵐ//, //m// ≤ //k//, #//a//(//z//) ≠ #//c//(//z//) * //vwx// = //aᵐbⁿ//, //m// + //n// ≤ //k//, #//a//(//z//) ≠ #//c//(//z//) ∨ #//b//(//z//) ≠ #//d//(//z//) * //vwx// = //bᵐ//, //m// ≤ //k//, #//b//(//z//) ≠ #//d//(//z//) * //vwx// = //bᵐcⁿ//, //m// + //n// ≤ //k//, #//a//(//z//) ≠ #//c//(//z//) ∨ #//b//(//z//) ≠ #//d//(//z//) * //vwx// = //cᵐ//, //m// ≤ //k//, #//a//(//z//) ≠ #//c//(//z//) * //vwx// = //cᵐdⁿ//, //m// + //n// ≤ //k//, #//a//(//z//) ≠ #//c//(//z//) ∨ #//b//(//z//) ≠ #//d//(//z//) * //vwx// = //dᵐ//, //m// ≤ //k//, #//b//(//z//) ≠ #//d//(//z//) Ukázali jsme, že nelze najít takové rozdělení, které by splňovalo podmínky pumping lemmatu pro bezkontextový jazyk, což je spor, a jazyk tedy není bezkontextový. ==== L₂ ==== //G// = ({//A//, //S//, //T//}, {//a//, //b//, //c//, //d//}, //P//, //A//) * //A// → //ST// * //S// → //aSb// | //ε// * //T// → //cTd// | //ε// K jazyku //L//₂ lze sestavit bezkontextovou gramatiku, tudíž je bezkontextový. ===== Příklad 3 ===== **Mějme jazyky //L//₃ ∈ ℒ₃ a //L//₂ ∈ ℒ₂. Dokažte, že problém //L//₂ ⊆? //L//₃ je (eventuelně není) rozhodnutelný? K důkazu použijte uzávěrové vlastnosti bezkontextový a regulárních jazyků.** * Platí definice podmnožiny: L₂ ⊆ L₃ ⇔ L₂ ∩ L₃′ = ∅((′ značí doplněk)) * ℒ₃ jsou na doplněk uzavřené * ℒ₂ jsou uzavřené na průnik s ℒ₃ * Problém se tedy redukoval na prázdnost ℒ₂, a ten je rozhodnutelný. * Problém //L//₂ ⊆? //L//₃ je tady také rozhodnutelný. ===== Příklad 4 ===== **Uvažujte jazyk //L//₄, který je generován gramatikou\\ //G//₄ = ({//E//, //T//, //F//}, {//(//, //)//, //true//, //or//, //and//, //not//}, //P//, //E//), kde** **//P//:** * **//E// → //E or T// | //T//** * **//T// → //T and F// | //F//** * **//F// → //(E)// | //not(E)// | //true//** **Sestrojte //deterministický// zásobníkový automat přijímající jazyk //L//₄ a demonstrujte jeho funkci na přijetí řetězce //(true or not(true)) and true//.** {{ pda.png |Deterministický zásobníkový automat přijímající jazyk L4}}((U přechodu ve trvaru //a//, //b// / //xyz// považuji //z// za nový vrchol zásobníku.)) - //δ//(//S//, //(//, //#//) - //δ//(//S//, //true//, //]//) - //δ//(//Z//, //or//, //]//) - //δ//(//S//, //not//, //]//) - //δ//(//N//, //(//, //(//) - //δ//(//S//, //true//, //)//) - //δ//(//Z//, //)//, //)//) - //δ//(//Z//, //)//, //]//) - //δ//(//F//, //and//, //#//) - //δ//(//S//, //true//, //#//) ===== Příklad 5 ===== **Mějme gramatiku //G//₅ = ({//S//, //A//, //B//, //C//}, {//a//, //b//, //c//}, //P//, //S//), kde** **//P//:** * **//S// → //aACa//** * **//A// → //B// | //a//** * **//B// → //C// | //c//** * **//C// → //Cc// | //bC// | ε** **Převeďte gramatiku //G//₅ //algoritmicky// do Chomského normální formy.** Bez ε přechodů: * //Nε//⁰ = ∅ * //Nε//¹ = {//C//} * //Nε//² = {//C//, //B//} * //Nε//³ = {//C//, //B//, //A//} * //Nε//⁴ = {//C//, //B//, //A//} = //Nε//³ = //Nε// * //S// → //aACa// | //aAa// | //aCa// | //aa// * //A// → //B// | //a// * //B// → //C// | //c// * //C// → //Cc// | //b// | //bC// | //c// Bez jednoduchých pravidel: * //NS//⁰ = {//S//} * //NS//¹ = {//S//} = //NS//⁰ = //NS// * //NA//⁰ = {//A//} * //NA//¹ = {//A//, //B//} * //NA//² = {//A//, //B//, //C//} * //NA//³ = {//A//, //B//, //C//} = //NA//² = //NA// * //NB//⁰ = {//B//} * //NB//¹ = {//B//, //C//} * //NB//² = {//B//, //C//} = //NB//¹ = //NB// * //NC//⁰ = {//C//} * //NC//¹ = {//C//} = //NC//⁰ = //NC// * //S// → //aACa// | //aAa// | //aCa// | //aa// * //A// → //Cc// | //a// | //b// | //bC// | //c// * //B// → //Cc// | //b// | //bC// | //c// * //C// → //Cc// | //b// | //bC// | //c// Vlastní gramatika (odstranění zbytečných a nedostupných symbolů): * //V//₀ = {//S//} * //V//₁ = {//S//, //a//, //A//, //C//} * //V//₂ = {//S//, //a//, //A//, //C//, //c//, //b//} * //V//₃ = {//S//, //a//, //A//, //C//, //c//, //b//} = //V//₂ = //V// * //S// → //aACa// | //aAa// | //aCa// | //aa// * //A// → //Cc// | //a// | //b// | //bC// | //c// * //C// → //Cc// | //b// | //bC// | //c// Chomského normální forma: //G// = ({//S//, , , , //A//, //C//, //a//′, //b//′, //c//′}, {//a//, //b//, //c//}, //P//, //S//) //P//: * //S// → //a//′ | //a//′ | //a//′ | //a//′//a//′ * → //A// * → //Aa//′ * → //Ca//′ * //A// → //Cc//' | //a// | //b// | //b//′//C// | //c// * //C// → //Cc//' | //b// | //b//′//C// | //c// * //a//′ → //a// * //b//′ → //b// * //c//′ → //c// **Převeďte gramatiku //G//₅ //algoritmicky// do Greibachové normální formy.** Vlastní gramatika: * Viz převod do Chomského normální formy Odstranění levé rekurze (//S// < //A// < //C//): * //S// → //aACa// | //aAa// | //aCa// | //aa// * //A// → //Cc// | //a// | //b// | //bC// | //c// * //C// → //b// | //bC// | //bC//′ | //bCC//′ | //c// | //cC//′ * //C//′ → //c// | //cC//′ Greibachové normální forma: //G// = ({//S//, //A//, //C//, //C//′, //a//′, //c//′}, {//a//, //b//, //c//}, //P//, //S//) //P//: * //S// → //aACa//′ | //aAa//′ | //aCa//′ | //aa//′ * //A// → //a// | //b// | //bC// | //bC//′//c//′ | //bCC//′//c//′ | //bCc//′ | //bc//′ | //c// | //cC//′//c//′ | //cc//′ * //C// → //b// | //bC// | //bC//′ | //bCC//′ | //c// | //cC//′ * //C//′ → //c// | //cC//′ * //a//′ → //a// * //c//′ → //c//