X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2FGeneral.v;h=ffd0d29662a00a2bd143b2e5307b1f1bf40e3b39;hb=7b2698b0dfe1d271a68a0efe2bf0d129b5f1f93e;hp=3c8252849faa7cbca0b3e22963216901e25adaef;hpb=10b56b90ad1e2674403fd17896c77c02993ca9fd;p=coq-hetmet.git diff --git a/src/General.v b/src/General.v index 3c82528..ffd0d29 100644 --- a/src/General.v +++ b/src/General.v @@ -129,7 +129,14 @@ Lemma mapOptionTree_compose : forall A B C (f:A->B)(g:B->C)(l:Tree ??A), reflexivity. Qed. - +Open Scope string_scope. +Fixpoint treeToString {T}{TT:ToString T}(t:Tree ??T) : string := +match t with + | T_Leaf None => "[]" + | T_Leaf (Some s) => "["+++s+++"]" + | T_Branch b1 b2 => treeToString b1 +++ ",," +++ treeToString b2 +end. +Instance TreeToString {T}{TT:ToString T} : ToString (Tree ??T) := { toString := treeToString }. (*******************************************************************************) (* Lists *) @@ -582,7 +589,22 @@ Implicit Arguments INil [ I F ]. Implicit Arguments ILeaf [ I F ]. Implicit Arguments IBranch [ I F ]. +Definition itmap {I}{F}{G}{il:Tree ??I}(f:forall i:I, F i -> G i) : ITree I F il -> ITree I G il. + induction il; intros; auto. + destruct a. + apply ILeaf. + apply f. + inversion X; auto. + apply INone. + apply IBranch; inversion X; auto. + Defined. +Fixpoint itree_to_tree {T}{Z}{l:Tree ??T}(il:ITree T (fun _ => Z) l) : Tree ??Z := + match il with + | INone => [] + | ILeaf _ a => [a] + | IBranch _ _ b1 b2 => (itree_to_tree b1),,(itree_to_tree b2) + end. (*******************************************************************************) @@ -633,6 +655,12 @@ Definition map2 {A}{B}(f:A->B)(t:A*A) : (B*B) := ((f (fst t)), (f (snd t))). Variable eol : string. Extract Constant eol => "'\n':[]". +Class Monad {T:Type->Type} := +{ returnM : forall {a}, a -> T a +; bindM : forall {a}{b}, T a -> (a -> T b) -> T b +}. +Implicit Arguments Monad [ ]. +Notation "a >>>= b" := (@bindM _ _ _ _ a b) (at level 50, left associativity). (* the Error monad *) Inductive OrError (T:Type) := @@ -709,3 +737,49 @@ Lemma list2vecOrFail {T}(l:list T)(n:nat)(error_message:nat->nat->string) : ???( rewrite e in v; apply OK; apply v. 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). + + + + +Variable Prelude_error : forall {A}, string -> A. Extract Inlined Constant Prelude_error => "Prelude.error".