Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lfa:2022:lab06-dfa-to-regex [2022/11/11 09:39]
alexandra.udrescu01
lfa:2022:lab06-dfa-to-regex [2022/11/19 10:34] (current)
alexandra.udrescu01
Line 1: Line 1:
-====== ​7. Dfa to Regex conversions ======+====== ​6. Dfa to Regex conversions ======
  
-==== 7.1. TBD ====+==== 6.1. State elimination ​====
  
 Consider the following DFAs: Consider the following DFAs:
  
-**DFA1**+**DFA1** ​^ **DFA2** ^ 
 +|{{ :​lfa:​screenshot_2021-11-04_at_15.33.10.png?​400 |}}| {{ :​lfa:​2022:​lfa2022_lab5_ex2_4_cerinta.png?​300 |}} |
  
-{{ :​lfa:​screenshot_2021-11-04_at_15.33.10.png?​400 |}} 
- 
-**DFA2** 
- 
-{{ :​lfa:​2022:​lfa2022_lab5_ex2_4_cerinta.png?​300 |}} 
  
 Convert the given DFAs to a Regex (using the state-elimination strategy). ​ Convert the given DFAs to a Regex (using the state-elimination strategy). ​
 Hint: is it easier to apply conversion on another DFA? Hint: is it easier to apply conversion on another DFA?
  
-<hidden DFA1> 
  
-</​hidden>​ 
- 
-<hidden DFA2> 
  
 +<hidden On what DFA should the algorithm be applied?>​
 +It is recommended to apply the State elimination algorithm on the minimal DFA.
 </​hidden>​ </​hidden>​
  
-<​hidden ​minDFA2>+ 
 +<​hidden ​DFA2>
  
 {{ :​lfa:​2022:​lfa2022_lab6_mindfa2_1.png?​300 |}} {{ :​lfa:​2022:​lfa2022_lab6_mindfa2_1.png?​300 |}}
Line 42: Line 37:
 Pick a state that is not initial and not final. For each way to reach its direct successors from its direct predecessors,​ add a new transition. Then remove the state. Pick a state that is not initial and not final. For each way to reach its direct successors from its direct predecessors,​ add a new transition. Then remove the state.
  
-Repeat until there is only one final state and the initial ​state left.+  - Pick **state 1**: 
 +    - in:  
 +      * 0 --(ε)-->​ 1 
 +      * 2 --(0)--> 1 
 +    - out: 
 +      * 1 --(ε)-->​ 4 
 +      * 1 --(1)--> 2 
 +    - loop:  
 +      * 1 --(0)--> 1 
 +    - Add new transitions:​ 
 +      * 2 --(00*)-->​ 4 
 +      * 2 --(00*1)-->​ 2 
 +      * 0 --(0*)-->​ 4 
 +      * 0 --(0*1)-->​ 2 
 +    * {{ :​lfa:​2022:​lfa2022_lab6_mindfa2_3.png?​300 |}} 
 +  - Pick **state 3**: 
 +    - Because state 3 has no direct successor, it can simply be removed without adding new transitions. 
 +  - Pick **state 2**: 
 +    - in: 
 +      * 0 --(0*1)-->​ 2 
 +    - out: 
 +      * 2 --(ε U 00*)--> 4 
 +    - loop: 
 +      * 2 --(00*1)-->​ 4 
 +    - Add new transitions:​ 
 +      * 0 --(0*1(00*1)*(ε U 00*))--> 4 
 +      * This transition can be written more simply: 0 --( (0*1)(0+1)*0*)-->​ 4 
 +    * {{ :​lfa:​2022:​lfa2022_lab6_mindfa2_4.png?300 |}}
  
