progs/display/dfa.scala
changeset 504 3390e863d796
parent 487 ffbc65112d48
equal deleted inserted replaced
503:3b9496db3fb9 504:3390e863d796
       
     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