inclusion.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 73 行

SCALA
73
字号
/*                     __                                               *\**     ________ ___   / /  ___     Scala API                            ****    / __/ __// _ | / /  / _ |    (c) 2003-2007, LAMP/EPFL             ****  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **** /____/\___/_/ |_/____/_/ | |                                         ****                          |/                                          **\*                                                                      */// $Id: Inclusion.scala 10755 2007-04-19 17:59:46Z michelou $package scala.util.automata/** A fast test of language inclusion between minimal automata. *  inspired by the AMoRE automata library * *  @author Burak Emir *  @version 1.0 */trait Inclusion[A <: AnyRef] {  val labels: Seq[A]  /** Returns true if dfa1 is included in dfa2.   *   *  @param dfa1 ...   *  @param dfa2 ...   */  def inclusion(dfa1: DetWordAutom[A], dfa2: DetWordAutom[A]) = {        def encode(q1: Int, q2: Int) = 1 + q1 + q2 * dfa1.nstates    def decode2(c: Int) = (c-1) / (dfa1.nstates) //integer division    def decode1(c: Int) = (c-1) % (dfa1.nstates)     var q1 = 0 //dfa1.initstate; // == 0    var q2 = 0 //dfa2.initstate; // == 0        val max = 1 + dfa1.nstates * dfa2.nstates    val mark = new Array[Int](max)        var result = true    var current = encode(q1, q2)    var last = current    mark(last) = max // mark (q1,q2)    while (current != 0 && result) {      //Console.println("current = [["+q1+" "+q2+"]] = "+current);      for (letter <- labels) {        val r1 = dfa1.next(q1,letter)        val r2 = dfa2.next(q2,letter)        if (dfa1.isFinal(r1) && !dfa2.isFinal(r2))	  result = false        val test = encode(r1, r2)        //Console.println("test = [["+r1+" "+r2+"]] = "+test);        if (mark(test) == 0) {	  mark(last) = test	  mark(test) = max	  last = test        }      }      val ncurrent = mark(current)      if( ncurrent != max ) {        q1 = decode1(ncurrent)        q2 = decode2(ncurrent)        current = ncurrent      } else {        current = 0      }    }    result  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?