| author | Christian Urban <urbanc@in.tum.de> | 
| Wed, 08 Feb 2017 11:02:02 +0000 | |
| changeset 475 | 5f3eb026f183 | 
| parent 145 | 920f675b4ed1 | 
| child 479 | 4fcaa5a2d199 | 
| child 480 | 14318f1d3b0f | 
| permissions | -rw-r--r-- | 
| 145 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 1 | // DFAs | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 2 | import scala.util._ | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 3 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 4 | abstract class State | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 5 | type States = Set[State] | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 6 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 7 | case class IntState(i: Int) extends State | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 8 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 9 | object NewState {
 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 10 | var counter = 0 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 11 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 12 |   def apply() : IntState = {
 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 13 | counter += 1; | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 14 | new IntState(counter - 1) | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 15 | } | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 16 | } | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 17 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 18 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 19 | // DFA class | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 20 | case class DFA(states: States, | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 21 | start: State, | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 22 | delta: (State, Char) => State, | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 23 |                fins: States) {
 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 24 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 25 |   def deltas(q: State, s: List[Char]) : State = s match {
 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 26 | case Nil => q | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 27 | case c::cs => deltas(delta(q, c), cs) | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 28 | } | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 29 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 30 | // wether a string is accepted by the automaton or not | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 31 | def accepts(s: String) : Boolean = | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 32 | Try(fins contains | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 33 | (deltas(start, s.toList))) getOrElse false | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 34 | } | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 35 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 36 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 37 | // example DFA from the lectures | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 38 | val Q0 = NewState() | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 39 | val Q1 = NewState() | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 40 | val Q2 = NewState() | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 41 | val Q3 = NewState() | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 42 | val Q4 = NewState() | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 43 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 44 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 45 | val delta : (State, Char) => State = {
 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 46 | case (Q0, 'a') => Q1 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 47 | case (Q0, 'b') => Q2 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 48 | case (Q1, 'a') => Q4 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 49 | case (Q1, 'b') => Q2 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 50 | case (Q2, 'a') => Q3 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 51 | case (Q2, 'b') => Q2 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 52 | case (Q3, 'a') => Q4 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 53 | case (Q3, 'b') => Q0 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 54 | case (Q4, 'a') => Q4 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 55 | case (Q4, 'b') => Q4 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 56 | } | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 57 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 58 | val DFA1 = DFA(Set(Q0, Q1, Q2, Q3, Q4), Q0, delta, Set(Q4)) | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 59 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 60 | println(DFA1.accepts("aaa"))
 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 61 | println(DFA1.accepts("bb"))
 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 62 | println(DFA1.accepts("aaac"))
 | 
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 63 | |
| 
920f675b4ed1
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 64 |