Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
lfa:2024:lab07 [2024/11/18 18:50]
cata_chiru created
lfa:2024:lab07 [2024/11/18 21:00] (current)
cata_chiru
Line 3: Line 3:
 **7.1.1.** (Solved during lecture) Define the reversal of a language $ L $ as $ rev(L) = \{ w \in \Sigma^* | rev(w) \in L \}$, where $ rev(c_1c_2 \dots c_n) = c_nc_{n - 1} \dots c_1$ , with $ c_i \in \Sigma, 1 \leq i \leq n $. Show that reversal is a closure property. **7.1.1.** (Solved during lecture) Define the reversal of a language $ L $ as $ rev(L) = \{ w \in \Sigma^* | rev(w) \in L \}$, where $ rev(c_1c_2 \dots c_n) = c_nc_{n - 1} \dots c_1$ , with $ c_i \in \Sigma, 1 \leq i \leq n $. Show that reversal is a closure property.
  
 +**7.1.2.** Suppose $math[A] is a DFA. Write another DFA which accepts only those words $math[w] such that both $math[w \in L(A)] and $math[reverse(w) \in L(A)].
  
-**7.1.2.** Identify **different strategies** to verify that two regular expressions generate the same language. State them as algorithmic procedures. +<​hidden ​Solution ​7.1.2.>
- +
-<hidden> All strategies require building DFAs from the regexes. +
-  - You can use an existing minimisation algorithm to find the minimal DFAs. Then, label each state from each DFA from 0 to |K|. Fix an ordering of the symbols of the alphabet. Sort the transitions by symbol. Make a textual representation of each DFA which includes the number of states and the sorted transition function. ​ If the textual representations of the two DFAs are identical then they accept the same language. +
-  - Use the indistinguishability algorithm to check if the two initial states of the two DFAs are indistinguishable. +
-  - Check $math[L(A_1) \subseteq L(A_2)] and $math[L(A_2) \subseteq L(A_1)]. The condition $math[L(A) \subseteq L(B)] can be restated as $math[L(A) \cap complement(L(B)) = \emptyset]. Build the complement DFA for B, and use the product construction with A. Check if the resulting DFA has any final state accessible from the initial one. +
-</​hidden>​ +
- +
- +
-**7.1.2.** Write a regex for the complement of $math[L((10 \cup 0)^*(1 \cup \epsilon))]. +
- +
- +
-<​hidden>​ +
-Build the DFA for that regex and then build the complement of that DFA. Transform it into a regex.  +
-</​hidden>​ +
- +
- +
-**7.1.3.** Suppose $math[A] is a DFA. Write another DFA which accepts only those words $math[w] such that both $math[w \in L(A)] and $math[reverse(w) \in L(A)]. +
- +
- +
-<hidden>+
 Build the DFA $math[A^R] which accepts $math[reverse(L(A))]. Build the product construction between $math[A] and $math[A^R]. ​ Build the DFA $math[A^R] which accepts $math[reverse(L(A))]. Build the product construction between $math[A] and $math[A^R]. ​
 </​hidden>​ </​hidden>​
Line 36: Line 17:
  
  
-<​hidden>​+<​hidden ​Solution 7.2.1.>
 $math[L/a = L((aaa \cup ba)^*(aa \cup b))] $math[L/a = L((aaa \cup ba)^*(aa \cup b))]
 </​hidden>​ </​hidden>​
Line 44: Line 25:
  
  
-<​hidden>​+<​hidden ​Solution 7.2.2.>
 $math[L/a = L(a^*)] $math[L/a = L(a^*)]
 </​hidden>​ </​hidden>​
