diff --git a/repl25-notes/syntax.v b/repl25-notes/syntax.v new file mode 100644 index 0000000..c453c83 --- /dev/null +++ b/repl25-notes/syntax.v @@ -0,0 +1,117 @@ +Inductive Term : Set := +| Var : nat -> Term +| App : Term -> Term -> Term +| Abs : Term -> Term. + +(* Renamings *) +(* nat -> nat *) +Definition id (x : nat) : nat := x. +Definition shift (x : nat) : nat := S x. +Definition comp (f g : nat -> nat) (x : nat) := + f (g x). +Definition ext (f : nat -> nat) (x : nat) + : nat -> nat := + fun y => + match y with + | 0 => x + | S z => f z + end. +Definition lift (f : nat -> nat) := + ext (comp shift f) 0. + +Compute (id 0). +Compute (id 1). +Compute (id 2). +Lemma id_is_id : forall x, id x = x. + reflexivity. +Qed. + +Compute (ext id 2) 0. +Compute (ext id 2) 1. +Compute (ext id 2) 2. + +Lemma ext_zero : forall f x, (ext f x) 0 = x. + reflexivity. +Qed. + +Lemma ext_succ : forall f x y, (ext f x) (S y) = f y. +Proof. + reflexivity. +Qed. + +Lemma lift_zero : forall f, (lift f) 0 = 0. +Proof. + reflexivity. +Qed. + +Lemma lift_succ : forall f x, + (lift f) (S x) = S (f x). + reflexivity. +Qed. + +Fixpoint ren (ξ : nat -> nat) (a : Term) + : Term := + match a with + | Var n => Var (ξ n) + | App b0 b1 => App (ren ξ b0) (ren ξ b1) + | Abs a => Abs (ren (lift ξ) a) + end. + +Require Import Logic.FunctionalExtensionality. + +Lemma lift_id_is_id_helper : forall x, lift id x = id x. +Proof. + now destruct x. +Qed. + +Lemma lift_id_is_id : lift id = id. +Proof. + apply functional_extensionality. + apply lift_id_is_id_helper. +Qed. + +Lemma ren_id : forall (a : Term), ren id a = a. +Proof. + intros a. + induction a. + - easy. + - simpl. + rewrite IHa1. + rewrite IHa2. + easy. + - simpl. + rewrite lift_id_is_id. + rewrite IHa. + easy. +Qed. + +Lemma lift_comp ξ0 ξ1 : + lift (comp ξ0 ξ1) = comp (lift ξ0) (lift ξ1). +Proof. + apply functional_extensionality. + now destruct x. +Qed. + +Lemma ren_comp : forall (a : Term) (ξ0 ξ1 : nat -> nat), ren (comp ξ0 ξ1) a = ren ξ0 (ren ξ1 a). +Proof. + induction a. + - easy. + - intros ξ0 ξ1. + simpl. + rewrite IHa1. + rewrite IHa2. + easy. + - intros ξ0 ξ1. + simpl. + rewrite lift_comp. + rewrite IHa. + easy. +Qed. + + +Lemma ren_comp' : forall (ξ0 ξ1 : nat -> nat) a, ren (comp ξ0 ξ1) a = ren ξ0 (ren ξ1 a). +Proof. + intros ξ0 ξ1 a. + revert a ξ0 ξ1. + apply ren_comp. +Qed.