| author | Christian Urban <urbanc@in.tum.de> | 
| Tue, 11 Apr 2017 06:22:46 +0800 | |
| changeset 483 | faba5360372c | 
| parent 482 | 74149519e436 | 
| child 485 | 21dec9df46ba | 
| permissions | -rw-r--r-- | 
| 482 | 1 | // NFAs in Scala based on sets of partial functions | 
| 144 
0cb61bed557d
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 2 | |
| 482 | 3 | // type abbreviation for partial functions | 
| 4 | type :=>[A, B] = PartialFunction[A, B] | |
| 144 
0cb61bed557d
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 5 | |
| 482 | 6 | case class NFA[A, C](starts: Set[A], // starting states | 
| 7 | delta: Set[(A, C) :=> A], // transitions | |
| 8 |                      fins:  A => Boolean) {     // final states 
 | |
| 144 
0cb61bed557d
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 9 | |
| 482 | 10 | // given a state and a character, what is the set of next states? | 
| 11 | // if there is none => empty set | |
| 12 | def next(q: A, c: C) : Set[A] = | |
| 483 | 13 | delta.flatMap(d => Try(d(q, c)).toOption) | 
| 144 
0cb61bed557d
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 14 | |
| 482 | 15 | def nexts(qs: Set[A], c: C) : Set[A] = | 
| 16 | qs.flatMap(next(_, c)) | |
| 144 
0cb61bed557d
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 17 | |
| 482 | 18 |   def deltas(qs: Set[A], s: List[C]) : Set[A] = s match {
 | 
| 19 | case Nil => qs | |
| 20 | case c::cs => deltas(nexts(qs, c), cs) | |
| 144 
0cb61bed557d
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 21 | } | 
| 
0cb61bed557d
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 22 | |
| 482 | 23 | def accepts(s: List[C]) : Boolean = | 
| 24 | deltas(starts, s).exists(fins) | |
| 144 
0cb61bed557d
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 25 | } | 
| 
0cb61bed557d
added
 Christian Urban <christian dot urban at kcl dot ac dot uk> parents: diff
changeset | 26 |