progs/display/dfa.scala
changeset 487 a697421eaa04
parent 485 bd6d999ab7b6
equal deleted inserted replaced
486:8178fcf377dc 487:a697421eaa04
       
     1 // DFAs in Scala using partial functions
       
     2 import scala.util.Try
       
     3 
       
     4 // type abbreviation for partial functions
       
     5 type :=>[A, B] = PartialFunction[A, B]
       
     6 
       
     7 case class DFA[A, C](start: A,              // starting state
       
     8                      delta: (A, C) :=> A,   // transition (partial fun)
       
     9                      fins:  A => Boolean) { // final states
       
    10 
       
    11   def deltas(q: A, s: List[C]) : A = s match {
       
    12     case Nil => q
       
    13     case c::cs => deltas(delta(q, c), cs)
       
    14   }
       
    15 
       
    16   def accepts(s: List[C]) : Boolean = 
       
    17     Try(fins(deltas(start, s))) getOrElse false
       
    18 }
       
    19 
       
    20 // the example shown earlier in the handout 
       
    21 abstract class State
       
    22 case object Q0 extends State
       
    23 case object Q1 extends State
       
    24 case object Q2 extends State
       
    25 case object Q3 extends State
       
    26 case object Q4 extends State
       
    27 
       
    28 val delta : (State, Char) :=> State = 
       
    29   { case (Q0, 'a') => Q1
       
    30     case (Q0, 'b') => Q2
       
    31     case (Q1, 'a') => Q4
       
    32     case (Q1, 'b') => Q2
       
    33     case (Q2, 'a') => Q3
       
    34     case (Q2, 'b') => Q2
       
    35     case (Q3, 'a') => Q4
       
    36     case (Q3, 'b') => Q0
       
    37     case (Q4, 'a') => Q4
       
    38     case (Q4, 'b') => Q4 }
       
    39 
       
    40 val dfa = DFA(Q0, delta, Set[State](Q4))
       
    41 
       
    42 dfa.accepts("bbabaab".toList)   // true
       
    43 dfa.accepts("baba".toList)      // false