# HG changeset patch # User Adam Chlipala # Date 1225723822 18000 # Node ID 8b2b652ab0ee9120ac43fb790a150c4cc9ff80b9 # Parent fabfaa93c9eaf25718c95584954628807ae3a496 Add Plus diff -r fabfaa93c9ea -r 8b2b652ab0ee src/Hoas.v --- a/src/Hoas.v Mon Nov 03 09:43:32 2008 -0500 +++ b/src/Hoas.v Mon Nov 03 09:50:22 2008 -0500 @@ -24,7 +24,7 @@ (** * Parametric Higher-Order Abstract Syntax *) Inductive type : Type := -| Bool : type +| Nat : type | Arrow : type -> type -> type. Infix "-->" := Arrow (right associativity, at level 60). @@ -33,7 +33,9 @@ Variable var : type -> Type. Inductive exp : type -> Type := - | Const' : bool -> exp Bool + | Const' : nat -> exp Nat + | Plus' : exp Nat -> exp Nat -> exp Nat + | Var : forall t, var t -> exp t | App' : forall dom ran, exp (dom --> ran) -> exp dom -> exp ran | Abs' : forall dom ran, (var dom -> exp ran) -> exp (dom --> ran). @@ -46,8 +48,10 @@ Definition Exp t := forall var, exp var t. Definition Exp1 t1 t2 := forall var, var t1 -> exp var t2. -Definition Const (b : bool) : Exp Bool := - fun _ => Const' b. +Definition Const (n : nat) : Exp Nat := + fun _ => Const' n. +Definition Plus (E1 E2 : Exp Nat) : Exp Nat := + fun _ => Plus' (E1 _) (E2 _). Definition App dom ran (F : Exp (dom --> ran)) (X : Exp dom) : Exp ran := fun _ => App' (F _) (X _). Definition Abs dom ran (B : Exp1 dom ran) : Exp (dom --> ran) := @@ -58,7 +62,8 @@ Fixpoint flatten t (e : exp (exp var) t) {struct e} : exp var t := match e in exp _ t return exp _ t with - | Const' b => Const' b + | Const' n => Const' n + | Plus' e1 e2 => Plus' (flatten e1) (flatten e2) | Var _ e' => e' | App' _ _ e1 e2 => App' (flatten e1) (flatten e2) | Abs' _ _ e' => Abs' (fun x => flatten (e' (Var x))) @@ -74,7 +79,7 @@ Reserved Notation "E1 ==> E2" (no associativity, at level 90). Inductive Val : forall t, Exp t -> Prop := -| VConst : forall b, Val (Const b) +| VConst : forall n, Val (Const n) | VAbs : forall dom ran (B : Exp1 dom ran), Val (Abs B). Hint Constructors Val. @@ -82,14 +87,23 @@ Inductive Step : forall t, Exp t -> Exp t -> Prop := | Beta : forall dom ran (B : Exp1 dom ran) (X : Exp dom), App (Abs B) X ==> Subst X B -| Cong1 : forall dom ran (F : Exp (dom --> ran)) (X : Exp dom) F', +| AppCong1 : forall dom ran (F : Exp (dom --> ran)) (X : Exp dom) F', F ==> F' -> App F X ==> App F' X -| Cong2 : forall dom ran (F : Exp (dom --> ran)) (X : Exp dom) X', +| AppCong2 : forall dom ran (F : Exp (dom --> ran)) (X : Exp dom) X', Val F -> X ==> X' -> App F X ==> App F X' +| Sum : forall n1 n2, + Plus (Const n1) (Const n2) ==> Const (n1 + n2) +| PlusCong1 : forall E1 E2 E1', + E1 ==> E1' + -> Plus E1 E2 ==> Plus E1' E2 +| PlusCong2 : forall E1 E2 E2', + E2 ==> E2' + -> Plus E1 E2 ==> Plus E1 E2' + where "E1 ==> E2" := (Step E1 E2). Hint Constructors Step. @@ -97,6 +111,10 @@ Inductive Closed : forall t, Exp t -> Prop := | CConst : forall b, Closed (Const b) +| CPlus : forall E1 E2, + Closed E1 + -> Closed E2 + -> Closed (Plus E1 E2) | CApp : forall dom ran (E1 : Exp (dom --> ran)) E2, Closed E1 -> Closed E2 @@ -116,9 +134,9 @@ Closed E -> Val E \/ exists E', E ==> E'. induction 1; crush; - try match goal with - | [ H : @Val (_ --> _) _ |- _ ] => inversion H; my_crush - end; eauto. + repeat match goal with + | [ H : Val _ |- _ ] => inversion H; []; clear H; my_crush + end; eauto. Qed. Theorem progress : forall t (E : Exp t),