Mercurial > cpdt > repo
diff src/Impure.v @ 191:cf5ddf078858
Impredicative Impure example
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Tue, 18 Nov 2008 13:04:39 -0500 |
parents | 094bd1e353dd |
children | 32ce9b28d7e7 |
line wrap: on
line diff
--- a/src/Impure.v Tue Nov 18 12:44:46 2008 -0500 +++ b/src/Impure.v Tue Nov 18 13:04:39 2008 -0500 @@ -39,6 +39,76 @@ Notation "\ x , e" := (Abs (fun x => e)) (at level 73). Notation "\ ? , e" := (Abs (fun _ => e)) (at level 73). +Definition Term := forall var, term var. + +Definition ident : Term := fun _ => \x, #x. +Definition unite : Term := fun _ => (). +Definition ident_self : Term := fun _ => ident _ @ ident _. +Definition ident_unit : Term := fun _ => ident _ @ unite _. + + +Module impredicative. + Inductive dynamic : Set := + | Dyn : forall (dynTy : Type), dynTy -> dynamic. + + Inductive computation (T : Type) : Set := + | Return : T -> computation T + | Bind : forall (T' : Type), + computation T' -> (T' -> computation T) -> computation T + | Unpack : dynamic -> computation T. + + Inductive eval : forall T, computation T -> T -> Prop := + | EvalReturn : forall T (v : T), + eval (Return v) v + | EvalUnpack : forall T (v : T), + eval (Unpack T (Dyn v)) v + | EvalBind : forall T1 T2 (c1 : computation T1) (c2 : T1 -> computation T2) v1 v2, + eval c1 v1 + -> eval (c2 v1) v2 + -> eval (Bind c1 c2) v2. + + Fixpoint termDenote (e : term dynamic) : computation dynamic := + match e with + | Var v => Return v + | App e1 e2 => Bind (termDenote e1) (fun f => + Bind (termDenote e2) (fun x => + Bind (Unpack (dynamic -> computation dynamic) f) (fun f' => + f' x))) + | Abs e' => Return (Dyn (fun x => termDenote (e' x))) + + | Unit => Return (Dyn tt) + end. + + Definition TermDenote (E : Term) := termDenote (E _). + + Eval compute in TermDenote ident. + Eval compute in TermDenote unite. + Eval compute in TermDenote ident_self. + Eval compute in TermDenote ident_unit. + + Theorem eval_ident_unit : eval (TermDenote ident_unit) (Dyn tt). + compute. + repeat econstructor. + simpl. + constructor. + Qed. + + Theorem invert_ident : forall (E : Term) d, + eval (TermDenote (fun _ => ident _ @ E _)) d + -> eval (TermDenote E) d. + inversion 1. + + crush. + + Focus 3. + crush. + unfold TermDenote in H0. + simpl in H0. + (** [injection H0.] *) + Abort. + +End impredicative. + Module predicative. @@ -88,19 +158,11 @@ | Unit => Return VUnit end. - Definition Term := forall var, term var. Definition TermDenote (E : Term) := termDenote (E _). - Definition ident : Term := fun _ => \x, #x. Eval compute in TermDenote ident. - - Definition unite : Term := fun _ => (). Eval compute in TermDenote unite. - - Definition ident_self : Term := fun _ => ident _ @ ident _. Eval compute in TermDenote ident_self. - - Definition ident_unit : Term := fun _ => ident _ @ unite _. Eval compute in TermDenote ident_unit. Theorem eval_ident_unit : exists ds, eval nil (TermDenote ident_unit) ds VUnit.