diff --git a/theories/fp_red.v b/theories/fp_red.v new file mode 100644 index 0000000..6dda9d3 --- /dev/null +++ b/theories/fp_red.v @@ -0,0 +1,119 @@ +Require Import ssreflect. +From Hammer Require Import Tactics. +Require Import Autosubst2.core Autosubst2.fintype Autosubst2.syntax. + +(* Trying my best to not write C style module_funcname *) +Module Par. + Inductive R {n} : Tm n -> Tm n -> Prop := + (***************** Beta ***********************) + | Var i : R (VarTm i) (VarTm i) + | AppAbs a0 a1 b0 b1 : + R a0 a1 -> + R b0 b1 -> + R (App (Abs a0) b0) (subst_Tm (scons b1 VarTm) a1) + | AppPair a0 a1 b0 b1 c0 c1: + R a0 a1 -> + R b0 b1 -> + R c0 c1 -> + R (App (Pair a0 b0) c0) (Pair (App a1 c1) (App b1 c1)) + | Proj1Abs a0 a1 : + R a0 a1 -> + R (Proj1 (Abs a0)) (Abs (Proj1 a0)) + | Proj1Pair a0 a1 b : + R a0 a1 -> + R (Proj1 (Pair a0 b)) a1 + | Proj2Abs a0 a1 : + R a0 a1 -> + R (Proj2 (Abs a0)) (Abs (Proj2 a0)) + | Proj2Pair a0 a1 b : + R a0 a1 -> + R (Proj2 (Pair a0 b)) a1 + + (****************** Eta ***********************) + | AppEta a0 a1 : + R a0 a1 -> + R a0 (Abs (ren_Tm shift a1)) + | PairEta a0 a1 : + R a0 a1 -> + R a0 (Pair a1 a1) + + (*************** Congruence ********************) + | AppCong a0 a1 b0 b1 : + R a0 a1 -> + R b0 b1 -> + R (App a0 b0) (App a1 b1) + | Proj1Cong a0 a1 : + R a0 a1 -> + R (Proj1 a0) (Proj1 a1) + | Proj2Cong a0 a1 : + R a0 a1 -> + R (Proj2 a0) (Proj2 a1). +End Par. + +(***************** Beta rules only ***********************) +Module RPar. + Inductive R {n} : Tm n -> Tm n -> Prop := + (***************** Beta ***********************) + | Var i : R (VarTm i) (VarTm i) + | AppAbs a0 a1 b0 b1 : + R a0 a1 -> + R b0 b1 -> + R (App (Abs a0) b0) (subst_Tm (scons b1 VarTm) a1) + | AppPair a0 a1 b0 b1 c0 c1: + R a0 a1 -> + R b0 b1 -> + R c0 c1 -> + R (App (Pair a0 b0) c0) (Pair (App a1 c1) (App b1 c1)) + | Proj1Abs a0 a1 : + R a0 a1 -> + R (Proj1 (Abs a0)) (Abs (Proj1 a0)) + | Proj1Pair a0 a1 b : + R a0 a1 -> + R (Proj1 (Pair a0 b)) a1 + | Proj2Abs a0 a1 : + R a0 a1 -> + R (Proj2 (Abs a0)) (Abs (Proj2 a0)) + | Proj2Pair a0 a1 b : + R a0 a1 -> + R (Proj2 (Pair a0 b)) a1 + + (*************** Congruence ********************) + | AppCong a0 a1 b0 b1 : + R a0 a1 -> + R b0 b1 -> + R (App a0 b0) (App a1 b1) + | Proj1Cong a0 a1 : + R a0 a1 -> + R (Proj1 a0) (Proj1 a1) + | Proj2Cong a0 a1 : + R a0 a1 -> + R (Proj2 a0) (Proj2 a1). +End RPar. + +Module EPar. + Inductive R {n} : Tm n -> Tm n -> Prop := + (****************** Eta ***********************) + | AppEta a0 a1 : + R a0 a1 -> + R a0 (Abs (ren_Tm shift a1)) + | PairEta a0 a1 : + R a0 a1 -> + R a0 (Pair a1 a1) + + (*************** Congruence ********************) + | AppCong a0 a1 b0 b1 : + R a0 a1 -> + R b0 b1 -> + R (App a0 b0) (App a1 b1) + | Proj1Cong a0 a1 : + R a0 a1 -> + R (Proj1 a0) (Proj1 a1) + | Proj2Cong a0 a1 : + R a0 a1 -> + R (Proj2 a0) (Proj2 a1). +End EPar. + +Lemma EPar_Par n (a b : Tm n) : EPar.R a b -> Par.R a b. +Proof. induction 1; hauto lq:on ctrs:Par.R. Qed. + +Lemma EPar_