def simp(r: Rexp) : Rexp = r match { case ALT(r1, r2) => { (simp(r1), simp(r2)) match { case (ZERO, r2s) => r2s case (r1s, ZERO) => r1s case (r1s, r2s) => if (r1s == r2s) r1s else ALT(r1s, r2s) } } case SEQ(r1, r2) => { (simp(r1), simp(r2)) match { case (ZERO, _) => ZERO case (_, ZERO) => ZERO case (ONE, r2s) => r2s case (r1s, ONE) => r1s case (r1s, r2s) => SEQ(r1s, r2s) } } case r => r}def ders(s: List[Char], r: Rexp) : Rexp = s match { case Nil => r case c::s => ders(s, simp(der(c, r))) /*@\label{simpline}@*/ }