Line 52: Line 33:
  
  
-<​hidden>​+<​hidden ​ ​Solution 7.2.3.>
 Let $math[A] be a DFA which accepts $math[L]. We build a new DFA $math[A/c] which accepts $math[L/c]. This new DFA has the same number of states, initial state, same transitions and same alphabet. The set of final states is different though: $math[F/c = \{q' \in K | \exists q \in F. \delta(q',​c) = q\}]. In other words, the final states of $math[A/c] are those states which are $math[c-]predecessors of some final state of $math[A]. Note that some $math[q'​] may be equal to $math[q], and it may also be the case that no such predecessors exist. ​ Let $math[A] be a DFA which accepts $math[L]. We build a new DFA $math[A/c] which accepts $math[L/c]. This new DFA has the same number of states, initial state, same transitions and same alphabet. The set of final states is different though: $math[F/c = \{q' \in K | \exists q \in F. \delta(q',​c) = q\}]. In other words, the final states of $math[A/c] are those states which are $math[c-]predecessors of some final state of $math[A]. Note that some $math[q'​] may be equal to $math[q], and it may also be the case that no such predecessors exist. ​
 </​hidden>​ </​hidden>​
Line 60: Line 41:
  
  
-<​hidden>​+<​hidden ​ ​Solution 7.2.4.>
 The easiest way is to rely on other closure properties: $math[c/L = reverse(reverse(L)/​c)] The easiest way is to rely on other closure properties: $math[c/L = reverse(reverse(L)/​c)]
 </​hidden>​ </​hidden>​
Line 70: Line 51:
  
  
-<​hidden>​+<​hidden ​ ​Solution 7.3.1.>
 Suppose $math[A] is the accepting DFA of L. We build a new NFA from A by adding $math[\epsilon-]transitions from the initial state to all other states of A (obs: if the initial state of A had transitions that entered it, then, in the new NFA, create another initial state that has an $math[\epsilon-]transition to the former initial state). Thus, we can nondeterministically //skip// any prefix $math[x] of any accepted word from $math[L]. This new DFA accepts $math[\text{suffix(L)}] Suppose $math[A] is the accepting DFA of L. We build a new NFA from A by adding $math[\epsilon-]transitions from the initial state to all other states of A (obs: if the initial state of A had transitions that entered it, then, in the new NFA, create another initial state that has an $math[\epsilon-]transition to the former initial state). Thus, we can nondeterministically //skip// any prefix $math[x] of any accepted word from $math[L]. This new DFA accepts $math[\text{suffix(L)}]
 </​hidden>​ </​hidden>​
Line 83: Line 64:
  
  
-<​hidden>​+<​hidden ​ ​Solution 7.4.1.>
 $math[min(L)] is the set of words from $math[L] that have no proper ($math[\neq \epsilon]) prefix in $math[L]. $math[min(L)] is the set of words from $math[L] that have no proper ($math[\neq \epsilon]) prefix in $math[L].
 </​hidden>​ </​hidden>​
Line 91: Line 72:
  
  
-<​hidden>​+<​hidden ​ ​Solution 7.4.2.>
 $math[min(L(a^*)) = \{\epsilon\}] $math[min(L(a^*)) = \{\epsilon\}]
 </​hidden>​ </​hidden>​
Line 99: Line 80:
  
  
-<​hidden>​+<​hidden ​ ​Solution 7.4.3.>
 No word from $math[L(a^*b)] has a prefix in this same language, hence the answer is $math[L(a^*b)]. No word from $math[L(a^*b)] has a prefix in this same language, hence the answer is $math[L(a^*b)].
 </​hidden>​ </​hidden>​
Line 107: Line 88:
  
  
-<​hidden>​+<​hidden ​ ​Solution 7.4.4.>
 Let $math[A] be the accepting DFA of L. If a word $math[w=xy \in L] has a proper prefix $math[x] in $math[L], then $math[(q_0,​xy) \vdash^* (q_1,x) \vdash^* (q_2,​\epsilon)] where $math[q_1,​q_2] are final states. We need to //​break-off//​ those paths leading from one final state (such as $math[q_1]) to another. Let $math[A] be the accepting DFA of L. If a word $math[w=xy \in L] has a proper prefix $math[x] in $math[L], then $math[(q_0,​xy) \vdash^* (q_1,x) \vdash^* (q_2,​\epsilon)] where $math[q_1,​q_2] are final states. We need to //​break-off//​ those paths leading from one final state (such as $math[q_1]) to another.
  
Line 118: Line 99:
  
  
-<​hidden>​+<​hidden ​ ​Solution 7.4.5.>
 The language $math[R] contains all those words formed by taking any suffix $math[x] of a word from $math[L] an appending its respective prefix $math[y] to it. The language $math[R] contains all those words formed by taking any suffix $math[x] of a word from $math[L] an appending its respective prefix $math[y] to it.
 We start from the accepting DFA $math[A] of $math[L]. We create a new initial state and a new final one. All states of A are no longer initial or final in our construction. We create $math[n] copies of $math[A], denoted as $math[A_q], one for each state $math[q\in K] of $math[A]. We start from the accepting DFA $math[A] of $math[L]. We create a new initial state and a new final one. All states of A are no longer initial or final in our construction. We create $math[n] copies of $math[A], denoted as $math[A_q], one for each state $math[q\in K] of $math[A].
Line 134: Line 115:
 ===== Extras =====  ===== Extras ===== 
  
-**7.5.1.** Invent a language transformation or an operation between languages. See if you can show that it is a closure property.+**7.5.1.** Identify **different strategies** to verify that two regular expressions generate the same language. State them as algorithmic procedures. 
 + 
 +<hidden Solution 7.5.1.>​ 
 +All strategies require building DFAs from the regexes. 
 +  - You can use an existing minimisation algorithm to find the minimal DFAs. Then, label each state from each DFA from 0 to |K|. Fix an ordering of the symbols of the alphabet. Sort the transitions by symbol. Make a textual representation of each DFA which includes the number of states and the sorted transition function. ​ If the textual representations of the two DFAs are identical then they accept the same language. 
 +  - Use the indistinguishability algorithm to check if the two initial states of the two DFAs are indistinguishable. 
 +  - Check $math[L(A_1) \subseteq L(A_2)] and $math[L(A_2) \subseteq L(A_1)]. The condition $math[L(A) \subseteq L(B)] can be restated as $math[L(A) \cap complement(L(B)) = \emptyset]. Build the complement DFA for B, and use the product construction with A. Check if the resulting DFA has any final state accessible from the initial one. 
 +</​hidden>​ 
 + 
 + 
 +**7.5.2.** Invent a language transformation or an operation between languages. See if you can show that it is a closure property.