X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2FGeneral.v;h=2d8a35c44e27fd42c54b5ad8f7bd6e50c0f7857c;hb=4359342db4052c77b802ce256856df71387e7a62;hp=188a2dc7724f47faebd423d0d88e5cca378ac08a;hpb=06ef4b8d0206389472bfdfeb38972d2b838e2852;p=coq-hetmet.git diff --git a/src/General.v b/src/General.v index 188a2dc..2d8a35c 100644 --- a/src/General.v +++ b/src/General.v @@ -301,6 +301,16 @@ Fixpoint unleaves'' {A:Type}(l:list ??A) : Tree ??A := | (a::b) => (unleaves'' b),,(T_Leaf a) end. +Lemma mapleaves {T:Type}(t:Tree ??T){Q}{f:T->Q} : leaves (mapOptionTree f t) = map f (leaves t). + induction t. + destruct a; auto. + simpl. + rewrite IHt1. + rewrite IHt2. + rewrite map_app. + auto. + Qed. + Fixpoint filter {T:Type}(l:list ??T) : list T := match l with | nil => nil @@ -738,7 +748,59 @@ Lemma list2vecOrFail {T}(l:list T)(n:nat)(error_message:nat->nat->string) : ???( apply (Error (error_message (length l) n)). Defined. +(* Uniques *) +Variable UniqSupply : Type. Extract Inlined Constant UniqSupply => "UniqSupply.UniqSupply". +Variable Unique : Type. Extract Inlined Constant Unique => "Unique.Unique". +Variable uniqFromSupply : UniqSupply -> Unique. Extract Inlined Constant uniqFromSupply => "UniqSupply.uniqFromSupply". +Variable splitUniqSupply : UniqSupply -> UniqSupply * UniqSupply. + Extract Inlined Constant splitUniqSupply => "UniqSupply.splitUniqSupply". +Variable unique_eq : forall u1 u2:Unique, sumbool (u1=u2) (u1≠u2). + Extract Inlined Constant unique_eq => "(==)". +Variable unique_toString : Unique -> string. + Extract Inlined Constant unique_toString => "show". +Instance EqDecidableUnique : EqDecidable Unique := + { eqd_dec := unique_eq }. +Instance EqDecidableToString : ToString Unique := + { toString := unique_toString }. + +Inductive UniqM {T:Type} : Type := + | uniqM : (UniqSupply -> ???(UniqSupply * T)) -> UniqM. + Implicit Arguments UniqM [ ]. + +Instance UniqMonad : Monad UniqM := +{ returnM := fun T (x:T) => uniqM (fun u => OK (u,x)) +; bindM := fun a b (x:UniqM a) (f:a->UniqM b) => + uniqM (fun u => + match x with + | uniqM fa => + match fa u with + | Error s => Error s + | OK (u',va) => match f va with + | uniqM fb => fb u' + end + end + end) +}. + +Definition getU : UniqM Unique := + uniqM (fun us => let (us1,us2) := splitUniqSupply us in OK (us1,(uniqFromSupply us2))). +Notation "'bind' x = e ; f" := (@bindM _ _ _ _ e (fun x => f)) (x ident, at level 60, right associativity). +Notation "'return' x" := (returnM x) (at level 100). +Notation "'failM' x" := (uniqM (fun _ => Error x)) (at level 100). + + + + + + +Record FreshMonad {T:Type} := +{ FMT : Type -> Type +; FMT_Monad :> Monad FMT +; FMT_fresh : forall tl:list T, FMT { t:T & @In _ t tl -> False } +}. +Implicit Arguments FreshMonad [ ]. +Coercion FMT : FreshMonad >-> Funclass.