-Pick **state 1**: +** Step 3:**
-  - in:  +
-      - 0 --(ε)-->​ 1 +
-      - 2 --(0)--> 1 +
-  - out: +
-      - 1 --(ε)-->​ 4 +
-      - 1 --(1)--> 2 +
-  - loop:  +
-      - 1 --(0)--> 1 +
-  - Add new transitions:​ +
-      - 2 --(00*)-->​ 4 +
-      - 2 --(00*1)-->​ 2 +
-      - 0 --(0*)--> 4 +
-      - 0 --(0*1)--> 2+
  
 +Repeat step 2 and stop when there is one final and one initial state left.
 +</​hidden>​
 +
 +<hidden DFA1>
 +
 +  - first, we apply the minimisation algorithm
 +    * {{ :​lfa:​2022:​lab6_1_dfa1_1.png?​500 |}}
 +  - we add the new final and initial states
 +    * {{ :​lfa:​2022:​lab6_1_dfa1_2.png?​500 |}}
 +  - we eliminate the state 8
 +    - as it has no outgoing transitions,​ we can just remove it
 +    * {{ :​lfa:​2022:​lab6_1_dfa1_3.png?​500 |}}
 +  - we eliminate the state 0,1
 +    - in:
 +      * init --(ε)-->​ 0,1
 +    - out:
 +      * 0,1 --(ε)-->​ fin
 +      * 0,1 --(1)--> 2
 +    - loop:
 +      * 0,1 --(0)--> 0,1
 +    - we add:
 +      * init --(0*)-->​ fin
 +      * init --(0*1)-->​ 2
 +    * {{ :​lfa:​2022:​lab6_1_dfa1_4.png?​500 |}}
 +  - we eliminate the state 2
 +    - in:
 +      * init --(0*1)-->​ 2
 +      * 3 --(1)--> 2
 +    - out:
 +      * 2 --(ε)-->​ fin
 +      * 2 --(0)--> 3
 +      * 2 --(1)--> 4
 +    - we add:
 +      * init --(0*1)-->​ fin
 +      * init --(0*10)-->​ 3
 +      * init --(0*11)-->​ 4
 +      * 3 --(1)--> fin
 +      * 3 --(10)-->​ 3
 +      * 3 --(11)-->​ 4
 +    * {{ :​lfa:​2022:​lab6_1_dfa1_5.png?​500 |}}
 +  - we eliminate the state 4
 +    - in:
 +      * init --(0*11)-->​ 4
 +      * 3 --(11)-->​ 4
 +      * 6,7 --(1)--> 4
 +    - out:
 +      * 4 --(0)--> 6,7
 +    - we add:
 +      * init --(0*110)-->​ 6,7
 +      * 3 --(110)-->​ 6,7
 +      * 6,7 --(10)-->​ 6,7
 +    * {{ :​lfa:​2022:​lab6_1_dfa1_6.png?​500 |}}
 +  - we eliminate the state 6,7
 +    - in:
 +      * init --(0*110)-->​ 6,7
 +      * 3 --(110)-->​ 6,7
 +      * 5 --(1)--> 6,7
 +    - out:
 +      * 6,7 --(0)--> 5
 +      * 6,7 --(ε)-->​ fin
 +    - loop:
 +      * 6,7 --(10)-->​ 6,7
 +    - we add:
 +      * init --(0*110(10)*0)-->​ 5
 +      * init --(0*110(10)*)-->​ fin
 +      * 3 --(110(10)*0)-->​ 5
 +      * 3 --(110(10)*)-->​ fin
 +      * 5 --(1(10)*0)-->​ 5
 +      * 5 --(1(10)*)-->​ fin
 +    * {{ :​lfa:​2022:​lab6_1_dfa1_7.png?​500 |}}
 +  - we eliminate the state 3
 +    - in:
 +      * init --(0*10)-->​ 3
 +    - out:
 +      * 3 --(ε|1)-->​ fin
 +      * 3 --(0|110(10)*0)-->​ 5
 +    - loop:
 +      * 3 --(10)-->​ 3
 +    - we add:
 +      * init --(0*10(10)*(ε|1) )--> fin
 +      * init --(0*10(10)*(0|110(10)*0) )-->5
 +    * {{ :​lfa:​2022:​lab6_1_dfa1_8.png?​500 |}}
 +  - we eliminate the state 5
 +    - in:
 +      * init --(0*110(10)*0|0*10(10)*(0|110(10)*0) )--> 5
 +    - out:
 +      * 5 --(1(10)*)-->​ fin
 +    - loop:
 +      * 5 --(1(10)*0)-->​ 5
 +    - we add:
 +      * init --( (0*110(10)*0|0*10(10)*(0|110(10)*0) ) (1(10)*0)*1(10)*)-->​ fin
 +  - the final regex is ''​
 +0*|0*1|0*110(10)*|0*10(10)*(ε|1|110(10)*)|(0*110(10)*0|0*10(10)*(0|110(10)*0))(1(10)*0)*1(10)*''​
  
 </​hidden>​ </​hidden>​
  
