src/HOL/Library/State_Monad.thy
changeset 24253 3d7f74fd9fd9
parent 24224 a5c95bbeb31d
child 25595 6c48275f9c76
equal deleted inserted replaced
24252:4eb5bc6af008 24253:3d7f74fd9fd9
   224   "_let x t f" => "CONST Let t (\<lambda>x. f)"
   224   "_let x t f" => "CONST Let t (\<lambda>x. f)"
   225   "_nil f" => "f"
   225   "_nil f" => "f"
   226 
   226 
   227 print_translation {*
   227 print_translation {*
   228 let
   228 let
   229   fun unfold_monad (Const (@{const_syntax mbind}, _) $ f $ Abs (abs as (_, ty, _))) =
   229   fun dest_abs_eta (Abs (abs as (_, ty, _))) =
   230         let
   230         let
   231           val (v', g') = Syntax.variant_abs abs;
   231           val (v, t) = Syntax.variant_abs abs;
   232         in Const ("_mbind", dummyT) $ Free (v', ty) $ f $ unfold_monad g' end
   232         in ((v, ty), t) end
       
   233     | dest_abs_eta t =
       
   234         let
       
   235           val (v, t) = Syntax.variant_abs ("", dummyT, t $ Bound 0);
       
   236         in ((v, dummyT), t) end
       
   237   fun unfold_monad (Const (@{const_syntax mbind}, _) $ f $ g) =
       
   238         let
       
   239           val ((v, ty), g') = dest_abs_eta g;
       
   240         in Const ("_mbind", dummyT) $ Free (v, ty) $ f $ unfold_monad g' end
   233     | unfold_monad (Const (@{const_syntax fcomp}, _) $ f $ g) =
   241     | unfold_monad (Const (@{const_syntax fcomp}, _) $ f $ g) =
   234         Const ("_fcomp", dummyT) $ f $ unfold_monad g
   242         Const ("_fcomp", dummyT) $ f $ unfold_monad g
   235     | unfold_monad (Const (@{const_syntax Let}, _) $ f $ Abs (abs as (_, ty, _))) =
   243     | unfold_monad (Const (@{const_syntax Let}, _) $ f $ g) =
   236         let
   244         let
   237           val (v', g') = Syntax.variant_abs abs;
   245           val ((v, ty), g') = dest_abs_eta g;
   238         in Const ("_mbind", dummyT) $ Free (v', ty) $ f $ unfold_monad g' end
   246         in Const ("_let", dummyT) $ Free (v, ty) $ f $ unfold_monad g' end
   239     | unfold_monad (Const (@{const_syntax Pair}, _) $ f) =
   247     | unfold_monad (Const (@{const_syntax Pair}, _) $ f) =
   240         Const ("return", dummyT) $ f
   248         Const ("return", dummyT) $ f
   241     | unfold_monad f = f;
   249     | unfold_monad f = f;
   242   fun tr' (f::ts) =
   250   fun tr' (f::ts) =
   243     list_comb (Const ("_do", dummyT) $ unfold_monad f, ts)
   251     list_comb (Const ("_do", dummyT) $ unfold_monad f, ts)