thys/ReStar.thy
changeset 126 e866678c29cb
parent 124 5378ddbd1381
child 127 b208bc047eed
equal deleted inserted replaced
125:ff0844860981 126:e866678c29cb
   795 lemma 
   795 lemma 
   796   "matcher2 (ALT (CHAR a) (ALT (CHAR b) (SEQ (CHAR a) (CHAR b)))) [a,b] = Right (Right (Seq (Char a) (Char b)))"
   796   "matcher2 (ALT (CHAR a) (ALT (CHAR b) (SEQ (CHAR a) (CHAR b)))) [a,b] = Right (Right (Seq (Char a) (Char b)))"
   797 apply(simp)
   797 apply(simp)
   798 done
   798 done
   799 
   799 
   800 
   800 fun F_RIGHT where
       
   801   "F_RIGHT f v = Right (f v)"
       
   802 
       
   803 fun F_LEFT where
       
   804   "F_LEFT f v = Left (f v)"
       
   805 
       
   806 fun F_ALT where
       
   807   "F_ALT f1 f2 (Right v) = Right (f2 v)"
       
   808 | "F_ALT f1 f2 (Left v) = Left (f1 v)" 
       
   809 
       
   810 fun F_SEQ1 where
       
   811   "F_SEQ1 f1 f2 v = Seq (f1 Void) (f2 v)"
       
   812 
       
   813 fun F_SEQ2 where 
       
   814   "F_SEQ2 f1 f2 v = Seq (f1 v) (f2 Void)"
       
   815 
       
   816 fun F_SEQ where 
       
   817   "F_SEQ f1 f2 (Seq v1 v2) = Seq (f1 v1) (f2 v2)"
       
   818 
       
   819 fun simp_ALT where
       
   820   "simp_ALT (ZERO, _) (r2, f2) = (r2, F_RIGHT f2)"
       
   821 | "simp_ALT (r1, f1) (ZERO, _) = (r1, F_LEFT f1)"
       
   822 | "simp_ALT (r1, f1) (r2, f2) = (ALT r1 r2, F_ALT f1 f2)"
       
   823 
       
   824 fun simp_SEQ where
       
   825   "simp_SEQ (ONE, f1) (r2, f2) = (r2, F_SEQ1 f1 f2)"
       
   826 | "simp_SEQ (r1, f1) (ONE, f2) = (r1, F_SEQ2 f1 f2)"
       
   827 | "simp_SEQ (ZERO, f1) (r2, f2) = (ZERO, f1)"
       
   828 | "simp_SEQ (r1, f1) (ZERO, f2) = (ZERO, f2)"
       
   829 | "simp_SEQ (r1, f1) (r2, f2) = (SEQ r1 r2, F_SEQ f1 f2)"  
       
   830  
       
   831 fun 
       
   832   simp :: "rexp \<Rightarrow> rexp * (val \<Rightarrow> val)"
       
   833 where
       
   834   "simp (ALT r1 r2) = simp_ALT (simp r1) (simp r2)" 
       
   835 | "simp (SEQ r1 r2) = simp_SEQ (simp r1) (simp r2)" 
       
   836 | "simp r = (r, id)"
       
   837 
       
   838 fun 
       
   839   matcher3 :: "rexp \<Rightarrow> string \<Rightarrow> val option"
       
   840 where
       
   841   "matcher3 r [] = (if nullable r then Some(mkeps r) else None)"
       
   842 | "matcher3 r (c#s) = (let (rs, fr) = simp (der c r) in
       
   843                          (case (matcher3 rs s) of  
       
   844                             None \<Rightarrow> None
       
   845                           | Some(v) \<Rightarrow> Some(injval r c (fr v))))"
   801 
   846 
   802 end
   847 end