-==== 7.2. Brzozowsky'​s algebraic method ====+ 
 + 
 +==== 6.2. Brzozowsky'​s algebraic method ====
  
 [[https://​en.wikipedia.org/​wiki/​Janusz_Brzozowski_(computer_scientist)|Janusz Brzozowski]] worked out a very elegant (and more computationally efficient) way to convert Dfa's to Regexes. It relies on an observation called **Arden'​s Lemma**: [[https://​en.wikipedia.org/​wiki/​Janusz_Brzozowski_(computer_scientist)|Janusz Brzozowski]] worked out a very elegant (and more computationally efficient) way to convert Dfa's to Regexes. It relies on an observation called **Arden'​s Lemma**:
Line 74: Line 178:
 === Dfa to regex conversion === === Dfa to regex conversion ===
  
-For each state $math[q], build an equation of the form: $math[q = c_1 q_1 \cup c_2 q_2 \ldots c_n q_n], such that: $math[\delta(q,​c_i) = q_i]. Here $math[c_i\in\Sigma],​ thus $math[q_i] are the $math[c_i]-successors of $math[q]. Additionally,​ if $math[q] is a final state, ​and an $math[\epsilon]:​ $math[q = c_1 q_1 \cup c_2 q_2 \ldots c_n q_n \cup \epsilon].+For each state $math[q], build an equation of the form: $math[q = c_1 q_1 \cup c_2 q_2 \ldots c_n q_n], such that: $math[\delta(q,​c_i) = q_i]. Here $math[c_i\in\Sigma],​ thus $math[q_i] are the $math[c_i]-successors of $math[q]. Additionally,​ if $math[q] is a final state, ​add an $math[\epsilon]:​ $math[q = c_1 q_1 \cup c_2 q_2 \ldots c_n q_n \cup \epsilon].
  
 ^ ^ ^ ^ ^ ^
Line 87: Line 191:
 === Reducing the system of equations === === Reducing the system of equations ===
  
-We can choose *any** equation **except** that corresponding to the initial state, and eliminate it, by exploiting **Arden'​s Lemma**:+We can choose ​**any** equation **except** that corresponding to the initial state, and eliminate it, by exploiting **Arden'​s Lemma**:
   * the solution to any equation of the form $math[q = e\cdot q \cup e'] is $math[q = e^*e'​].   * the solution to any equation of the form $math[q = e\cdot q \cup e'] is $math[q = e^*e'​].
  
 **Example** **Example**
  
-Goind back to the previous system of equations, we can find the solution to $math[q_2] which is: $math[(A \cup B)^*]. Next, we can replace the solution to $math[q_2] in $math[q_1] which yields:+Going back to the previous system of equations, we can find the solution to $math[q_2] which is: $math[(A \cup B)^*]. Next, we can replace the solution to $math[q_2] in $math[q_1] which yields:
   * $math[q_1 = A q_1 \cup B(A\cup B)^*].   * $math[q_1 = A q_1 \cup B(A\cup B)^*].
   * We apply Arden'​s Lemma one more time and yield: $math[q_1 = A^*B(A \cup B)^*].   * We apply Arden'​s Lemma one more time and yield: $math[q_1 = A^*B(A \cup B)^*].
Line 110: Line 214:
 === Exercise === === Exercise ===
  
- 7.2.1. Apply Brzozowsky'​s method to find a regex for the following DFA:+ 6.2.1. Apply Brzozowsky'​s method to find a regex for the following DFA:
 ^ {{ :​lfa:​2022:​screenshot_2022-11-09_at_15.46.23.png?​200 |}} ^ ^ {{ :​lfa:​2022:​screenshot_2022-11-09_at_15.46.23.png?​200 |}} ^
 +
 +
 +
 +<hidden Solution>​
 +
 +q0 = ε | Aq1 | Bq2
 +
 +q1 = ε | Aq1 | Bq2
 +
 +q2 = Bq2 | Aq0
 +
 +=> q2 = B*Aq0
 +
 +\\ 
 +
 +Replace q2:
 +
 +q0 = ε | Aq1 | BB*Aq0
 +
 +q1 = ε | Aq1 | BB*Aq0
 +
 +
 +=> q1 = A*(ε | BB*Aq0)
 +
 +\\ 
 +
 +Replace q1:
 +
 +q0 = ε | AA*(ε | BB*Aq0) | BB*Aq0
 +
 +=> q0 = ε | A+ | (A+B+A | B+A)q0
 +
 +=> q0 = A* | (A+B+A | B+A)*q0
 +
 +=> q0 = (A+B+A | B+A)*A*
 +
 +\\ 
 +
 +From q1 = A*(ε | BB*Aq0)
 +
 +=> q1 = A*(ε | BB*A(A+B+A | B+A)*A*)
 +
 +=> q1 = A* | A*BB*A(A+B+A | B+A)*A*
 +
 +\\ 
 +
 +From q2 = B*Aq0
 +
 +=> q2 = B*A(A+B+A | B+A)*A*
 +</​hidden>​