progs/display/dfa.scala
changeset 487 ffbc65112d48
parent 485 21dec9df46ba
equal deleted inserted replaced
486:3cc1799daf08 487:ffbc65112d48
       
     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