From 7dc9dcddc88440527569d2a7216461bcd7398ab2 Mon Sep 17 00:00:00 2001 From: Ferruccio Guidi Date: Sun, 11 Jan 2015 17:44:12 +0000 Subject: [PATCH] we restored the scripts of \lambda\delta version 1 (which are now available through \lambda\delta Web site) by merging and updating all our (not broken) scripts --- helm/coq-contribs/LAMBDA-TYPES/.cvsignore | 1 - helm/coq-contribs/LAMBDA-TYPES/.depend | 68 ---- helm/coq-contribs/LAMBDA-TYPES/Base.v | 7 - helm/coq-contribs/LAMBDA-TYPES/LambdaDelta.v | 67 ---- helm/coq-contribs/LAMBDA-TYPES/Make | 69 ---- helm/coq-contribs/LAMBDA-TYPES/Makefile | 361 ------------------ helm/coq-contribs/LAMBDA-TYPES/README | 61 --- helm/coq-contribs/LAMBDA-TYPES/base_blt.v | 33 -- helm/coq-contribs/LAMBDA-TYPES/base_hints.v | 262 ------------- helm/coq-contribs/LAMBDA-TYPES/base_rewrite.v | 76 ---- helm/coq-contribs/LAMBDA-TYPES/base_tactics.v | 45 --- helm/coq-contribs/LAMBDA-TYPES/base_types.v | 206 ---------- .../coq-contribs/LAMBDA-TYPES/contexts_defs.v | 77 ---- helm/coq-contribs/LAMBDA-TYPES/cpr0_defs.v | 90 ----- helm/coq-contribs/LAMBDA-TYPES/csub0_defs.v | 114 ------ helm/coq-contribs/LAMBDA-TYPES/csub0_props.v | 67 ---- helm/coq-contribs/LAMBDA-TYPES/csubst0_defs.v | 197 ---------- helm/coq-contribs/LAMBDA-TYPES/csubst1_defs.v | 101 ----- helm/coq-contribs/LAMBDA-TYPES/description | 13 - helm/coq-contribs/LAMBDA-TYPES/drop_defs.v | 130 ------- helm/coq-contribs/LAMBDA-TYPES/drop_props.v | 228 ----------- helm/coq-contribs/LAMBDA-TYPES/fsubst0_defs.v | 20 - helm/coq-contribs/LAMBDA-TYPES/lift_defs.v | 238 ------------ helm/coq-contribs/LAMBDA-TYPES/lift_gen.v | 116 ------ helm/coq-contribs/LAMBDA-TYPES/lift_props.v | 43 --- helm/coq-contribs/LAMBDA-TYPES/lift_tlt.v | 87 ----- helm/coq-contribs/LAMBDA-TYPES/pc1_defs.v | 50 --- helm/coq-contribs/LAMBDA-TYPES/pc1_props.v | 25 -- helm/coq-contribs/LAMBDA-TYPES/pc3_defs.v | 84 ---- helm/coq-contribs/LAMBDA-TYPES/pc3_gen.v | 88 ----- .../LAMBDA-TYPES/pc3_gen_context.v | 22 -- helm/coq-contribs/LAMBDA-TYPES/pc3_props.v | 233 ----------- helm/coq-contribs/LAMBDA-TYPES/pc3_subst0.v | 136 ------- .../LAMBDA-TYPES/pr0_confluence.v | 176 --------- helm/coq-contribs/LAMBDA-TYPES/pr0_defs.v | 101 ----- helm/coq-contribs/LAMBDA-TYPES/pr0_gen.v | 99 ----- helm/coq-contribs/LAMBDA-TYPES/pr0_lift.v | 39 -- helm/coq-contribs/LAMBDA-TYPES/pr0_subst0.v | 105 ----- helm/coq-contribs/LAMBDA-TYPES/pr0_subst1.v | 63 --- .../LAMBDA-TYPES/pr1_confluence.v | 56 --- helm/coq-contribs/LAMBDA-TYPES/pr1_defs.v | 34 -- .../LAMBDA-TYPES/pr2_confluence.v | 74 ---- helm/coq-contribs/LAMBDA-TYPES/pr2_defs.v | 137 ------- helm/coq-contribs/LAMBDA-TYPES/pr2_gen.v | 78 ---- .../LAMBDA-TYPES/pr2_gen_context.v | 62 --- helm/coq-contribs/LAMBDA-TYPES/pr2_lift.v | 33 -- helm/coq-contribs/LAMBDA-TYPES/pr2_subst1.v | 48 --- .../LAMBDA-TYPES/pr3_confluence.v | 59 --- helm/coq-contribs/LAMBDA-TYPES/pr3_defs.v | 194 ---------- helm/coq-contribs/LAMBDA-TYPES/pr3_gen.v | 132 ------- .../LAMBDA-TYPES/pr3_gen_context.v | 42 -- helm/coq-contribs/LAMBDA-TYPES/pr3_props.v | 127 ------ helm/coq-contribs/LAMBDA-TYPES/pr3_subst1.v | 32 -- .../LAMBDA-TYPES/subst0_confluence.v | 80 ---- helm/coq-contribs/LAMBDA-TYPES/subst0_defs.v | 62 --- helm/coq-contribs/LAMBDA-TYPES/subst0_gen.v | 130 ------- helm/coq-contribs/LAMBDA-TYPES/subst0_lift.v | 56 --- .../coq-contribs/LAMBDA-TYPES/subst0_subst0.v | 68 ---- helm/coq-contribs/LAMBDA-TYPES/subst0_tlt.v | 62 --- .../LAMBDA-TYPES/subst1_confluence.v | 82 ---- helm/coq-contribs/LAMBDA-TYPES/subst1_defs.v | 58 --- helm/coq-contribs/LAMBDA-TYPES/subst1_gen.v | 44 --- helm/coq-contribs/LAMBDA-TYPES/subst1_lift.v | 23 -- .../coq-contribs/LAMBDA-TYPES/subst1_subst1.v | 60 --- helm/coq-contribs/LAMBDA-TYPES/terms_defs.v | 85 ----- helm/coq-contribs/LAMBDA-TYPES/tlt_defs.v | 115 ------ helm/coq-contribs/LAMBDA-TYPES/ty0_defs.v | 125 ------ helm/coq-contribs/LAMBDA-TYPES/ty0_gen.v | 185 --------- .../LAMBDA-TYPES/ty0_gen_context.v | 227 ----------- helm/coq-contribs/LAMBDA-TYPES/ty0_lift.v | 65 ---- helm/coq-contribs/LAMBDA-TYPES/ty0_props.v | 110 ------ helm/coq-contribs/LAMBDA-TYPES/ty0_sred.v | 252 ------------ .../LAMBDA-TYPES/ty0_sred_props.v | 176 --------- helm/coq-contribs/LAMBDA-TYPES/ty0_subst0.v | 334 ---------------- .../lambdadelta/download/lambdadelta_1.tar.gz | Bin 95172 -> 101088 bytes helm/www/lambdadelta/specification.html | 4 +- .../web/home/specification.ldw.xml | 2 +- 77 files changed, 3 insertions(+), 7508 deletions(-) delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/.cvsignore delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/.depend delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/Base.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/LambdaDelta.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/Make delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/Makefile delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/README delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/base_blt.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/base_hints.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/base_rewrite.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/base_tactics.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/base_types.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/contexts_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/cpr0_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/csub0_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/csub0_props.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/csubst0_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/csubst1_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/description delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/drop_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/drop_props.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/fsubst0_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/lift_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/lift_gen.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/lift_props.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/lift_tlt.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pc1_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pc1_props.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pc3_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pc3_gen.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pc3_gen_context.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pc3_props.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pc3_subst0.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr0_confluence.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr0_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr0_gen.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr0_lift.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr0_subst0.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr0_subst1.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr1_confluence.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr1_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr2_confluence.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr2_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr2_gen.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr2_gen_context.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr2_lift.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr2_subst1.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr3_confluence.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr3_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr3_gen.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr3_gen_context.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr3_props.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/pr3_subst1.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst0_confluence.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst0_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst0_gen.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst0_lift.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst0_subst0.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst0_tlt.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst1_confluence.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst1_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst1_gen.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst1_lift.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/subst1_subst1.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/terms_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/tlt_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/ty0_defs.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/ty0_gen.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/ty0_gen_context.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/ty0_lift.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/ty0_props.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/ty0_sred.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/ty0_sred_props.v delete mode 100644 helm/coq-contribs/LAMBDA-TYPES/ty0_subst0.v diff --git a/helm/coq-contribs/LAMBDA-TYPES/.cvsignore b/helm/coq-contribs/LAMBDA-TYPES/.cvsignore deleted file mode 100644 index 419956872..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -*.vo diff --git a/helm/coq-contribs/LAMBDA-TYPES/.depend b/helm/coq-contribs/LAMBDA-TYPES/.depend deleted file mode 100644 index eb03259ff..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/.depend +++ /dev/null @@ -1,68 +0,0 @@ -LambdaDelta.vo: LambdaDelta.v base_tactics.vo base_hints.vo base_types.vo base_blt.vo base_rewrite.vo Base.vo terms_defs.vo tlt_defs.vo contexts_defs.vo lift_defs.vo lift_gen.vo lift_props.vo lift_tlt.vo drop_defs.vo drop_props.vo subst0_defs.vo subst0_gen.vo subst0_lift.vo subst0_subst0.vo subst0_confluence.vo subst0_tlt.vo subst1_defs.vo subst1_gen.vo subst1_lift.vo subst1_subst1.vo subst1_confluence.vo csubst0_defs.vo csubst1_defs.vo fsubst0_defs.vo pr0_defs.vo pr0_lift.vo pr0_gen.vo pr0_subst0.vo pr0_confluence.vo pr0_subst1.vo pr1_defs.vo pr1_confluence.vo cpr0_defs.vo pr2_defs.vo pr2_lift.vo pr2_gen.vo pr2_confluence.vo pr2_subst1.vo pr2_gen_context.vo pr3_defs.vo pr3_props.vo pr3_gen.vo pr3_confluence.vo pr3_subst1.vo pr3_gen_context.vo pc1_defs.vo pc1_props.vo pc3_defs.vo pc3_props.vo pc3_gen.vo pc3_subst0.vo pc3_gen_context.vo ty0_defs.vo ty0_gen.vo ty0_lift.vo ty0_props.vo ty0_subst0.vo ty0_gen_context.vo csub0_defs.vo csub0_props.vo ty0_sred.vo ty0_sred_props.vo -ty0_sred_props.vo: ty0_sred_props.v lift_props.vo drop_props.vo pc3_props.vo pc3_gen.vo ty0_defs.vo ty0_gen.vo ty0_props.vo ty0_sred.vo -ty0_sred.vo: ty0_sred.v lift_gen.vo subst1_gen.vo csubst1_defs.vo pr0_lift.vo pr0_subst1.vo cpr0_defs.vo pc1_props.vo pc3_props.vo pc3_gen.vo ty0_defs.vo ty0_gen.vo ty0_lift.vo ty0_props.vo ty0_subst0.vo ty0_gen_context.vo csub0_defs.vo csub0_props.vo -csub0_props.vo: csub0_props.v pc3_props.vo csub0_defs.vo -csub0_defs.vo: csub0_defs.v ty0_defs.vo -ty0_gen_context.vo: ty0_gen_context.v lift_gen.vo lift_props.vo subst1_defs.vo subst1_lift.vo subst1_confluence.vo drop_props.vo csubst1_defs.vo pc3_gen.vo pc3_gen_context.vo ty0_defs.vo ty0_lift.vo -ty0_subst0.vo: ty0_subst0.v drop_props.vo csubst0_defs.vo fsubst0_defs.vo pc3_props.vo pc3_subst0.vo ty0_defs.vo ty0_gen.vo ty0_lift.vo ty0_props.vo -ty0_props.vo: ty0_props.v drop_props.vo pc3_props.vo ty0_defs.vo ty0_gen.vo ty0_lift.vo -ty0_lift.vo: ty0_lift.v lift_props.vo drop_props.vo pc3_props.vo ty0_defs.vo -ty0_gen.vo: ty0_gen.v pc3_props.vo ty0_defs.vo -ty0_defs.vo: ty0_defs.v pc3_defs.vo -pc3_gen_context.vo: pc3_gen_context.v subst1_confluence.vo csubst1_defs.vo pr3_gen_context.vo pc3_defs.vo pc3_props.vo -pc3_subst0.vo: pc3_subst0.v subst0_subst0.vo fsubst0_defs.vo pr0_subst0.vo pc3_defs.vo pc3_props.vo -pc3_gen.vo: pc3_gen.v lift_gen.vo pr3_props.vo pr3_gen.vo pc3_defs.vo pc3_props.vo -pc3_props.vo: pc3_props.v subst0_subst0.vo pr0_subst0.vo cpr0_defs.vo pr3_defs.vo pr3_props.vo pr3_confluence.vo pc3_defs.vo -pc3_defs.vo: pc3_defs.v pr2_defs.vo pr3_defs.vo pc1_defs.vo -pc1_props.vo: pc1_props.v pr1_confluence.vo pc1_defs.vo -pc1_defs.vo: pc1_defs.v pr0_defs.vo pr1_defs.vo -pr3_gen_context.vo: pr3_gen_context.v csubst1_defs.vo pr2_gen_context.vo pr3_defs.vo -pr3_subst1.vo: pr3_subst1.v subst1_defs.vo pr2_subst1.vo pr3_defs.vo -pr3_confluence.vo: pr3_confluence.v pr2_confluence.vo pr3_defs.vo -pr3_gen.vo: pr3_gen.v pr2_gen.vo pr3_defs.vo pr3_props.vo -pr3_props.vo: pr3_props.v subst0_subst0.vo pr0_subst0.vo cpr0_defs.vo pr2_lift.vo pr2_gen.vo pr3_defs.vo -pr3_defs.vo: pr3_defs.v pr1_defs.vo pr2_defs.vo -pr2_gen_context.vo: pr2_gen_context.v drop_props.vo subst1_gen.vo subst1_subst1.vo subst1_confluence.vo csubst1_defs.vo pr0_gen.vo pr0_subst1.vo pr2_defs.vo pr2_gen.vo pr2_subst1.vo -pr2_subst1.vo: pr2_subst1.v subst1_defs.vo subst1_confluence.vo drop_props.vo pr0_subst1.vo pr2_defs.vo -pr2_confluence.vo: pr2_confluence.v subst0_confluence.vo drop_props.vo pr0_subst0.vo pr0_confluence.vo pr2_defs.vo -pr2_gen.vo: pr2_gen.v subst0_gen.vo subst0_lift.vo drop_props.vo pr0_gen.vo pr0_subst0.vo pr2_defs.vo -pr2_lift.vo: pr2_lift.v subst0_lift.vo drop_props.vo pr0_lift.vo pr2_defs.vo -pr2_defs.vo: pr2_defs.v drop_defs.vo pr0_defs.vo -cpr0_defs.vo: cpr0_defs.v contexts_defs.vo drop_defs.vo pr0_defs.vo -pr1_confluence.vo: pr1_confluence.v pr0_confluence.vo pr1_defs.vo -pr1_defs.vo: pr1_defs.v pr0_defs.vo -pr0_subst1.vo: pr0_subst1.v subst1_defs.vo pr0_defs.vo pr0_subst0.vo -pr0_confluence.vo: pr0_confluence.v tlt_defs.vo lift_gen.vo lift_tlt.vo subst0_gen.vo subst0_confluence.vo pr0_defs.vo pr0_lift.vo pr0_gen.vo pr0_subst0.vo -pr0_subst0.vo: pr0_subst0.v subst0_gen.vo subst0_lift.vo subst0_subst0.vo subst0_confluence.vo pr0_defs.vo pr0_lift.vo -pr0_gen.vo: pr0_gen.v lift_gen.vo lift_props.vo subst0_gen.vo pr0_defs.vo pr0_lift.vo -pr0_lift.vo: pr0_lift.v lift_props.vo subst0_lift.vo pr0_defs.vo -pr0_defs.vo: pr0_defs.v subst0_defs.vo -fsubst0_defs.vo: fsubst0_defs.v subst0_defs.vo csubst0_defs.vo -csubst1_defs.vo: csubst1_defs.v subst1_defs.vo csubst0_defs.vo -csubst0_defs.vo: csubst0_defs.v contexts_defs.vo subst0_defs.vo drop_defs.vo -subst1_confluence.vo: subst1_confluence.v lift_gen.vo subst0_gen.vo subst0_confluence.vo subst1_defs.vo subst1_gen.vo -subst1_subst1.vo: subst1_subst1.v subst0_subst0.vo subst1_defs.vo -subst1_lift.vo: subst1_lift.v lift_props.vo subst0_lift.vo subst1_defs.vo -subst1_gen.vo: subst1_gen.v subst0_gen.vo subst1_defs.vo -subst1_defs.vo: subst1_defs.v subst0_defs.vo -subst0_tlt.vo: subst0_tlt.v tlt_defs.vo lift_tlt.vo subst0_defs.vo -subst0_confluence.vo: subst0_confluence.v lift_gen.vo subst0_gen.vo subst0_defs.vo -subst0_subst0.vo: subst0_subst0.v subst0_defs.vo subst0_gen.vo subst0_lift.vo -subst0_lift.vo: subst0_lift.v lift_props.vo subst0_defs.vo -subst0_gen.vo: subst0_gen.v lift_props.vo subst0_defs.vo -subst0_defs.vo: subst0_defs.v lift_defs.vo -drop_props.vo: drop_props.v lift_gen.vo drop_defs.vo -drop_defs.vo: drop_defs.v contexts_defs.vo lift_defs.vo -lift_tlt.vo: lift_tlt.v tlt_defs.vo lift_defs.vo -lift_props.vo: lift_props.v lift_defs.vo -lift_gen.vo: lift_gen.v lift_defs.vo -lift_defs.vo: lift_defs.v terms_defs.vo -contexts_defs.vo: contexts_defs.v terms_defs.vo -tlt_defs.vo: tlt_defs.v terms_defs.vo -terms_defs.vo: terms_defs.v Base.vo -Base.vo: Base.v base_tactics.vo base_hints.vo base_types.vo base_blt.vo base_rewrite.vo -base_rewrite.vo: base_rewrite.v -base_blt.vo: base_blt.v base_tactics.vo base_hints.vo -base_types.vo: base_types.v base_tactics.vo base_hints.vo -base_hints.vo: base_hints.v base_tactics.vo -base_tactics.vo: base_tactics.v diff --git a/helm/coq-contribs/LAMBDA-TYPES/Base.v b/helm/coq-contribs/LAMBDA-TYPES/Base.v deleted file mode 100644 index 6015c1774..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/Base.v +++ /dev/null @@ -1,7 +0,0 @@ -Require Export Arith. -Require Export Wf_nat. -Require Export base_tactics. -Require Export base_hints. -Require Export base_types. -Require Export base_blt. -Require Export base_rewrite. diff --git a/helm/coq-contribs/LAMBDA-TYPES/LambdaDelta.v b/helm/coq-contribs/LAMBDA-TYPES/LambdaDelta.v deleted file mode 100644 index c44873ee0..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/LambdaDelta.v +++ /dev/null @@ -1,67 +0,0 @@ -Require Export base_tactics. -Require Export base_hints. -Require Export base_types. -Require Export base_blt. -Require Export base_rewrite. -Require Export Base. -Require Export terms_defs. -Require Export tlt_defs. -Require Export contexts_defs. -Require Export lift_defs. -Require Export lift_gen. -Require Export lift_props. -Require Export lift_tlt. -Require Export drop_defs. -Require Export drop_props. -Require Export subst0_defs. -Require Export subst0_gen. -Require Export subst0_lift. -Require Export subst0_subst0. -Require Export subst0_confluence. -Require Export subst0_tlt. -Require Export subst1_defs. -Require Export subst1_gen. -Require Export subst1_lift. -Require Export subst1_subst1. -Require Export subst1_confluence. -Require Export csubst0_defs. -Require Export csubst1_defs. -Require Export fsubst0_defs. -Require Export pr0_defs. -Require Export pr0_lift. -Require Export pr0_gen. -Require Export pr0_subst0. -Require Export pr0_confluence. -Require Export pr0_subst1. -Require Export pr1_defs. -Require Export pr1_confluence. -Require Export cpr0_defs. -Require Export pr2_defs. -Require Export pr2_lift. -Require Export pr2_gen. -Require Export pr2_confluence. -Require Export pr2_subst1. -Require Export pr2_gen_context. -Require Export pr3_defs. -Require Export pr3_props. -Require Export pr3_gen. -Require Export pr3_confluence. -Require Export pr3_subst1. -Require Export pr3_gen_context. -Require Export pc1_defs. -Require Export pc1_props. -Require Export pc3_defs. -Require Export pc3_props. -Require Export pc3_gen. -Require Export pc3_subst0. -Require Export pc3_gen_context. -Require Export ty0_defs. -Require Export ty0_gen. -Require Export ty0_lift. -Require Export ty0_props. -Require Export ty0_subst0. -Require Export ty0_gen_context. -Require Export csub0_defs. -Require Export csub0_props. -Require Export ty0_sred. -Require Export ty0_sred_props. diff --git a/helm/coq-contribs/LAMBDA-TYPES/Make b/helm/coq-contribs/LAMBDA-TYPES/Make deleted file mode 100644 index c895b78c9..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/Make +++ /dev/null @@ -1,69 +0,0 @@ -# List of vernac files to compile -base_tactics.v -base_hints.v -base_types.v -base_blt.v -base_rewrite.v -Base.v -terms_defs.v -tlt_defs.v -contexts_defs.v -lift_defs.v -lift_gen.v -lift_props.v -lift_tlt.v -drop_defs.v -drop_props.v -subst0_defs.v -subst0_gen.v -subst0_lift.v -subst0_subst0.v -subst0_confluence.v -subst0_tlt.v -subst1_defs.v -subst1_gen.v -subst1_lift.v -subst1_subst1.v -subst1_confluence.v -csubst0_defs.v -csubst1_defs.v -fsubst0_defs.v -pr0_defs.v -pr0_lift.v -pr0_gen.v -pr0_subst0.v -pr0_confluence.v -pr0_subst1.v -pr1_defs.v -pr1_confluence.v -cpr0_defs.v -pr2_defs.v -pr2_lift.v -pr2_gen.v -pr2_confluence.v -pr2_subst1.v -pr2_gen_context.v -pr3_defs.v -pr3_props.v -pr3_gen.v -pr3_confluence.v -pr3_subst1.v -pr3_gen_context.v -pc1_defs.v -pc1_props.v -pc3_defs.v -pc3_props.v -pc3_gen.v -pc3_subst0.v -pc3_gen_context.v -ty0_defs.v -ty0_gen.v -ty0_lift.v -ty0_props.v -ty0_subst0.v -ty0_gen_context.v -csub0_defs.v -csub0_props.v -ty0_sred.v -ty0_sred_props.v -LambdaDelta.v diff --git a/helm/coq-contribs/LAMBDA-TYPES/Makefile b/helm/coq-contribs/LAMBDA-TYPES/Makefile deleted file mode 100644 index 1648c32aa..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/Makefile +++ /dev/null @@ -1,361 +0,0 @@ -############################################################################## -## The Calculus of Inductive Constructions ## -## ## -## Projet Coq ## -## ## -## INRIA ENS-CNRS ## -## Rocquencourt Lyon ## -## ## -## Coq V7 ## -## ## -## ## -############################################################################## - -# WARNING -# -# This Makefile has been automagically generated by coq_makefile -# Edit at your own risks ! -# -# END OF WARNING - -# -# This Makefile was generated by the command line : -# coq_makefile -f Make -o Makefile -# - -########################## -# # -# Variables definitions. # -# # -########################## - -CAMLP4LIB=`camlp4 -where` -COQSRC=-I $(COQTOP)/kernel -I $(COQTOP)/lib \ - -I $(COQTOP)/library -I $(COQTOP)/parsing -I $(COQTOP)/pretyping \ - -I $(COQTOP)/proofs -I $(COQTOP)/syntax -I $(COQTOP)/tactics \ - -I $(COQTOP)/toplevel -I $(CAMLP4LIB) -ZFLAGS=$(OCAMLLIBS) $(COQSRC) -OPT= -COQFLAGS=-q $(OPT) $(COQLIBS) -COQC=$(COQBIN)coqc -GALLINA=gallina -COQWEB=coqweb -CAMLC=ocamlc -c -CAMLOPTC=ocamlopt -c -CAMLLINK=ocamlc -CAMLOPTLINK=ocamlopt -COQDEP=$(COQBIN)coqdep -c -COQVO2XML=coq_vo2xml - -######################### -# # -# Libraries definition. # -# # -######################### - -OCAMLLIBS=-I . -COQLIBS=-I . - -################################### -# # -# Definition of the "all" target. # -# # -################################### - -VFILES=base_tactics.v\ - base_hints.v\ - base_types.v\ - base_blt.v\ - base_rewrite.v\ - Base.v\ - terms_defs.v\ - tlt_defs.v\ - contexts_defs.v\ - lift_defs.v\ - lift_gen.v\ - lift_props.v\ - lift_tlt.v\ - drop_defs.v\ - drop_props.v\ - subst0_defs.v\ - subst0_gen.v\ - subst0_lift.v\ - subst0_subst0.v\ - subst0_confluence.v\ - subst0_tlt.v\ - subst1_defs.v\ - subst1_gen.v\ - subst1_lift.v\ - subst1_subst1.v\ - subst1_confluence.v\ - csubst0_defs.v\ - csubst1_defs.v\ - fsubst0_defs.v\ - pr0_defs.v\ - pr0_lift.v\ - pr0_gen.v\ - pr0_subst0.v\ - pr0_confluence.v\ - pr0_subst1.v\ - pr1_defs.v\ - pr1_confluence.v\ - cpr0_defs.v\ - pr2_defs.v\ - pr2_lift.v\ - pr2_gen.v\ - pr2_confluence.v\ - pr2_subst1.v\ - pr2_gen_context.v\ - pr3_defs.v\ - pr3_props.v\ - pr3_gen.v\ - pr3_confluence.v\ - pr3_subst1.v\ - pr3_gen_context.v\ - pc1_defs.v\ - pc1_props.v\ - pc3_defs.v\ - pc3_props.v\ - pc3_gen.v\ - pc3_subst0.v\ - pc3_gen_context.v\ - ty0_defs.v\ - ty0_gen.v\ - ty0_lift.v\ - ty0_props.v\ - ty0_subst0.v\ - ty0_gen_context.v\ - csub0_defs.v\ - csub0_props.v\ - ty0_sred.v\ - ty0_sred_props.v\ - LambdaDelta.v -VOFILES=$(VFILES:.v=.vo) -VIFILES=$(VFILES:.v=.vi) -GFILES=$(VFILES:.v=.g) -HTMLFILES=$(VFILES:.v=.html) -GHTMLFILES=$(VFILES:.v=.g.html) - -all: base_tactics.vo\ - base_hints.vo\ - base_types.vo\ - base_blt.vo\ - base_rewrite.vo\ - Base.vo\ - terms_defs.vo\ - tlt_defs.vo\ - contexts_defs.vo\ - lift_defs.vo\ - lift_gen.vo\ - lift_props.vo\ - lift_tlt.vo\ - drop_defs.vo\ - drop_props.vo\ - subst0_defs.vo\ - subst0_gen.vo\ - subst0_lift.vo\ - subst0_subst0.vo\ - subst0_confluence.vo\ - subst0_tlt.vo\ - subst1_defs.vo\ - subst1_gen.vo\ - subst1_lift.vo\ - subst1_subst1.vo\ - subst1_confluence.vo\ - csubst0_defs.vo\ - csubst1_defs.vo\ - fsubst0_defs.vo\ - pr0_defs.vo\ - pr0_lift.vo\ - pr0_gen.vo\ - pr0_subst0.vo\ - pr0_confluence.vo\ - pr0_subst1.vo\ - pr1_defs.vo\ - pr1_confluence.vo\ - cpr0_defs.vo\ - pr2_defs.vo\ - pr2_lift.vo\ - pr2_gen.vo\ - pr2_confluence.vo\ - pr2_subst1.vo\ - pr2_gen_context.vo\ - pr3_defs.vo\ - pr3_props.vo\ - pr3_gen.vo\ - pr3_confluence.vo\ - pr3_subst1.vo\ - pr3_gen_context.vo\ - pc1_defs.vo\ - pc1_props.vo\ - pc3_defs.vo\ - pc3_props.vo\ - pc3_gen.vo\ - pc3_subst0.vo\ - pc3_gen_context.vo\ - ty0_defs.vo\ - ty0_gen.vo\ - ty0_lift.vo\ - ty0_props.vo\ - ty0_subst0.vo\ - ty0_gen_context.vo\ - csub0_defs.vo\ - csub0_props.vo\ - ty0_sred.vo\ - ty0_sred_props.vo\ - LambdaDelta.vo - -spec: $(VIFILES) - -gallina: $(GFILES) - -html: $(HTMLFILES) - -gallinahtml: $(GHTMLFILES) - -all.ps: $(VFILES) - $(COQWEB) -ps -o $@ `$(COQDEP) -sort -suffix .v $(VFILES)` - -all-gal.ps: $(GFILES) - $(COQWEB) -ps -o $@ `$(COQDEP) -sort -suffix .g $(VFILES)` - -xml:: .xml_time_stamp -.xml_time_stamp: base_tactics.vo\ - base_hints.vo\ - base_types.vo\ - base_blt.vo\ - base_rewrite.vo\ - Base.vo\ - terms_defs.vo\ - tlt_defs.vo\ - contexts_defs.vo\ - lift_defs.vo\ - lift_gen.vo\ - lift_props.vo\ - lift_tlt.vo\ - drop_defs.vo\ - drop_props.vo\ - subst0_defs.vo\ - subst0_gen.vo\ - subst0_lift.vo\ - subst0_subst0.vo\ - subst0_confluence.vo\ - subst0_tlt.vo\ - subst1_defs.vo\ - subst1_gen.vo\ - subst1_lift.vo\ - subst1_subst1.vo\ - subst1_confluence.vo\ - csubst0_defs.vo\ - csubst1_defs.vo\ - fsubst0_defs.vo\ - pr0_defs.vo\ - pr0_lift.vo\ - pr0_gen.vo\ - pr0_subst0.vo\ - pr0_confluence.vo\ - pr0_subst1.vo\ - pr1_defs.vo\ - pr1_confluence.vo\ - cpr0_defs.vo\ - pr2_defs.vo\ - pr2_lift.vo\ - pr2_gen.vo\ - pr2_confluence.vo\ - pr2_subst1.vo\ - pr2_gen_context.vo\ - pr3_defs.vo\ - pr3_props.vo\ - pr3_gen.vo\ - pr3_confluence.vo\ - pr3_subst1.vo\ - pr3_gen_context.vo\ - pc1_defs.vo\ - pc1_props.vo\ - pc3_defs.vo\ - pc3_props.vo\ - pc3_gen.vo\ - pc3_subst0.vo\ - pc3_gen_context.vo\ - ty0_defs.vo\ - ty0_gen.vo\ - ty0_lift.vo\ - ty0_props.vo\ - ty0_subst0.vo\ - ty0_gen_context.vo\ - csub0_defs.vo\ - csub0_props.vo\ - ty0_sred.vo\ - ty0_sred_props.vo\ - LambdaDelta.vo - $(COQVO2XML) $(COQFLAGS) $(?:%.o=%) - touch .xml_time_stamp - -#################### -# # -# Special targets. # -# # -#################### - -.PHONY: all opt byte archclean clean install depend xml - -.SUFFIXES: .v .vo .vi .g .html .tex .g.tex .g.html - -.v.vo: - $(COQC) $(COQDEBUG) $(COQFLAGS) $* - -.v.vi: - $(COQC) -i $(COQDEBUG) $(COQFLAGS) $* - -.v.g: - $(GALLINA) $< - -.v.tex: - $(COQWEB) $< -o $@ - -.v.html: - $(COQWEB) -html $< -o $@ - -.g.g.tex: - $(COQWEB) $< -o $@ - -.g.g.html: - $(COQWEB) -html $< -o $@ - -byte: - $(MAKE) all "OPT=" - -opt: - $(MAKE) all "OPT=-opt" - -include .depend - -depend: - rm .depend - $(COQDEP) -i $(COQLIBS) *.v *.ml *.mli >.depend - $(COQDEP) $(COQLIBS) -suffix .html *.v >>.depend - -xml:: - -install: - mkdir -p `$(COQC) -where`/user-contrib - cp -f *.vo `$(COQC) -where`/user-contrib - -Makefile: Make - mv -f Makefile Makefile.bak - $(COQBIN)coq_makefile -f Make -o Makefile - -clean: - rm -f *.cmo *.cmi *.cmx *.o *.vo *.vi *.g *~ - rm -f all.ps all-gal.ps $(HTMLFILES) $(GHTMLFILES) - -archclean: - rm -f *.cmx *.o - -# WARNING -# -# This Makefile has been automagically generated by coq_makefile -# Edit at your own risks ! -# -# END OF WARNING - diff --git a/helm/coq-contribs/LAMBDA-TYPES/README b/helm/coq-contribs/LAMBDA-TYPES/README deleted file mode 100644 index 6a5bf7e0f..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/README +++ /dev/null @@ -1,61 +0,0 @@ - - Contribution Bologna/LAMBDA-TYPES - ================================== - -This directory contains a formalization in Coq of "lambda-delta", a -lambda-typed lambda-calculus with abbreviations. - -Author & Date: Ferruccio Guidi - Department of Computer Science, University of Bologna - March 2005 -E-mail : fguidi@cs.unibo.it -WWW : http://www.cs.unibo.it/~fguidi - -Installation procedure: ------------------------ - - To get this contribution compiled, type - - make - - or - - make opt - - The main modules produced by the compilation are: - - LambdaDelta provides the theory of the "lambda-delta" calculus - and its prerequisites - - Base provides just the prerequisites (mainly some arithmetic - properties missing in the standard library of Coq) - -Description: ------------- - - The present work, which is meant to be improved in the future, contains - a formalization of the "lambda-delta" calculus, defined in "item notation" - and with De Bruijn indices, and includes the proofs of some standard - properties of this calculus. In particular the user will find: - - - Confluence of reduction - - Generation lemma - - Thinning lemma - - Substitution lemma - - Type Correctness - - Type Uniqueness - - Subject Reduction - - Other properties to be added in the future versions of this contribution - include (but are not limited to): - - - Strong Normalization - - Decidability of Type Inference and Type Checking - -Further information on this contribution: ------------------------------------------ - - The latest version of this development is maintained in the CVS repository - of the HELM project and can be downloaded at: - - www.cs.unibo.it/cgi-bin/viewcvs.cgi/helm/coq-contribs/LAMBDA-TYPES diff --git a/helm/coq-contribs/LAMBDA-TYPES/base_blt.v b/helm/coq-contribs/LAMBDA-TYPES/base_blt.v deleted file mode 100644 index ae00365c6..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/base_blt.v +++ /dev/null @@ -1,33 +0,0 @@ -Require Arith. -Require base_tactics. -Require base_hints. - -(*#* #stop file *) - - Fixpoint blt [m,n: nat] : bool := Cases n m of - | (0) m => false - | (S n) (0) => true - | (S n) (S m) => (blt m n) - end. - - Section blt_props. (******************************************************) - - Theorem lt_blt: (x,y:?) (lt y x) -> (blt y x) = true. - XElim x; [ Intros; Inversion H | XElim y; Simpl; XAuto ]. - Qed. - - Theorem le_bge: (x,y:?) (le x y) -> (blt y x) = false. - XElim x; [ XAuto | XElim y; Intros; [ Inversion H0 | Simpl; XAuto ] ]. - Qed. - - Theorem blt_lt: (x,y:?) (blt y x) = true -> (lt y x). - XElim x; [ Intros; Inversion H | XElim y; Simpl; XAuto ]. - Qed. - - Theorem bge_le: (x,y:?) (blt y x) = false -> (le x y). - XElim x; [ XAuto | XElim y; Intros; [ Inversion H0 | Simpl; XAuto ] ]. - Qed. - - End blt_props. - - Hints Resolve lt_blt le_bge : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/base_hints.v b/helm/coq-contribs/LAMBDA-TYPES/base_hints.v deleted file mode 100644 index a364406a3..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/base_hints.v +++ /dev/null @@ -1,262 +0,0 @@ -(*#* #stop file *) - -Require Arith. -Require base_tactics. - -(* eq ***********************************************************************) - -Hint eq : ltlc := Constructors eq. - -Hint f1N : ltlc := Resolve (f_equal nat). - -Hint f2NN : ltlc := Resolve (f_equal2 nat nat). - -Hints Resolve sym_equal : ltlc. - -Hints Resolve plus_sym plus_n_Sm plus_assoc_r simpl_plus_l : ltlc. - -Hints Resolve minus_n_O : ltlc. - -(* le ***********************************************************************) - -Hint le : ltlc := Constructors le. - -Hints Resolve le_O_n le_n_S le_S_n le_trans : ltlc. - -Hints Resolve lt_le_S : ltlc. - -Hints Resolve le_plus_plus le_plus_trans le_plus_l le_plus_r : ltlc. - -(* lt ***********************************************************************) - -Hints Resolve lt_trans : ltlc. - -Hints Resolve lt_le_trans le_lt_n_Sm : ltlc. - -Hints Resolve lt_reg_r lt_le_plus_plus le_lt_plus_plus : ltlc. - -(* not **********************************************************************) - -Hints Resolve sym_not_equal : ltlc. - -(* missing in the standard library ******************************************) - - Theorem simpl_plus_r: (n,m,p:?) (plus m n) = (plus p n) -> m = p. - Intros. - Apply (simpl_plus_l n). - Rewrite plus_sym. - Rewrite H; XAuto. - Qed. - - Theorem minus_plus_r: (m,n:?) (minus (plus m n) n) = m. - Intros. - Rewrite plus_sym. - Apply minus_plus. - Qed. - - Theorem plus_permute_2_in_3: (x,y,z:?) (plus (plus x y) z) = (plus (plus x z) y). - Intros. - Rewrite plus_assoc_r. - Rewrite (plus_sym y z). - Rewrite <- plus_assoc_r; XAuto. - Qed. - - Theorem plus_permute_2_in_3_assoc: (n,h,k:?) (plus (plus n h) k) = (plus n (plus k h)). - Intros. - Rewrite plus_permute_2_in_3; Rewrite plus_assoc_l; XAuto. - Qed. - - Theorem plus_O: (x,y:?) (plus x y) = (0) -> x = (O) /\ y = (O). - XElim x; [ XAuto | Intros; Inversion H0 ]. - Qed. - - Theorem minus_Sx_SO: (x:?) (minus (S x) (1)) = x. - Intros; Simpl; Rewrite <- minus_n_O; XAuto. - Qed. - - Theorem eq_nat_dec: (i,j:nat) ~i=j \/ i=j. - XElim i; XElim j; Intros; XAuto. - Elim (H n0); XAuto. - Qed. - - Theorem neq_eq_e: (i,j:nat; P:Prop) (~i=j -> P) -> (i=j -> P) -> P. - Intros. - Pose (eq_nat_dec i j). - XElim o; XAuto. - Qed. - - Theorem le_false: (m,n:?; P:Prop) (le m n) -> (le (S n) m) -> P. - XElim m. -(* case 1 : m = 0 *) - Intros; Inversion H0. -(* case 2 : m > 0 *) - XElim n0; Intros. -(* case 2.1 : n = 0 *) - Inversion H0. -(* case 2.2 : n > 0 *) - Simpl in H1. - Apply (H n0); XAuto. - Qed. - - Theorem le_plus_minus_sym: (n,m:?) (le n m) -> m = (plus (minus m n) n). - Intros. - Rewrite plus_sym; Apply le_plus_minus; XAuto. - Qed. - - Theorem le_minus_minus: (x,y:?) (le x y) -> (z:?) (le y z) -> - (le (minus y x) (minus z x)). - Intros. - EApply simpl_le_plus_l. - Rewrite le_plus_minus_r; [ Idtac | XAuto ]. - Rewrite le_plus_minus_r; XEAuto. - Qed. - - Theorem le_minus_plus: (z,x:?) (le z x) -> (y:?) - (minus (plus x y) z) = (plus (minus x z) y). - XElim z. -(* case 1 : z = 0 *) - Intros x H; Inversion H; XAuto. -(* case 2 : z > 0 *) - Intros z; XElim x; Intros. -(* case 2.1 : x = 0 *) - Inversion H0. -(* case 2.2 : x > 0 *) - Simpl; XAuto. - Qed. - - Theorem le_minus: (x,z,y:?) (le (plus x y) z) -> (le x (minus z y)). - Intros. - Rewrite <- (minus_plus_r x y); XAuto. - Apply le_minus_minus; XAuto. - Qed. - - Theorem le_trans_plus_r: (x,y,z:?) (le (plus x y) z) -> (le y z). - Intros. - EApply le_trans; [ EApply le_plus_r | Idtac ]; XEAuto. - Qed. - - Theorem le_gen_S: (m,x:?) (le (S m) x) -> - (EX n | x = (S n) & (le m n)). - Intros; Inversion H; XEAuto. - Qed. - - Theorem lt_x_plus_x_Sy: (x,y:?) (lt x (plus x (S y))). - Intros; Rewrite plus_sym; Simpl; XAuto. - Qed. - - Theorem simpl_lt_plus_r: (p,n,m:?) (lt (plus n p) (plus m p)) -> (lt n m). - Intros. - EApply simpl_lt_plus_l. - Rewrite plus_sym in H; Rewrite (plus_sym m p) in H; Apply H. - Qed. - - Theorem minus_x_Sy: (x,y:?) (lt y x) -> - (minus x y) = (S (minus x (S y))). - XElim x. -(* case 1 : x = 0 *) - Intros; Inversion H. -(* case 2 : x > 0 *) - XElim y; Intros; Simpl. -(* case 2.1 : y = 0 *) - Rewrite <- minus_n_O; XAuto. -(* case 2.2 : y > 0 *) - Cut (lt n0 n); XAuto. - Qed. - - Theorem lt_plus_minus: (x,y:?) (lt x y) -> - y = (S (plus x (minus y (S x)))). - Intros. - Apply (le_plus_minus (S x) y); XAuto. - Qed. - - Theorem lt_plus_minus_r: (x,y:?) (lt x y) -> - y = (S (plus (minus y (S x)) x)). - Intros. - Rewrite plus_sym; Apply lt_plus_minus; XAuto. - Qed. - - Theorem minus_x_SO: (x:?) (lt (0) x) -> x = (S (minus x (1))). - Intros. - Rewrite <- minus_x_Sy; [ Rewrite <- minus_n_O; XEAuto | XEAuto ]. - Qed. - - Theorem lt_le_minus: (x,y:?) (lt x y) -> (le x (minus y (1))). - Intros; Apply le_minus; Rewrite plus_sym; Simpl; XAuto. - Qed. - - Theorem lt_le_e: (n,d:?; P:Prop) - ((lt n d) -> P) -> ((le d n) -> P) -> P. - Intros. - Cut (le d n) \/ (lt n d); [ Intros H1; XElim H1; XAuto | Apply le_or_lt ]. - Qed. - - Theorem lt_eq_e: (x,y:?; P:Prop) ((lt x y) -> P) -> - (x = y -> P) -> (le x y) -> P. - Intros. - LApply (le_lt_or_eq x y); [ Clear H1; Intros H1 | XAuto ]. - XElim H1; XAuto. - Qed. - - Theorem lt_eq_gt_e: (x,y:?; P:Prop) ((lt x y) -> P) -> - (x = y -> P) -> ((lt y x) -> P) -> P. - Intros. - Apply (lt_le_e x y); [ XAuto | Intros ]. - Apply (lt_eq_e y x); XAuto. - Qed. - - Theorem lt_gen_S': (x,n:?) (lt x (S n)) -> - x = (0) \/ (EX m | x = (S m) & (lt m n)). - XElim x; XEAuto. - Qed. - -Hints Resolve le_lt_trans : ltlc. - -Hints Resolve simpl_plus_r minus_plus_r minus_x_Sy - plus_permute_2_in_3 plus_permute_2_in_3_assoc : ltlc. - -Hints Resolve le_minus_minus le_minus_plus le_minus le_trans_plus_r : ltlc. - -Hints Resolve lt_x_plus_x_Sy simpl_lt_plus_r lt_le_minus lt_plus_minus - lt_plus_minus_r : ltlc. - - Theorem lt_neq: (x,y:?) (lt x y) -> ~x=y. - Unfold not; Intros; Rewrite H0 in H; Clear H0 x. - LApply (lt_n_n y); XAuto. - Qed. - -Hints Resolve lt_neq : ltlc. - - Theorem arith0: (h2,d2,n:?) (le (plus d2 h2) n) -> - (h1:?) (le (plus d2 h1) (minus (plus n h1) h2)). - Intros. - Rewrite <- (minus_plus h2 (plus d2 h1)). - Apply le_minus_minus; [ XAuto | Idtac ]. - Rewrite plus_assoc_l; Rewrite (plus_sym h2 d2); XAuto. - Qed. - -Hints Resolve arith0 : ltlc. - - Tactic Definition EqFalse := - Match Context With - [ H: ~?1=?1 |- ? ] -> - LApply H; [ Clear H; Intros H; Inversion H | XAuto ]. - - Tactic Definition PlusO := - Match Context With - | [ H: (plus ?0 ?1) = (0) |- ? ] -> - LApply (plus_O ?0 ?1); [ Clear H; Intros H | XAuto ]; - XElim H; Intros. - - Tactic Definition SymEqual := - Match Context With - | [ H: ?1 = ?2 |- ? ] -> - Cut ?2 = ?1; [ Clear H; Intros H | Apply sym_equal; XAuto ]. - - Tactic Definition LeLtGen := - Match Context With - | [ H: (le (S ?1) ?2) |- ? ] -> - LApply (le_gen_S ?1 ?2); [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (lt ?1 (S ?2)) |- ? ] -> - LApply (lt_gen_S' ?1 ?2); [ Clear H; Intros H | XAuto ]; - XElim H; [ Intros | Intros H; XElim H; Intros ]. diff --git a/helm/coq-contribs/LAMBDA-TYPES/base_rewrite.v b/helm/coq-contribs/LAMBDA-TYPES/base_rewrite.v deleted file mode 100644 index 68490ee3f..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/base_rewrite.v +++ /dev/null @@ -1,76 +0,0 @@ -(*#* #stop file *) - -Require Arith. - - Tactic Definition Arith0 x := - Replace (S x) with (plus (1) x); XAuto. - - Tactic Definition Arith1 x := - Replace x with (plus x (0)); [XAuto | Auto with arith]. - - Tactic Definition Arith1In H x := - XReplaceIn H x '(plus x (0)). - - Tactic Definition Arith2 x := - Replace x with (plus (0) x); XAuto. - - Tactic Definition Arith3 x := - Replace (S x) with (S (plus (0) x)); XAuto. - - Tactic Definition Arith3In H x := - XReplaceIn H '(S x) '(S (plus (0) x)). - - Tactic Definition Arith4 x y := - Replace (S (plus x y)) with (plus (S x) y); XAuto. - - Tactic Definition Arith4In H x y := - XReplaceIn H '(S (plus x y)) '(plus (S x) y). - - Tactic Definition Arith4c x y := - Arith4 x y; Rewrite plus_sym. - - Tactic Definition Arith5 x y := - Replace (S (plus x y)) with (plus x (S y)); Auto with arith. - - Tactic Definition Arith5In H x y := - XReplaceIn H '(S (plus x y)) '(plus x (S y)); Auto with arith. - - Tactic Definition Arith5' x y := - Replace (plus x (S y)) with (S (plus x y)); Auto with arith. - - Tactic Definition Arith5'In H x y := - XReplaceIn H '(plus x (S y)) '(S (plus x y)); Auto with arith. - - Tactic Definition Arith5'c x y := - Arith5' x y; Rewrite plus_sym. - - Tactic Definition Arith6In H x y := - XReplaceIn H '(plus x (S y)) '(plus (1) (plus x y)); - [ Idtac | Simpl; Auto with arith ]. - - Tactic Definition Arith7 x := - Replace (S x) with (plus x (1)); - [ Idtac | Rewrite plus_sym; Auto with arith ]. - - Tactic Definition Arith7In H x := - XReplaceIn H '(S x) '(plus x (1)) ; - [ Idtac | Rewrite plus_sym; Auto with arith ]. - - Tactic Definition Arith7' x := - Replace (plus x (1)) with (S x); - [ Idtac | Rewrite plus_sym; Auto with arith ]. - - Tactic Definition Arith8 x y := - Replace x with (plus y (minus x y)); - [ Idtac | Auto with arith ]. - - Tactic Definition Arith8' x y := - Replace (plus y (minus x y)) with x; - [ Idtac | Auto with arith ]. - - Tactic Definition Arith9'In H x := - XReplaceIn H '(S (plus x (0))) '(S x). - - Tactic Definition Arith10 x := - Replace x with (minus (S x) (1)); - [ Idtac | Simpl; Rewrite <- minus_n_O; Auto with arith ]. diff --git a/helm/coq-contribs/LAMBDA-TYPES/base_tactics.v b/helm/coq-contribs/LAMBDA-TYPES/base_tactics.v deleted file mode 100644 index daa6facca..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/base_tactics.v +++ /dev/null @@ -1,45 +0,0 @@ -(*#* #stop file *) - - Tactic Definition XAuto := Auto with ltlc. - - Tactic Definition XEAuto := EAuto with ltlc. - - Tactic Definition XDEAuto d := EAuto d with ltlc. - - Tactic Definition XElimUsing e v := - Try Intros until v; Elim v using e; Try Clear v. - - Tactic Definition XElim v := Try Intros until v; Elim v; Try Clear v. - - Tactic Definition XCase v := Try Intros until v; Case v; Try Clear v. - - Tactic Definition XReplaceIn Z0 y1 y2 := - Cut y1=y2; [ Intros Z; Rewrite Z in Z0; Clear Z | XAuto ]. - - Theorem insert_eq: (S:Set; x:S; P:S->Prop; G:Prop) - ((y:S) (P y) -> y = x -> G) -> (P x) -> G. - EAuto. Qed. - - Tactic Definition InsertEq H y := - Pattern 1 y in H; Match Context With [ _: (?1 y) |- ? ] -> - Apply insert_eq with x:=y P:=?1; - [ Clear H; Intros until 1 | Pattern y; Apply H ]. - - Theorem unintro : (A:Set; a:A; P:A->Prop) ((x:A) (P x)) -> (P a). - Auto. - Qed. - - Tactic Definition UnIntro Last H := - Move H after Last; - Match Context With [ y: ?1 |- ?2 ] -> - Apply (unintro ?1 y); Clear y. - - Tactic Definition NonLinear := - Match Context With - [ H: ?1 |- ? ] -> Cut ?1; [ Intros | XAuto ]. - - Tactic Definition XRewrite x := - Match Context With - | [ H0: x = ? |- ? ] -> Try Rewrite H0 - | [ H0: ? = x |- ? ] -> Try Rewrite <- H0 - | _ -> Idtac. diff --git a/helm/coq-contribs/LAMBDA-TYPES/base_types.v b/helm/coq-contribs/LAMBDA-TYPES/base_types.v deleted file mode 100644 index f24ef915a..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/base_types.v +++ /dev/null @@ -1,206 +0,0 @@ -(* This file was generated by coqgen *) - -Require base_tactics. -Require base_hints. - -(*#* #stop file *) - -(* extensions for ex2 *) - -Syntactic Definition ex2_intro := ex_intro2. - -Theorem ex2_sym: (A:Set; P,Q:A->Prop) - (EX x | (P x) & (Q x)) -> (EX x | (Q x) & (P x)). - Intros; XElim H; XEAuto. - Qed. - -Hints Resolve ex2_sym : ltlc. - -(* or3 *) - -Inductive or3 [P0,P1,P2:Prop] : Prop := - | or3_intro0 : P0 -> (or3 P0 P1 P2) - | or3_intro1 : P1 -> (or3 P0 P1 P2) - | or3_intro2 : P2 -> (or3 P0 P1 P2). - -Hint or3 : ltlc := Constructors or3. - -Grammar constr constr10 := - | or3 - [ "OR" constr($c0) "|" constr($c1) "|" constr($c2) ] -> - [ (or3 $c0 $c1 $c2) ]. - -(* or4 *) - -Inductive or4 [P0,P1,P2,P3:Prop] : Prop := - | or4_intro0 : P0 -> (or4 P0 P1 P2 P3) - | or4_intro1 : P1 -> (or4 P0 P1 P2 P3) - | or4_intro2 : P2 -> (or4 P0 P1 P2 P3) - | or4_intro3 : P3 -> (or4 P0 P1 P2 P3). - -Hint or4 : ltlc := Constructors or4. - -Grammar constr constr10 := - | or4 - [ "OR" constr($c0) "|" constr($c1) "|" constr($c2) "|" constr($c3) ] -> - [ (or4 $c0 $c1 $c2 $c3) ]. - -(* ex2_2 *) - -Inductive ex2_2 [A0,A1:Set; P0,P1:A0->A1->Prop] : Prop := - ex2_2_intro : (x0:A0; x1:A1)(P0 x0 x1)->(P1 x0 x1)->(ex2_2 A0 A1 P0 P1). - -Hint ex2_2 : ltlc := Constructors ex2_2. - -Syntactic Definition Ex2_2 := ex2_2 | 1. - -Grammar constr constr10 := - | ex2_2implicit - [ "EX" ident($v0) ident($v1) "|" constr($c0) "&" constr($c1) ] -> - [ (ex2_2 ? ? [$v0;$v1]$c0 [$v0;$v1]$c1) ]. - -(* ex3_2 *) - -Inductive ex3_2 [A0,A1:Set; P0,P1,P2:A0->A1->Prop] : Prop := - ex3_2_intro : (x0:A0; x1:A1)(P0 x0 x1)->(P1 x0 x1)->(P2 x0 x1)->(ex3_2 A0 A1 P0 P1 P2). - -Hint ex3_2 : ltlc := Constructors ex3_2. - -Syntactic Definition Ex3_2 := ex3_2 | 1. - -Grammar constr constr10 := - | ex3_2implicit - [ "EX" ident($v0) ident($v1) "|" constr($c0) "&" constr($c1) "&" constr($c2) ] -> - [ (ex3_2 ? ? [$v0;$v1]$c0 [$v0;$v1]$c1 [$v0;$v1]$c2) ]. - -(* ex_3 *) - -Inductive ex_3 [A0,A1,A2:Set; P0:A0->A1->A2->Prop] : Prop := - ex_3_intro : (x0:A0; x1:A1; x2:A2)(P0 x0 x1 x2)->(ex_3 A0 A1 A2 P0). - -Hint ex_3 : ltlc := Constructors ex_3. - -Syntactic Definition Ex_3 := ex_3 | 1. - -Grammar constr constr10 := - | ex_3implicit - [ "EX" ident($v0) ident($v1) ident($v2) "|" constr($c0) ] -> - [ (ex_3 ? ? ? [$v0;$v1;$v2]$c0) ]. - -(* ex3_3 *) - -Inductive ex3_3 [A0,A1,A2:Set; P0,P1,P2:A0->A1->A2->Prop] : Prop := - ex3_3_intro : (x0:A0; x1:A1; x2:A2)(P0 x0 x1 x2)->(P1 x0 x1 x2)->(P2 x0 x1 x2)->(ex3_3 A0 A1 A2 P0 P1 P2). - -Hint ex3_3 : ltlc := Constructors ex3_3. - -Syntactic Definition Ex3_3 := ex3_3 | 1. - -Grammar constr constr10 := - | ex3_3implicit - [ "EX" ident($v0) ident($v1) ident($v2) "|" constr($c0) "&" constr($c1) "&" constr($c2) ] -> - [ (ex3_3 ? ? ? [$v0;$v1;$v2]$c0 [$v0;$v1;$v2]$c1 [$v0;$v1;$v2]$c2) ]. - -(* ex4_3 *) - -Inductive ex4_3 [A0,A1,A2:Set; P0,P1,P2,P3:A0->A1->A2->Prop] : Prop := - ex4_3_intro : (x0:A0; x1:A1; x2:A2)(P0 x0 x1 x2)->(P1 x0 x1 x2)->(P2 x0 x1 x2)->(P3 x0 x1 x2)->(ex4_3 A0 A1 A2 P0 P1 P2 P3). - -Hint ex4_3 : ltlc := Constructors ex4_3. - -Syntactic Definition Ex4_3 := ex4_3 | 1. - -Grammar constr constr10 := - | ex4_3implicit - [ "EX" ident($v0) ident($v1) ident($v2) "|" constr($c0) "&" constr($c1) "&" constr($c2) "&" constr($c3) ] -> - [ (ex4_3 ? ? ? [$v0;$v1;$v2]$c0 [$v0;$v1;$v2]$c1 [$v0;$v1;$v2]$c2 [$v0;$v1;$v2]$c3) ]. - -(* ex3_4 *) - -Inductive ex3_4 [A0,A1,A2,A3:Set; P0,P1,P2:A0->A1->A2->A3->Prop] : Prop := - ex3_4_intro : (x0:A0; x1:A1; x2:A2; x3:A3)(P0 x0 x1 x2 x3)->(P1 x0 x1 x2 x3)->(P2 x0 x1 x2 x3)->(ex3_4 A0 A1 A2 A3 P0 P1 P2). - -Hint ex3_4 : ltlc := Constructors ex3_4. - -Syntactic Definition Ex3_4 := ex3_4 | 1. - -Grammar constr constr10 := - | ex3_4implicit - [ "EX" ident($v0) ident($v1) ident($v2) ident($v3) "|" constr($c0) "&" constr($c1) "&" constr($c2) ] -> - [ (ex3_4 ? ? ? ? [$v0;$v1;$v2;$v3]$c0 [$v0;$v1;$v2;$v3]$c1 [$v0;$v1;$v2;$v3]$c2) ]. - -(* ex4_4 *) - -Inductive ex4_4 [A0,A1,A2,A3:Set; P0,P1,P2,P3:A0->A1->A2->A3->Prop] : Prop := - ex4_4_intro : (x0:A0; x1:A1; x2:A2; x3:A3)(P0 x0 x1 x2 x3)->(P1 x0 x1 x2 x3)->(P2 x0 x1 x2 x3)->(P3 x0 x1 x2 x3)->(ex4_4 A0 A1 A2 A3 P0 P1 P2 P3). - -Hint ex4_4 : ltlc := Constructors ex4_4. - -Syntactic Definition Ex4_4 := ex4_4 | 1. - -Grammar constr constr10 := - | ex4_4implicit - [ "EX" ident($v0) ident($v1) ident($v2) ident($v3) "|" constr($c0) "&" constr($c1) "&" constr($c2) "&" constr($c3) ] -> - [ (ex4_4 ? ? ? ? [$v0;$v1;$v2;$v3]$c0 [$v0;$v1;$v2;$v3]$c1 [$v0;$v1;$v2;$v3]$c2 [$v0;$v1;$v2;$v3]$c3) ]. - -(* ex4_5 *) - -Inductive ex4_5 [A0,A1,A2,A3,A4:Set; P0,P1,P2,P3:A0->A1->A2->A3->A4->Prop] : Prop := - ex4_5_intro : (x0:A0; x1:A1; x2:A2; x3:A3; x4:A4)(P0 x0 x1 x2 x3 x4)->(P1 x0 x1 x2 x3 x4)->(P2 x0 x1 x2 x3 x4)->(P3 x0 x1 x2 x3 x4)->(ex4_5 A0 A1 A2 A3 A4 P0 P1 P2 P3). - -Hint ex4_5 : ltlc := Constructors ex4_5. - -Syntactic Definition Ex4_5 := ex4_5 | 1. - -Grammar constr constr10 := - | ex4_5implicit - [ "EX" ident($v0) ident($v1) ident($v2) ident($v3) ident($v4) "|" constr($c0) "&" constr($c1) "&" constr($c2) "&" constr($c3) ] -> - [ (ex4_5 ? ? ? ? ? [$v0;$v1;$v2;$v3;$v4]$c0 [$v0;$v1;$v2;$v3;$v4]$c1 [$v0;$v1;$v2;$v3;$v4]$c2 [$v0;$v1;$v2;$v3;$v4]$c3) ]. - -(* ex5_5 *) - -Inductive ex5_5 [A0,A1,A2,A3,A4:Set; P0,P1,P2,P3,P4:A0->A1->A2->A3->A4->Prop] : Prop := - ex5_5_intro : (x0:A0; x1:A1; x2:A2; x3:A3; x4:A4)(P0 x0 x1 x2 x3 x4)->(P1 x0 x1 x2 x3 x4)->(P2 x0 x1 x2 x3 x4)->(P3 x0 x1 x2 x3 x4)->(P4 x0 x1 x2 x3 x4)->(ex5_5 A0 A1 A2 A3 A4 P0 P1 P2 P3 P4). - -Hint ex5_5 : ltlc := Constructors ex5_5. - -Syntactic Definition Ex5_5 := ex5_5 | 1. - -Grammar constr constr10 := - | ex5_5implicit - [ "EX" ident($v0) ident($v1) ident($v2) ident($v3) ident($v4) "|" constr($c0) "&" constr($c1) "&" constr($c2) "&" constr($c3) "&" constr($c4) ] -> - [ (ex5_5 ? ? ? ? ? [$v0;$v1;$v2;$v3;$v4]$c0 [$v0;$v1;$v2;$v3;$v4]$c1 [$v0;$v1;$v2;$v3;$v4]$c2 [$v0;$v1;$v2;$v3;$v4]$c3 [$v0;$v1;$v2;$v3;$v4]$c4) ]. - -(* ex6_6 *) - -Inductive ex6_6 [A0,A1,A2,A3,A4,A5:Set; P0,P1,P2,P3,P4,P5:A0->A1->A2->A3->A4->A5->Prop] : Prop := - ex6_6_intro : (x0:A0; x1:A1; x2:A2; x3:A3; x4:A4; x5:A5)(P0 x0 x1 x2 x3 x4 x5)->(P1 x0 x1 x2 x3 x4 x5)->(P2 x0 x1 x2 x3 x4 x5)->(P3 x0 x1 x2 x3 x4 x5)->(P4 x0 x1 x2 x3 x4 x5)->(P5 x0 x1 x2 x3 x4 x5)->(ex6_6 A0 A1 A2 A3 A4 A5 P0 P1 P2 P3 P4 P5). - -Hint ex6_6 : ltlc := Constructors ex6_6. - -Syntactic Definition Ex6_6 := ex6_6 | 1. - -Grammar constr constr10 := - | ex6_6implicit - [ "EX" ident($v0) ident($v1) ident($v2) ident($v3) ident($v4) ident($v5) "|" constr($c0) "&" constr($c1) "&" constr($c2) "&" constr($c3) "&" constr($c4) "&" constr($c5) ] -> - [ (ex6_6 ? ? ? ? ? ? [$v0;$v1;$v2;$v3;$v4;$v5]$c0 [$v0;$v1;$v2;$v3;$v4;$v5]$c1 [$v0;$v1;$v2;$v3;$v4;$v5]$c2 [$v0;$v1;$v2;$v3;$v4;$v5]$c3 [$v0;$v1;$v2;$v3;$v4;$v5]$c4 [$v0;$v1;$v2;$v3;$v4;$v5]$c5) ]. - -(* ex6_7 *) - -Inductive ex6_7 [A0,A1,A2,A3,A4,A5,A6:Set; P0,P1,P2,P3,P4,P5:A0->A1->A2->A3->A4->A5->A6->Prop] : Prop := - ex6_7_intro : (x0:A0; x1:A1; x2:A2; x3:A3; x4:A4; x5:A5; x6:A6)(P0 x0 x1 x2 x3 x4 x5 x6)->(P1 x0 x1 x2 x3 x4 x5 x6)->(P2 x0 x1 x2 x3 x4 x5 x6)->(P3 x0 x1 x2 x3 x4 x5 x6)->(P4 x0 x1 x2 x3 x4 x5 x6)->(P5 x0 x1 x2 x3 x4 x5 x6)->(ex6_7 A0 A1 A2 A3 A4 A5 A6 P0 P1 P2 P3 P4 P5). - -Hint ex6_7 : ltlc := Constructors ex6_7. - -Syntactic Definition Ex6_7 := ex6_7 | 1. - -Grammar constr constr10 := - | ex6_7implicit - [ "EX" ident($v0) ident($v1) ident($v2) ident($v3) ident($v4) ident($v5) ident($v6) "|" constr($c0) "&" constr($c1) "&" constr($c2) "&" constr($c3) "&" constr($c4) "&" constr($c5) ] -> - [ (ex6_7 ? ? ? ? ? ? ? [$v0;$v1;$v2;$v3;$v4;$v5;$v6]$c0 [$v0;$v1;$v2;$v3;$v4;$v5;$v6]$c1 [$v0;$v1;$v2;$v3;$v4;$v5;$v6]$c2 [$v0;$v1;$v2;$v3;$v4;$v5;$v6]$c3 [$v0;$v1;$v2;$v3;$v4;$v5;$v6]$c4 [$v0;$v1;$v2;$v3;$v4;$v5;$v6]$c5) ]. - -(* extended Decompose tactic *) - -Tactic Definition XDecompose H := - Decompose [and or ex ex2 or3 or4 ex2_2 ex3_2 ex_3 ex3_3 ex4_3 ex3_4 ex4_4 ex4_5 ex5_5 ex6_6 ex6_7] H; Clear H. - diff --git a/helm/coq-contribs/LAMBDA-TYPES/contexts_defs.v b/helm/coq-contribs/LAMBDA-TYPES/contexts_defs.v deleted file mode 100644 index a9a689235..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/contexts_defs.v +++ /dev/null @@ -1,77 +0,0 @@ -(*#* #stop file *) - -Require Export terms_defs. - - Inductive Set C := CSort: nat -> C - | CTail: C -> K -> T -> C. - - Hint f3CKT : ltlc := Resolve (f_equal3 C K T). - - Tactic Definition CGenBase := - Match Context With - | [ H: (CSort ?) = (CSort ?) |- ? ] -> Inversion H; Clear H - | [ H: (CTail ? ? ?) = (CTail ? ? ?) |- ? ] -> Inversion H; Clear H - | _ -> TGenBase. - - Definition r: K -> nat -> nat := [k;i] Cases k of - | (Bind _) => i - | (Flat _) => (S i) - end. - - Fixpoint app [c:C] : nat -> T -> T := [j;t]Cases j c of - | (0) _ => t - | _ (CSort _) => t - | (S i) (CTail c k u) => (app c (r k i) (TTail k u t)) - end. - - Section r_props. (********************************************************) - - Theorem r_S: (k:?; i:?) (r k (S i)) = (S (r k i)). - XElim k; XAuto. - Qed. - - Theorem r_plus_sym: (k:?; i,j:?) (r k (plus i j)) = (plus i (r k j)). - XElim k; Intros; Simpl; XAuto. - Qed. - - Theorem r_minus: (i,n:?) (lt n i) -> - (k:?) (minus (r k i) (S n)) = (r k (minus i (S n))). - XElim k; Intros; Simpl; XEAuto. - Qed. - - Theorem r_dis: (k:?; P:Prop) - (((i:?) (r k i) = i) -> P) -> - (((i:?) (r k i) = (S i)) -> P) -> P. - XElim k; XAuto. - Qed. - - End r_props. - - Tactic Definition RRw := - Repeat (Rewrite r_S Orelse Rewrite r_plus_sym). - - Section r_arith. (********************************************************) - - Theorem r_arith0: (k:?; i:?) (minus (r k (S i)) (1)) = (r k i). - Intros; RRw; Rewrite minus_Sx_SO; XAuto. - Qed. - - Theorem r_arith1: (k:?; i,j:?) (minus (r k (S i)) (S j)) = (minus (r k i) j). - Intros; RRw; XAuto. - Qed. - - End r_arith. - - Section app_props. (******************************************************) - - Theorem app_csort: (t:?; i,n:?) (app (CSort n) i t) = t. - XElim i; Intros; Simpl; XAuto. - Qed. - - Theorem app_O: (c:?; t:?) (app c (0) t) = t. - XElim c; XAuto. - Qed. - - End app_props. - - Hints Resolve app_csort app_O : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/cpr0_defs.v b/helm/coq-contribs/LAMBDA-TYPES/cpr0_defs.v deleted file mode 100644 index 7773a3410..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/cpr0_defs.v +++ /dev/null @@ -1,90 +0,0 @@ -Require Export contexts_defs. -Require Export drop_defs. -Require Export pr0_defs. - -(*#* #caption "current axioms for the relation $\\CprZ{}{}$", - "reflexivity", "compatibility" -*) -(*#* #cap #cap c, c1, c2 #alpha u1 in V1, u2 in V2, k in z *) - - Inductive cpr0 : C -> C -> Prop := - | cpr0_refl : (c:?) (cpr0 c c) - | cpr0_comp : (c1,c2:?) (cpr0 c1 c2) -> (u1,u2:?) (pr0 u1 u2) -> - (k:?) (cpr0 (CTail c1 k u1) (CTail c2 k u2)). - -(*#* #stop file *) - - Hint cpr0 : ltlc := Constructors cpr0. - - Section cpr0_drop. (******************************************************) - - Theorem cpr0_drop : (c1,c2:?) (cpr0 c1 c2) -> (h:?; e1:?; u1:?; k:?) - (drop h (0) c1 (CTail e1 k u1)) -> - (EX e2 u2 | (drop h (0) c2 (CTail e2 k u2)) & - (cpr0 e1 e2) & (pr0 u1 u2) - ). - Intros until 1; XElim H. -(* case 1 : cpr0_refl *) - XEAuto. -(* case 2 : cpr0_comp *) - XElim h. -(* case 2.1 : h = 0 *) - Intros; DropGenBase. - Inversion H2; Rewrite H6 in H1; Rewrite H4 in H; XEAuto. -(* case 2.2 : h > 0 *) - XElim k; Intros; DropGenBase. -(* case 2.2.1 : Bind *) - LApply (H0 n e1 u0 k); [ Clear H0 H3; Intros H0 | XAuto ]. - XElim H0; XEAuto. -(* case 2.2.2 : Flat *) - LApply (H0 (S n) e1 u0 k); [ Clear H0 H3; Intros H0 | XAuto ]. - XElim H0; XEAuto. - Qed. - - Theorem cpr0_drop_back : (c1,c2:?) (cpr0 c2 c1) -> (h:?; e1:?; u1:?; k:?) - (drop h (0) c1 (CTail e1 k u1)) -> - (EX e2 u2 | (drop h (0) c2 (CTail e2 k u2)) & - (cpr0 e2 e1) & (pr0 u2 u1) - ). - Intros until 1; XElim H. -(* case 1 : cpr0_refl *) - XEAuto. -(* case 2 : cpr0_comp *) - XElim h. -(* case 2.1 : h = 0 *) - Intros; DropGenBase. - Inversion H2; Rewrite H6 in H1; Rewrite H4 in H; XEAuto. -(* case 2.2 : h > 0 *) - XElim k; Intros; DropGenBase. -(* case 2.2.1 : Bind *) - LApply (H0 n e1 u0 k); [ Clear H0 H3; Intros H0 | XAuto ]. - XElim H0; XEAuto. -(* case 2.2.2 : Flat *) - LApply (H0 (S n) e1 u0 k); [ Clear H0 H3; Intros H0 | XAuto ]. - XElim H0; XEAuto. - Qed. - - End cpr0_drop. - - Tactic Definition Cpr0Drop := - Match Context With - | [ _: (drop ?1 (0) ?2 (CTail ?3 ?4 ?5)); - _: (cpr0 ?2 ?6) |- ? ] -> - LApply (cpr0_drop ?2 ?6); [ Intros H_x | XAuto ]; - LApply (H_x ?1 ?3 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros - | [ _: (drop ?1 (0) ?2 (CTail ?3 ?4 ?5)); - _: (cpr0 ?6 ?2) |- ? ] -> - LApply (cpr0_drop_back ?2 ?6); [ Intros H_x | XAuto ]; - LApply (H_x ?1 ?3 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros - | [ _: (drop ?1 (0) (CTail ?2 ?7 ?8) (CTail ?3 ?4 ?5)); - _: (cpr0 ?2 ?6) |- ? ] -> - LApply (cpr0_drop (CTail ?2 ?7 ?8) (CTail ?6 ?7 ?8)); [ Intros H_x | XAuto ]; - LApply (H_x ?1 ?3 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros - | [ _: (drop ?1 (0) (CTail ?2 ?7 ?8) (CTail ?3 ?4 ?5)); - _: (cpr0 ?6 ?2) |- ? ] -> - LApply (cpr0_drop_back (CTail ?2 ?7 ?8) (CTail ?6 ?7 ?8)); [ Intros H_x | XAuto ]; - LApply (H_x ?1 ?3 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros. diff --git a/helm/coq-contribs/LAMBDA-TYPES/csub0_defs.v b/helm/coq-contribs/LAMBDA-TYPES/csub0_defs.v deleted file mode 100644 index 2949e83d9..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/csub0_defs.v +++ /dev/null @@ -1,114 +0,0 @@ -(*#* #stop file *) - -Require Export ty0_defs. - - Inductive csub0 [g:G] : C -> C -> Prop := -(* structural rules *) - | csub0_sort: (n:?) (csub0 g (CSort n) (CSort n)) - | csub0_tail: (c1,c2:?) (csub0 g c1 c2) -> (k,u:?) - (csub0 g (CTail c1 k u) (CTail c2 k u)) -(* axioms *) - | csub0_void: (c1,c2:?) (csub0 g c1 c2) -> (b:?) ~b=Void -> (u1,u2:?) - (csub0 g (CTail c1 (Bind Void) u1) (CTail c2 (Bind b) u2)) - | csub0_abst: (c1,c2:?) (csub0 g c1 c2) -> (u,t:?) (ty0 g c2 u t) -> - (csub0 g (CTail c1 (Bind Abst) t) (CTail c2 (Bind Abbr) u)). - - Hint csub0 : ltlc := Constructors csub0. - - Section csub0_props. (****************************************************) - - Theorem csub0_refl: (g:?; c:?) (csub0 g c c). - XElim c; XAuto. - Qed. - - End csub0_props. - - Hints Resolve csub0_refl : ltlc. - - Section csub0_drop. (*****************************************************) - - Theorem csub0_drop_abbr: (g:?; n:?; c1,c2:?) (csub0 g c1 c2) -> (d1,u:?) - (drop n (0) c1 (CTail d1 (Bind Abbr) u)) -> - (EX d2 | (csub0 g d1 d2) & - (drop n (0) c2 (CTail d2 (Bind Abbr) u)) - ). - XElim n. -(* case 1 : n = 0 *) - Intros; DropGenBase; Rewrite H0 in H; Inversion H; XEAuto. -(* case 2 : n > 0 *) - Intros until 2; XElim H0. -(* case 2.1 : csub0_sort *) - Intros; Inversion H0. -(* case 2.2 : csub0_tail *) - XElim k; Intros; DropGenBase. -(* case 2.2.1 : Bind *) - LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. - LApply (H d1 u0); [ Clear H; Intros H | XAuto ]. - XElim H; XEAuto. -(* case 2.2.2 : Flat *) - LApply (H1 d1 u0); [ Clear H1; Intros H1 | XAuto ]. - XElim H1; XEAuto. -(* case 2.3 : csub0_void *) - Intros; DropGenBase. - LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. - LApply (H d1 u); [ Clear H; Intros H | XAuto ]. - XElim H; XEAuto. -(* case 2.4 : csub0_abst *) - Intros; DropGenBase. - LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. - LApply (H d1 u0); [ Clear H; Intros H | XAuto ]. - XElim H; XEAuto. - Qed. - - Theorem csub0_drop_abst: (g:?; n:?; c1,c2:?) (csub0 g c1 c2) -> (d1,t:?) - (drop n (0) c1 (CTail d1 (Bind Abst) t)) -> - (EX d2 | (csub0 g d1 d2) & - (drop n (0) c2 (CTail d2 (Bind Abst) t)) - - ) \/ - (EX d2 u | (csub0 g d1 d2) & - (drop n (0) c2 (CTail d2 (Bind Abbr) u)) & - (ty0 g d2 u t) - ). - XElim n. -(* case 1 : n = 0 *) - Intros; DropGenBase; Rewrite H0 in H; Inversion H; XEAuto. -(* case 2 : n > 0 *) - Intros until 2; XElim H0. -(* case 2.1 : csub0_sort *) - Intros; Inversion H0. -(* case 2.2 : csub0_tail *) - XElim k; Intros; DropGenBase. -(* case 2.2.1 : Bind *) - LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. - LApply (H d1 t); [ Clear H; Intros H | XAuto ]. - XElim H; Intros; XElim H; XEAuto. -(* case 2.2.2 : Flat *) - LApply (H1 d1 t); [ Clear H1; Intros H1 | XAuto ]. - XElim H1; Intros; XElim H1; XEAuto. -(* case 2.3 : csub0_void *) - Intros; DropGenBase. - LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. - LApply (H d1 t); [ Clear H; Intros H | XAuto ]. - XElim H; Intros; XElim H; XEAuto. -(* case 2.4 : csub0_abst *) - Intros; DropGenBase. - LApply (H c0 c3); [ Clear H; Intros H | XAuto ]. - LApply (H d1 t0); [ Clear H; Intros H | XAuto ]. - XElim H; Intros; XElim H; XEAuto. - Qed. - - End csub0_drop. - - Tactic Definition CSub0Drop := - Match Context With - | [ H1: (csub0 ?1 ?2 ?3); - H2: (drop ?4 (0) ?2 (CTail ?5 (Bind Abbr) ?6)) |- ? ] -> - LApply (csub0_drop_abbr ?1 ?4 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?5 ?6); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros - | [ H1: (csub0 ?1 ?2 ?3); - H2: (drop ?4 (0) ?2 (CTail ?5 (Bind Abst) ?6)) |- ? ] -> - LApply (csub0_drop_abst ?1 ?4 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?5 ?6); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros H1; XElim H1; Intros. diff --git a/helm/coq-contribs/LAMBDA-TYPES/csub0_props.v b/helm/coq-contribs/LAMBDA-TYPES/csub0_props.v deleted file mode 100644 index 04c4eddb1..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/csub0_props.v +++ /dev/null @@ -1,67 +0,0 @@ -(*#* #stop file *) - -Require pc3_props. -Require csub0_defs. - - Section csub0_pc3. (*****************************************************) - - Theorem csub0_pr2: (g:?; c1:?; t1,t2:?) (pr2 c1 t1 t2) -> - (c2:?) (csub0 g c1 c2) -> (pr2 c2 t1 t2). - Intros until 1; XElim H; Intros. -(* case 1: pr2_free *) - XAuto. -(* case 2: pr2_delta *) - CSub0Drop; XEAuto. - Qed. - - Hints Resolve csub0_pr2. - - Opaque pc3. - - Theorem csub0_pc3: (g:?; c1:?; t1,t2:?) (pc3 c1 t1 t2) -> - (c2:?) (csub0 g c1 c2) -> (pc3 c2 t1 t2). - Intros until 1; XElimUsing pc3_ind_left H; XEAuto. - Qed. - - End csub0_pc3. - - Hints Resolve csub0_pc3 : ltlc. - - Section csub0_ty0. (*****************************************************) - - Theorem csub0_ty0: (g:?; c1:?; t1,t2:?) (ty0 g c1 t1 t2) -> - (c2:?) (wf0 g c2) -> (csub0 g c1 c2) -> - (ty0 g c2 t1 t2). - Intros until 1; XElim H; Intros. -(* case 1: ty0_conv *) - EApply ty0_conv; XEAuto. -(* case 2: ty0_sort *) - XEAuto. -(* case 3: ty0_abbr *) - CSub0Drop; EApply ty0_abbr; XEAuto. -(* case 4: ty0_abst *) - CSub0Drop; [ EApply ty0_abst | EApply ty0_abbr ]; XEAuto. -(* case 5: ty0_bind *) - EApply ty0_bind; XEAuto. -(* case 6: ty0_appl *) - EApply ty0_appl; XEAuto. -(* case 7: ty0_cast *) - EApply ty0_cast; XAuto. - Qed. - - Theorem csub0_ty0_ld: (g:?; c:?; u,v:?) (ty0 g c u v) -> (t1,t2:?) - (ty0 g (CTail c (Bind Abst) v) t1 t2) -> - (ty0 g (CTail c (Bind Abbr) u) t1 t2). - Intros; EApply csub0_ty0; XEAuto. - Qed. - - End csub0_ty0. - - Hints Resolve csub0_ty0 csub0_ty0_ld : ltlc. - - Tactic Definition CSub0Ty0 := - Match Context With - [ _: (ty0 ?1 ?2 ?4 ?); _: (ty0 ?1 ?2 ?3 ?7); _: (pc3 ?2 ?4 ?7); - H: (ty0 ?1 (CTail ?2 (Bind Abst) ?4) ?5 ?6) |- ? ] -> - LApply (csub0_ty0_ld ?1 ?2 ?3 ?4); [ Intros H_x | EApply ty0_conv; XEAuto ]; - LApply (H_x ?5 ?6); [ Clear H_x H; Intros | XAuto ]. diff --git a/helm/coq-contribs/LAMBDA-TYPES/csubst0_defs.v b/helm/coq-contribs/LAMBDA-TYPES/csubst0_defs.v deleted file mode 100644 index 046b1978c..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/csubst0_defs.v +++ /dev/null @@ -1,197 +0,0 @@ -Require Export contexts_defs. -Require Export subst0_defs. -Require Export drop_defs. - -(*#* #caption "axioms for strict substitution in contexts", - "substituted tail item: second operand", - "substituted tail item: first operand", - "substituted tail item: both operands" -*) -(*#* #cap #cap c, c1, c2 #alpha v in W, u in V, u1 in V1, u2 in V2, k in z, r in q *) - - Inductive csubst0 : nat -> T -> C -> C -> Prop := - | csubst0_snd : (k:?; i:?; v,u1,u2:?) (subst0 (r k i) v u1 u2) -> (c:?) - (csubst0 (S i) v (CTail c k u1) (CTail c k u2)) - | csubst0_fst : (k:?; i:?; c1,c2:?; v:?) (csubst0 (r k i) v c1 c2) -> - (u:?) (csubst0 (S i) v (CTail c1 k u) (CTail c2 k u)) - | csubst0_both : (k:?; i:?; v,u1,u2:?) (subst0 (r k i) v u1 u2) -> - (c1,c2:?) (csubst0 (r k i) v c1 c2) -> - (csubst0 (S i) v (CTail c1 k u1) (CTail c2 k u2)). - -(*#* #stop file *) - - Hint csubst0 : ltlc := Constructors csubst0. - - Section csubst0_gen_base. (***********************************************) - - Theorem csubst0_gen_tail: (k:?; c1,x:?; u1,v:?; i:?) - (csubst0 (S i) v (CTail c1 k u1) x) -> (OR - (EX u2 | x = (CTail c1 k u2) & - (subst0 (r k i) v u1 u2) - ) | - (EX c2 | x = (CTail c2 k u1) & - (csubst0 (r k i) v c1 c2) - ) | - (EX u2 c2 | x = (CTail c2 k u2) & - (subst0 (r k i) v u1 u2) & - (csubst0 (r k i) v c1 c2) - )). - Intros until 1; InsertEq H '(S i); InsertEq H '(CTail c1 k u1). - XCase H; Clear x v y y0; Intros; Inversion H1. -(* case 1: csubst0_snd *) - Inversion H0; Rewrite H3 in H; Rewrite H5 in H; Rewrite H6 in H; XEAuto. -(* case 2: csubst0_fst *) - Inversion H0; Rewrite H3 in H; Rewrite H4 in H; Rewrite H5 in H; XEAuto. -(* case 2: csubst0_both *) - Inversion H2; Rewrite H5 in H; Rewrite H6 in H; Rewrite H7 in H; - Rewrite H4 in H0; Rewrite H5 in H0; Rewrite H7 in H0; XEAuto. - Qed. - - End csubst0_gen_base. - - Tactic Definition CSubst0GenBase := - Match Context With - | [ H: (csubst0 (S ?1) ?2 (CTail ?3 ?4 ?5) ?6) |- ? ] -> - LApply (csubst0_gen_tail ?4 ?3 ?6 ?5 ?2 ?1); [ Clear H; Intros H | XAuto ]; - XElim H; Intros H; XElim H; Intros. - - Section csubst0_drop. (***************************************************) - - Theorem csubst0_drop_ge : (i,n:?) (le i n) -> - (c1,c2:?; v:?) (csubst0 i v c1 c2) -> - (e:?) (drop n (0) c1 e) -> - (drop n (0) c2 e). - XElim i. -(* case 1: i = 0 *) - Intros; Inversion H0. -(* case 2: i > 0 *) - Intros i; XElim n. -(* case 2.1: n = 0 *) - Intros; Inversion H0. -(* case 2.2: n > 0 *) - Intros until 3; Clear H0; InsertEq H2 '(S i); XElim H0; Intros. - DropGenBase. -(* case 2.2.1: csubst0_snd *) - XAuto. -(* case 2.2.2: csubst0_fst *) - XReplaceIn H0 i0 i; DropGenBase; NewInduction k; XEAuto. -(* case 2.2.3: csubst0_both *) - XReplaceIn H0 i0 i; XReplaceIn H2 i0 i. - DropGenBase; NewInduction k; XEAuto. - Qed. - - Tactic Definition IH := - Match Context With - | [ H0: (n:?) (lt n ?1) -> (c1,c2:?; v:?) (csubst0 ?1 v c1 c2) -> (e:C) (drop n (0) c1 e) -> ?; - H1: (csubst0 ?1 ?2 ?3 ?4); H2: (drop ?5 (0) ?3 ?6) |- ? ] -> - LApply (H0 ?5); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?3 ?4 ?2); [ Clear H0 H1; Intros H0 | XAuto ]; - LApply (H0 ?6); [ Clear H0 H2; Intros H0 | XAuto ]; - XElim H0; Intros H0; [ Idtac | XElim H0 | XElim H0 | XElim H0 ]; Intros - | [ H0: (r ? ?1) = (S ?1) -> (e:?) (drop (S ?2) (0) ?3 e) -> ?; - H1: (drop (S ?2) (0) ?3 ?4) |- ? ] -> - LApply H0; [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?4); [ Clear H0 H1; Intros H0 | XAuto ]; - XElim H0; Intros H0; [ Idtac | XElim H0 | XElim H0 | XElim H0 ]; Intros. - - Theorem csubst0_drop_lt : (i,n:?) (lt n i) -> - (c1,c2:?; v:?) (csubst0 i v c1 c2) -> - (e:?) (drop n (0) c1 e) -> (OR - (drop n (0) c2 e) | - (EX k e0 u w | e = (CTail e0 k u) & - (drop n (0) c2 (CTail e0 k w)) & - (subst0 (minus (r k i) (S n)) v u w) - ) | - (EX k e1 e2 u | e = (CTail e1 k u) & - (drop n (0) c2 (CTail e2 k u)) & - (csubst0 (minus (r k i) (S n)) v e1 e2) - ) | - (EX k e1 e2 u w | e = (CTail e1 k u) & - (drop n (0) c2 (CTail e2 k w)) & - (subst0 (minus (r k i) (S n)) v u w) & - (csubst0 (minus (r k i) (S n)) v e1 e2) - )). - XElim i. -(* case 1: i = 0 *) - Intros; Inversion H. -(* case 2: i > 0 *) - Intros i; XElim n. -(* case 2.1: n = 0 *) - Intros H0; Clear H0; Intros until 1; InsertEq H0 '(S i); XElim H0; - Clear H c1 c2 v y; Intros; DropGenBase; XRewrite e; - Rewrite <- r_arith0 in H; Try Rewrite <- r_arith0 in H0; Replace i with i0; XEAuto. -(* case 2.2: n > 0 *) - Intros until 3; Clear H0; InsertEq H2 '(S i); XElim H0; Clear c1 c2 v y; - Intros; DropGenBase. -(* case 2.2.1: csubst0_snd *) - XEAuto. -(* case 2.2.2: csubst0_fst *) - Replace i0 with i; XAuto; XReplaceIn H0 i0 i; XReplaceIn H2 i0 i; Clear H3 i0. - Apply (r_dis k); Intros; Rewrite (H3 i) in H0; Rewrite (H3 n) in H4. -(* case 2.2.2.1: bind *) - IH; XRewrite e; Try Rewrite <- (H3 n) in H; Try Rewrite <- (H3 n) in H0; - Try Rewrite <- r_arith1 in H4; Try Rewrite <- r_arith1 in H5; XEAuto. -(* case 2.2.2.2: flat *) - IH; XRewrite e; Try Rewrite <- (H3 n) in H2; Try Rewrite <- (H3 n) in H4; XEAuto. -(* case 2.2.3: csubst0_both *) - Replace i0 with i; XAuto; XReplaceIn H0 i0 i; XReplaceIn H2 i0 i; XReplaceIn H3 i0 i; Clear H4 i0. - Apply (r_dis k); Intros; Rewrite (H4 i) in H2; Rewrite (H4 n) in H5. -(* case 2.2.2.1: bind *) - IH; XRewrite e; Try Rewrite <- (H4 n) in H; Try Rewrite <- (H4 n) in H2; - Try Rewrite <- r_arith1 in H5; Try Rewrite <- r_arith1 in H6; XEAuto. -(* case 2.2.3.2: flat *) - IH; XRewrite e; Try Rewrite <- (H4 n) in H3; Try Rewrite <- (H4 n) in H5; XEAuto. - Qed. - - Theorem csubst0_drop_ge_back : (i,n:?) (le i n) -> - (c1,c2:?; v:?) (csubst0 i v c1 c2) -> - (e:?) (drop n (0) c2 e) -> - (drop n (0) c1 e). - XElim i. -(* case 1 : i = 0 *) - Intros; Inversion H0. -(* case 2 : i > 0 *) - Intros i; XElim n. -(* case 2.1 : n = 0 *) - Intros; Inversion H0. -(* case 2.2 : n > 0 *) - Intros until 3; Clear H0; InsertEq H2 '(S i); XElim H0; Intros; - DropGenBase. -(* case 2.2.1 : csubst0_snd *) - XAuto. -(* case 2.2.2 : csubst0_fst *) - XReplaceIn H0 i0 i; NewInduction k; XEAuto. -(* case 2.2.3 : csubst0_both *) - XReplaceIn H0 i0 i; XReplaceIn H2 i0 i; NewInduction k; XEAuto. - Qed. - - End csubst0_drop. - - Tactic Definition CSubst0Drop := - Match Context With - | [ H1: (lt ?2 ?1); - H2: (csubst0 ?1 ?3 ?4 ?5); H3: (drop ?2 (0) ?4 ?6) |- ? ] -> - LApply (csubst0_drop_lt ?1 ?2); [ Intros H_x | XAuto ]; - LApply (H_x ?4 ?5 ?3); [ Clear H_x; Intros H_x | XAuto ]; - LApply (H_x ?6); [ Clear H_x H3; Intros H3 | XAuto ]; - XElim H3; - [ Intros | Intros H3; XElim H3; Intros - | Intros H3; XElim H3; Intros | Intros H3; XElim H3; Intros ] - | [ H1: (le ?1 ?2); - H2: (csubst0 ?1 ?3 ?4 ?5); H3: (drop ?2 (0) ?4 ?6) |- ? ] -> - LApply (csubst0_drop_ge ?1 ?2); [ Intros H_x | XAuto ]; - LApply (H_x ?4 ?5 ?3); [ Clear H_x; Intros H_x | XAuto ]; - LApply (H_x ?6); [ Clear H_x H3; Intros | XAuto ] - | [H2: (csubst0 ?1 ?3 ?4 ?5); H3: (drop ?1 (0) ?4 ?6) |- ? ] -> - LApply (csubst0_drop_ge ?1 ?1); [ Intros H_x | XAuto ]; - LApply (H_x ?4 ?5 ?3); [ Clear H_x H2; Intros H2 | XAuto ]; - LApply (H2 ?6); [ Clear H2 H3; Intros | XAuto ] - | [H2: (csubst0 ?1 ?3 ?4 ?5); H3: (drop ?1 (0) ?5 ?6) |- ? ] -> - LApply (csubst0_drop_ge_back ?1 ?1); [ Intros H_x | XAuto ]; - LApply (H_x ?4 ?5 ?3); [ Clear H_x; Intros H_x | XAuto ]; - LApply (H_x ?6); [ Clear H_x H3; Intros | XAuto ] - | [H2: (csubst0 ?1 ?3 ?4 ?5); H3: (drop ?2 (0) ?5 ?6) |- ? ] -> - LApply (csubst0_drop_ge_back ?1 ?2); [ Intros H_x | XAuto ]; - LApply (H_x ?4 ?5 ?3); [ Clear H_x; Intros H_x | XAuto ]; - LApply (H_x ?6); [ Clear H_x H3; Intros | XAuto ]. - diff --git a/helm/coq-contribs/LAMBDA-TYPES/csubst1_defs.v b/helm/coq-contribs/LAMBDA-TYPES/csubst1_defs.v deleted file mode 100644 index 8d1e570b5..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/csubst1_defs.v +++ /dev/null @@ -1,101 +0,0 @@ -(*#* #stop file *) - -Require Export subst1_defs. -Require Export csubst0_defs. - - Inductive csubst1 [i:nat; v:T; c1:C] : C -> Prop := - | csubst1_refl : (csubst1 i v c1 c1) - | csubst1_single : (c2:?) (csubst0 i v c1 c2) -> (csubst1 i v c1 c2). - - Hint csubst1 : ltlc := Constructors csubst1. - - Section csubst1_props. (**************************************************) - - Theorem csubst1_tail: (k:?; i:?; v,u1,u2:?) (subst1 (r k i) v u1 u2) -> - (c1,c2:?) (csubst1 (r k i) v c1 c2) -> - (csubst1 (S i) v (CTail c1 k u1) (CTail c2 k u2)). - Intros until 1; XElim H; Clear u2. -(* case 1: csubst1_refl *) - Intros until 1; XElim H; Clear c2; XAuto. -(* case 2: csubst1_single *) - Intros until 2; XElim H0; Clear c2; XAuto. - Qed. - - End csubst1_props. - - Hints Resolve csubst1_tail : ltlc. - - Section csubst1_gen_base. (***********************************************) - - Theorem csubst1_gen_tail: (k:?; c1,x:?; u1,v:?; i:?) - (csubst1 (S i) v (CTail c1 k u1) x) -> - (EX u2 c2 | x = (CTail c2 k u2) & - (subst1 (r k i) v u1 u2) & - (csubst1 (r k i) v c1 c2) - ). - Intros; InsertEq H '(CTail c1 k u1); InsertEq H '(S i); - XElim H; Clear x; Intros. -(* case 1: csubst1_refl *) - Rewrite H0; XEAuto. -(* case 2: csubst1_single *) - Rewrite H0 in H; Rewrite H1 in H; Clear H0 H1 y y0. - CSubst0GenBase; Rewrite H; XEAuto. - Qed. - - End csubst1_gen_base. - - Tactic Definition CSubst1GenBase := - Match Context With - | [ H: (csubst1 (S ?1) ?2 (CTail ?3 ?4 ?5) ?6) |- ? ] -> - LApply (csubst1_gen_tail ?4 ?3 ?6 ?5 ?2 ?1); [ Clear H; Intros H | XAuto ]; - XElim H; Intros. - - Section csubst1_drop. (***************************************************) - - Theorem csubst1_drop_ge : (i,n:?) (le i n) -> - (c1,c2:?; v:?) (csubst1 i v c1 c2) -> - (e:?) (drop n (0) c1 e) -> - (drop n (0) c2 e). - Intros until 2; XElim H0; Intros; - Try CSubst0Drop; XAuto. - Qed. - - Theorem csubst1_drop_lt : (i,n:?) (lt n i) -> - (c1,c2:?; v:?) (csubst1 i v c1 c2) -> - (e1:?) (drop n (0) c1 e1) -> - (EX e2 | (csubst1 (minus i n) v e1 e2) & - (drop n (0) c2 e2) - ). - Intros until 2; XElim H0; Intros; - Try ( - CSubst0Drop; Try Rewrite H1; Try Rewrite minus_x_Sy; - Try Rewrite r_minus in H3; Try Rewrite r_minus in H4 - ); XEAuto. - Qed. - - Theorem csubst1_drop_ge_back : (i,n:?) (le i n) -> - (c1,c2:?; v:?) (csubst1 i v c1 c2) -> - (e:?) (drop n (0) c2 e) -> - (drop n (0) c1 e). - Intros until 2; XElim H0; Intros; - Try CSubst0Drop; XAuto. - Qed. - - End csubst1_drop. - - Tactic Definition CSubst1Drop := - Match Context With - | [ H1: (lt ?2 ?1); - H2: (csubst1 ?1 ?3 ?4 ?5); H3: (drop ?2 (0) ?4 ?6) |- ? ] -> - LApply (csubst1_drop_lt ?1 ?2); [ Intros H_x | XAuto ]; - LApply (H_x ?4 ?5 ?3); [ Clear H_x; Intros H_x | XAuto ]; - LApply (H_x ?6); [ Clear H_x H3; Intros H3 | XAuto ]; - XElim H3; Intros - | [H2: (csubst1 ?1 ?3 ?4 ?5); H3: (drop ?1 (0) ?4 ?6) |- ? ] -> - LApply (csubst1_drop_ge ?1 ?1); [ Intros H_x | XAuto ]; - LApply (H_x ?4 ?5 ?3); [ Clear H_x H2; Intros H2 | XAuto ]; - LApply (H2 ?6); [ Clear H2 H3; Intros | XAuto ] - | [ H2: (csubst1 ?1 ?3 ?4 ?5); H3: (drop ?2 (0) ?4 ?6) |- ? ] -> - LApply (csubst1_drop_ge ?1 ?2); [ Intros H_x | XAuto ]; - LApply (H_x ?4 ?5 ?3); [ Clear H_x; Intros H_x | XAuto ]; - LApply (H_x ?6); [ Clear H_x H3; Intros | XAuto ]. diff --git a/helm/coq-contribs/LAMBDA-TYPES/description b/helm/coq-contribs/LAMBDA-TYPES/description deleted file mode 100644 index 06f662322..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/description +++ /dev/null @@ -1,13 +0,0 @@ -Name: lambda-delta -Title: A formalization of a lambda-typed lambda-calculus with abbreviations -Author: Ferruccio Guidi -Email: fguidi@cs.unibo.it -Homepage: http://www.cs.unibo.it/~fguidi -Institution: Department of Computer Science, University of Bologna -Address: Mura Anteo Zamboni 7, 40127 Bologna, ITALY -Date: March 31, 2005 -Description: -Url: -Keywords: lambda-types, lambda-calculus, abbreviations -Version: 7.3.1 -Require: diff --git a/helm/coq-contribs/LAMBDA-TYPES/drop_defs.v b/helm/coq-contribs/LAMBDA-TYPES/drop_defs.v deleted file mode 100644 index ee7eea93c..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/drop_defs.v +++ /dev/null @@ -1,130 +0,0 @@ -Require Export contexts_defs. -Require Export lift_defs. - -(*#* #caption "current axioms for dropping", - "base case", "untouched tail item", - "dropped tail item", "updated tail item" -*) -(*#* #cap #alpha c in C1, e in C2, u in V, k in z, n in k, d in i, r in q *) - - Inductive drop: nat -> nat -> C -> C -> Prop := - | drop_sort: (h,d,n:?) (drop h d (CSort n) (CSort n)) - | drop_comp: (c,e:?) (drop (0) (0) c e) -> - (k:?; u:?) (drop (0) (0) (CTail c k u) (CTail e k u)) - | drop_drop: (k:?; h:?; c,e:?) (drop (r k h) (0) c e) -> - (u:?) (drop (S h) (0) (CTail c k u) e) - | drop_skip: (k:?; h,d:?; c,e:?) (drop h (r k d) c e) -> (u:?) - (drop h (S d) (CTail c k (lift h (r k d) u)) (CTail e k u)). - -(*#* #stop file *) - - Hint drop : ltlc := Constructors drop. - - Hint discr : ltlc := Extern 4 (drop ? ? ? ?) Simpl. - - Section drop_gen_base. (**************************************************) - - Theorem drop_gen_sort: (n,h,d:?; x:?) - (drop h d (CSort n) x) -> x = (CSort n). - Intros until 1; InsertEq H '(CSort n); XElim H; Intros; - Try Inversion H1; XAuto. - Qed. - - Theorem drop_gen_refl: (x,e:?) (drop (0) (0) x e) -> x = e. - Intros until 1; Repeat InsertEq H '(0); XElim H; Intros. -(* case 1: drop_sort *) - XAuto. -(* case 2: drop_comp *) - Rewrite H0; XAuto. -(* case 3: drop_drop *) - Inversion H2. -(* case 4: drop_skip *) - Inversion H1. - Qed. - - Theorem drop_gen_drop: (k:?; c,x:?; u:?; h:?) - (drop (S h) (0) (CTail c k u) x) -> - (drop (r k h) (0) c x). - Intros until 1; - InsertEq H '(CTail c k u); InsertEq H '(0); InsertEq H '(S h); - XElim H; Intros. -(* case 1: drop_sort *) - Inversion H1. -(* case 2: drop_comp *) - Inversion H1. -(* case 3: drop_drop *) - Inversion H1; Inversion H3. - Rewrite <- H5; Rewrite <- H6; Rewrite <- H7; XAuto. -(* case 4: drop_skip *) - Inversion H2. - Qed. - - Theorem drop_gen_skip_r: (c,x:?; u:?; h,d:?; k:?) - (drop h (S d) x (CTail c k u)) -> - (EX e | x = (CTail e k (lift h (r k d) u)) & (drop h (r k d) e c)). - Intros; Inversion_clear H; XEAuto. - Qed. - - Theorem drop_gen_skip_l: (c,x:?; u:?; h,d:?; k:?) - (drop h (S d) (CTail c k u) x) -> - (EX e v | x = (CTail e k v) & - u = (lift h (r k d) v) & - (drop h (r k d) c e) - ). - Intros; Inversion_clear H; XEAuto. - Qed. - - End drop_gen_base. - - Hints Resolve drop_gen_refl : ltlc. - - Tactic Definition DropGenBase := - Match Context With - | [ H: (drop (0) (0) ?0 ?1) |- ? ] -> - LApply (drop_gen_refl ?0 ?1); [ Clear H; Intros | XAuto ] - | [ H: (drop ?0 ?1 (CSort ?2) ?3) |- ? ] -> - LApply (drop_gen_sort ?2 ?0 ?1 ?3); [ Clear H; Intros | XAuto ] - | [ H: (drop (S ?0) (0) (CTail ?1 ?2 ?3) ?4) |- ? ] -> - LApply (drop_gen_drop ?2 ?1 ?4 ?3 ?0); [ Clear H; Intros | XAuto ] - | [ H: (drop ?1 (S ?2) ?3 (CTail ?4 ?5 ?6)) |- ? ] -> - LApply (drop_gen_skip_r ?4 ?3 ?6 ?1 ?2 ?5); [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (drop ?1 (S ?2) (CTail ?4 ?5 ?6) ?3) |- ? ] -> - LApply (drop_gen_skip_l ?4 ?3 ?6 ?1 ?2 ?5); [ Clear H; Intros H | XAuto ]; - XElim H; Intros. - - Section drop_props. (*****************************************************) - - Theorem drop_skip_bind: (h,d:?; c,e:?) (drop h d c e) -> (b:?; u:?) - (drop h (S d) (CTail c (Bind b) (lift h d u)) (CTail e (Bind b) u)). - Intros; Pattern 2 d; Replace d with (r (Bind b) d); XAuto. - Qed. - - Theorem drop_refl: (c:?) (drop (0) (0) c c). - XElim c; XAuto. - Qed. - - Hints Resolve drop_refl : ltlc. - - Theorem drop_S: (b:?; c,e:?; u:?; h:?) - (drop h (0) c (CTail e (Bind b) u)) -> - (drop (S h) (0) c e). - XElim c. -(* case 1: CSort *) - Intros; DropGenBase; Inversion H. -(* case 2: CTail *) - XElim h; Intros; DropGenBase. -(* case 2.1: h = 0 *) - Inversion H0; XAuto. -(* case 2.1: h > 0 *) - Apply drop_drop; RRw; XEAuto. (**) (* explicit constructor *) - Qed. - - End drop_props. - - Hints Resolve drop_skip_bind drop_refl drop_S : ltlc. - - Tactic Definition DropS := - Match Context With - [ _: (drop ?1 (0) ?2 (CTail ?3 (Bind ?4) ?5)) |- ? ] -> - LApply (drop_S ?4 ?2 ?3 ?5 ?1); [ Intros | XAuto ]. diff --git a/helm/coq-contribs/LAMBDA-TYPES/drop_props.v b/helm/coq-contribs/LAMBDA-TYPES/drop_props.v deleted file mode 100644 index 84c8676fb..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/drop_props.v +++ /dev/null @@ -1,228 +0,0 @@ -(*#* #stop file *) - -Require lift_gen. -Require drop_defs. - -(*#* #caption "main properties of drop" #clauses *) - - Section confluence. (*****************************************************) - - Tactic Definition IH := - Match Context With - [ H1: (drop ?1 ?2 c ?3); H2: (drop ?1 ?2 c ?4) |- ? ] -> - LApply (H ?4 ?2 ?1); [ Clear H H2; Intros H | XAuto ]; - LApply (H ?3); [ Clear H H1; Intros | XAuto ]. - -(*#* #caption "confluence, first case" *) -(*#* #cap #alpha c in C, x1 in C1, x2 in C2, d in i *) - - Theorem drop_mono : (c,x1:?; d,h:?) (drop h d c x1) -> - (x2:?) (drop h d c x2) -> x1 = x2. - XElim c. -(* case 1: CSort *) - Intros; Repeat DropGenBase; Rewrite H0; XAuto. -(* case 2: CTail k *) - XElim d. -(* case 2.1: d = 0 *) - XElim h; Intros; Repeat DropGenBase; Try Rewrite <- H0; XEAuto. -(* case 2.2: d > 0 *) - Intros; Repeat DropGenBase; Rewrite H1; Rewrite H2; Rewrite H5 in H3; - LiftGen; IH; XAuto. - Qed. - -(*#* #caption "confluence, second case" *) -(*#* #cap #alpha c in C1, c0 in E1, e in C2, e0 in E2, u in V1, v in V2, i in k, d in i *) - - Theorem drop_conf_lt: (b:?; i:?; u:?; c0,c:?) - (drop i (0) c (CTail c0 (Bind b) u)) -> - (e:?; h,d:?) (drop h (S (plus i d)) c e) -> - (EX v e0 | u = (lift h d v) & - (drop i (0) e (CTail e0 (Bind b) v)) & - (drop h d c0 e0) - ). - XElim i. -(* case 1 : i = 0 *) - Intros until 1. - DropGenBase. - Rewrite H in H0; Clear H. - Inversion H0; XEAuto. -(* case 2 : i > 0 *) - Intros i; XElim c. -(* case 2.1 : CSort *) - Intros; Inversion H0. -(* case 2.2 : CTail k *) - XElim k; Intros; Repeat DropGenBase; Rewrite H2; Clear H2 H3 e t. -(* case 2.2.1 : Bind *) - LApply (H u c0 c); [ Clear H H0 H1; Intros H | XAuto ]. - LApply (H x0 h d); [ Clear H H9; Intros H | XAuto ]. - XElim H; XEAuto. -(* case 2.2.2 : Flat *) - LApply H0; [ Clear H H0 H1; Intros H | XAuto ]. - LApply (H x0 h d); [ Clear H H9; Intros H | XAuto ]. - XElim H; XEAuto. - Qed. - -(*#* #caption "confluence, third case" *) -(*#* #cap #alpha c in C, a in C1, e in C2, i in k, d in i *) - - Theorem drop_conf_ge: (i:?; a,c:?) (drop i (0) c a) -> - (e:?; h,d:?) (drop h d c e) -> (le (plus d h) i) -> - (drop (minus i h) (0) e a). - XElim i. -(* case 1 : i = 0 *) - Intros until 1. - DropGenBase; Rewrite H in H0; Clear H c. - Inversion H1; Rewrite H2; Simpl; Clear H1. - PlusO; Rewrite H in H0; Rewrite H1 in H0; Clear H H1 d h. - DropGenBase; Rewrite <- H; XAuto. -(* case 2 : i > 0 *) - Intros i; XElim c. -(* case 2.1 : CSort *) - Intros; Repeat DropGenBase; Rewrite H1; Rewrite H0; XAuto. -(* case 2.2 : CTail k *) - XElim k; Intros; DropGenBase; - ( NewInduction d; - [ NewInduction h; DropGenBase; - [ Rewrite <- H2; Simpl; XAuto | Clear IHh ] - | DropGenBase; Rewrite H2; Clear IHd H2 H4 e t ] ). -(* case 2.2.1 : Bind, d = 0, h > 0 *) - LApply (H a c); [ Clear H H0 H1; Intros H | XAuto ]. - LApply (H e h (0)); XAuto. -(* case 2.2.2 : Bind, d > 0 *) - LApply (H a c); [ Clear H H0 H1; Intros H | XAuto ]. - LApply (H x0 h d); [ Clear H H4; Intros H | XAuto ]. - LApply H; [ Clear H; Simpl in H3; Intros H | XAuto ]. - Rewrite <- minus_Sn_m; XEAuto. -(* case 2.2.3 : Flat, d = 0, h > 0 *) - LApply H0; [ Clear H H0 H1; Intros H | XAuto ]. - LApply (H e (S h) (0)); XAuto. -(* case 2.2.4 : Flat, d > 0 *) - LApply H0; [ Clear H H0 H1; Intros H | XAuto ]. - LApply (H x0 h (S d)); [ Clear H H4; Intros H | XAuto ]. - LApply H; [ Clear H; Simpl in H3; Intros H | XAuto ]. - Rewrite <- minus_Sn_m in H; [ Idtac | XEAuto ]. - Rewrite <- minus_Sn_m; XEAuto. - Qed. - - End confluence. - - Section transitivity. (***************************************************) - -(*#* #caption "transitivity, first case" *) -(*#* #cap #alpha c1 in C1, c2 in C2, e1 in D1, e2 in D2, d in i, i in k *) - - Theorem drop_trans_le : (i,d:?) (le i d) -> - (c1,c2:?; h:?) (drop h d c1 c2) -> - (e2:?) (drop i (0) c2 e2) -> - (EX e1 | (drop i (0) c1 e1) & (drop h (minus d i) e1 e2)). - XElim i. -(* case 1 : i = 0 *) - Intros. - DropGenBase; Rewrite H1 in H0. - Rewrite <- minus_n_O; XEAuto. -(* case 2 : i > 0 *) - Intros i IHi; XElim d. -(* case 2.1 : d = 0 *) - Intros; Inversion H. -(* case 2.2 : d > 0 *) - Intros d IHd; XElim c1. -(* case 2.2.1 : CSort *) - Intros. - DropGenBase; Rewrite H0 in H1. - DropGenBase; Rewrite H1; XEAuto. -(* case 2.2.2 : CTail k *) - Intros c1 IHc; XElim k; Intros; - DropGenBase; Rewrite H0 in H1; Rewrite H2; Clear IHd H0 H2 c2 t; - DropGenBase. -(* case 2.2.2.1 : Bind *) - LApply (IHi d); [ Clear IHi; Intros IHi | XAuto ]. - LApply (IHi c1 x0 h); [ Clear IHi H8; Intros IHi | XAuto ]. - LApply (IHi e2); [ Clear IHi H0; Intros IHi | XAuto ]. - XElim IHi; XEAuto. -(* case 2.2.2.2 : Flat *) - LApply (IHc x0 h); [ Clear IHc H8; Intros IHc | XAuto ]. - LApply (IHc e2); [ Clear IHc H0; Intros IHc | XAuto ]. - XElim IHc; XEAuto. - Qed. - -(*#* #caption "transitivity, second case" *) -(*#* #cap #alpha c1 in C1, c2 in C, e2 in C2, d in i, i in k *) - - Theorem drop_trans_ge : (i:?; c1,c2:?; d,h:?) (drop h d c1 c2) -> - (e2:?) (drop i (0) c2 e2) -> (le d i) -> - (drop (plus i h) (0) c1 e2). - XElim i. -(* case 1: i = 0 *) - Intros. - DropGenBase; Rewrite <- H0. - Inversion H1; Rewrite H2 in H; XAuto. -(* case 2 : i > 0 *) - Intros i IHi; XElim c1; Simpl. -(* case 2.1: CSort *) - Intros. - DropGenBase; Rewrite H in H0. - DropGenBase; Rewrite H0; XAuto. -(* case 2.2: CTail *) - Intros c1 IHc; XElim d. -(* case 2.2.1: d = 0 *) - XElim h; Intros. -(* case 2.2.1.1: h = 0 *) - DropGenBase; Rewrite <- H in H0; - DropGenBase; Rewrite <- plus_n_O; XAuto. -(* case 2.2.1.2: h > 0 *) - DropGenBase; Rewrite <- plus_n_Sm. - Apply drop_drop; RRw; XEAuto. (**) (* explicit constructor *) -(* case 2.2.2: d > 0 *) - Intros d IHd; Intros. - DropGenBase; Rewrite H in IHd; Rewrite H in H0; Rewrite H2 in IHd; Rewrite H2; Clear IHd H H2 c2 t; - DropGenBase; Apply drop_drop; NewInduction k; Simpl; XEAuto. (**) (* explicit constructor *) - Qed. - - End transitivity. - - Tactic Definition DropDis := - Match Context With - [ H1: (drop ?1 ?2 ?3 ?4); H2: (drop ?1 ?2 ?3 ?5) |- ? ] -> - LApply (drop_mono ?3 ?5 ?2 ?1); [ Intros H_x | XAuto ]; - LApply (H_x ?4); [ Clear H_x H1; Intros H1; Rewrite H1 in H2 | XAuto ] - | [ H1: (drop ?0 (0) ?1 (CTail ?2 (Bind ?3) ?4)); - H2: (drop ?5 (S (plus ?0 ?6)) ?1 ?7) |- ? ] -> - LApply (drop_conf_lt ?3 ?0 ?4 ?2 ?1); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?7 ?5 ?6); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros - | [ _: (drop ?0 (0) ?1 ?2); _: (drop ?5 (0) ?1 ?7); - _: (lt ?5 ?0) |- ? ] -> - LApply (drop_conf_ge ?0 ?2 ?1); [ Intros H_x | XAuto ]; - LApply (H_x ?7 ?5 (0)); [ Clear H_x; Intros H_x | XAuto ]; - Simpl in H_x; LApply H_x; [ Clear H_x; Intros | XAuto ] - | [ _: (drop ?1 (0) ?2 (CTail ?3 (Bind ?) ?)); - _: (drop (1) ?1 ?2 ?4) |- ? ] -> - LApply (drop_conf_ge (S ?1) ?3 ?2); [ Intros H_x | XEAuto ]; - LApply (H_x ?4 (1) ?1); [ Clear H_x; Intros H_x | XAuto ]; - LApply H_x; [ Clear H_x; Intros | Rewrite plus_sym; XAuto ]; ( - Match Context With - [ H: (drop (minus (S ?1) (1)) (0) ?4 ?3) |- ? ] -> - Simpl in H; Rewrite <- minus_n_O in H ) - | [ H0: (drop ?0 (0) ?1 ?2); H2: (lt ?6 ?0); - H1: (drop (1) ?6 ?1 ?7) |- ? ] -> - LApply (drop_conf_ge ?0 ?2 ?1); [ Intros H_x | XAuto ]; - LApply (H_x ?7 (1) ?6); [ Clear H_x; Intros H_x | XAuto ]; - LApply H_x; [ Clear H_x; Intros | Rewrite plus_sym; XAuto ] - | [ H0: (drop ?0 (0) ?1 ?2); - H1: (drop ?5 ?6 ?1 ?7) |- ? ] -> - LApply (drop_conf_ge ?0 ?2 ?1); [ Intros H_x | XAuto ]; - LApply (H_x ?7 ?5 ?6); [ Clear H_x; Intros H_x | XAuto ]; - LApply H_x; [ Clear H_x; Intros | XAuto ] - | [ H0: (lt ?1 ?2); - H1: (drop ?3 ?2 ?4 ?5); H2: (drop ?1 (0) ?5 ?6) |- ? ] -> - LApply (drop_trans_le ?1 ?2); [ Intros H_x | XAuto ]; - LApply (H_x ?4 ?5 ?3); [ Clear H_x H1; Intros H_x | XAuto ]; - LApply (H_x ?6); [ Clear H_x H2; Intros H_x | XAuto ]; - XElim H_x; Intros - | [ H0: (le ?1 ?2); - H1: (drop ?3 ?1 ?4 ?5); H2: (drop ?2 (0) ?5 ?6) |- ? ] -> - LApply (drop_trans_ge ?2 ?4 ?5 ?1 ?3); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?6); [ Clear H1 H2; Intros H1 | XAuto ]; - LApply H1; [ Clear H1; Intros | XAuto ]. - -(*#* #single *) diff --git a/helm/coq-contribs/LAMBDA-TYPES/fsubst0_defs.v b/helm/coq-contribs/LAMBDA-TYPES/fsubst0_defs.v deleted file mode 100644 index fa9404936..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/fsubst0_defs.v +++ /dev/null @@ -1,20 +0,0 @@ -Require Export subst0_defs. -Require Export csubst0_defs. - -(*#* #caption "\\kern-1.2pt axioms for strict substitution in focalized terms", - "substituted term part", - "substituted context part", - "substituted both parts" -*) -(*#* #cap #cap c1, c2, t1, t2 #alpha v in W *) - - Inductive fsubst0 [i:nat; v:T; c1:C; t1:T] : C -> T -> Prop := - | fsubst0_snd : (t2:?) (subst0 i v t1 t2) -> (fsubst0 i v c1 t1 c1 t2) - | fsubst0_fst : (c2:?) (csubst0 i v c1 c2) -> (fsubst0 i v c1 t1 c2 t1) - | fsubst0_both : (t2:?) (subst0 i v t1 t2) -> - (c2:?) (csubst0 i v c1 c2) -> (fsubst0 i v c1 t1 c2 t2). - -(*#* #stop file *) - - Hint fsubst0 : ltlc := Constructors fsubst0. - diff --git a/helm/coq-contribs/LAMBDA-TYPES/lift_defs.v b/helm/coq-contribs/LAMBDA-TYPES/lift_defs.v deleted file mode 100644 index 8b69ec4b4..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/lift_defs.v +++ /dev/null @@ -1,238 +0,0 @@ -(*#* #stop file *) - -Require Export terms_defs. - - Fixpoint lref_map [g:nat->nat; d:nat; t:T] : T := Cases t of - | (TSort n) => (TSort n) - | (TLRef n) => - if (blt n d) then (TLRef n) else (TLRef (g n)) - | (TTail k u t) => - (TTail k (lref_map g d u) (lref_map g (s k d) t)) - end. - - Definition lift : nat -> nat -> T -> T := - [h](lref_map [x](plus x h)). - - Section lift_rw. (********************************************************) - - Theorem lift_sort: (n:?; h,d:?) (lift h d (TSort n)) = (TSort n). - XAuto. - Qed. - - Theorem lift_lref_lt: (n:?; h,d:?) (lt n d) -> - (lift h d (TLRef n)) = (TLRef n). - Intros; Unfold lift; Simpl. - Replace (blt n d) with true; XAuto. - Qed. - - Theorem lift_lref_ge: (n:?; h,d:?) (le d n) -> - (lift h d (TLRef n)) = (TLRef (plus n h)). - - Intros; Unfold lift; Simpl. - Replace (blt n d) with false; XAuto. - Qed. - - Theorem lift_tail: (k:?; u,t:?; h,d:?) - (lift h d (TTail k u t)) = - (TTail k (lift h d u) (lift h (s k d) t)). - XAuto. - Qed. - - Theorem lift_bind: (b:?; u,t:?; h,d:?) - (lift h d (TTail (Bind b) u t)) = - (TTail (Bind b) (lift h d u) (lift h (S d) t)). - XAuto. - Qed. - - Theorem lift_flat: (f:?; u,t:?; h,d:?) - (lift h d (TTail (Flat f) u t)) = - (TTail (Flat f) (lift h d u) (lift h d t)). - XAuto. - Qed. - - End lift_rw. - - Hints Resolve lift_lref_lt lift_bind lift_flat : ltlc. - - Tactic Definition LiftTailRw := - Repeat (Rewrite lift_tail Orelse Rewrite lift_bind Orelse Rewrite lift_flat). - - Tactic Definition LiftTailRwBack := - Repeat (Rewrite <- lift_tail Orelse Rewrite <- lift_bind Orelse Rewrite <- lift_flat). - - Section lift_gen. (*******************************************************) - - Theorem lift_gen_sort: (h,d,n:?; t:?) (TSort n) = (lift h d t) -> - t = (TSort n). - XElim t; Intros. -(* case 1 : TSort *) - XAuto. -(* case 2 : TLRef n0 *) - Apply (lt_le_e n0 d); Intros. -(* case 2.1 : n0 < d *) - Rewrite lift_lref_lt in H; [ Inversion H | XAuto ]. -(* case 2.2 : n0 >= d *) - Rewrite lift_lref_ge in H; [ Inversion H | XAuto ]. -(* case 3 : TTail k *) - Rewrite lift_tail in H1; Inversion H1. - Qed. - - Theorem lift_gen_lref_lt: (h,d,n:?) (lt n d) -> - (t:?) (TLRef n) = (lift h d t) -> - t = (TLRef n). - XElim t; Intros. -(* case 1 : TSort *) - XAuto. -(* case 2 : TLRef n0 *) - Apply (lt_le_e n0 d); Intros. -(* case 2.1 : n0 < d *) - Rewrite lift_lref_lt in H0; XAuto. -(* case 2.2 : n0 >= d *) - Rewrite lift_lref_ge in H0; [ Inversion H0; Clear H0 | XAuto ]. - Rewrite H3 in H; Clear H3 n. - EApply le_false; [ Apply H1 | XEAuto ]. -(* case 3 : TTail k *) - Rewrite lift_tail in H2; Inversion H2. - Qed. - - Theorem lift_gen_lref_false: (h,d,n:?) (le d n) -> (lt n (plus d h)) -> - (t:?) (TLRef n) = (lift h d t) -> - (P:Prop) P. - XElim t; Intros. -(* case 1 : TSort *) - Inversion H1. -(* case 2 : TLRef n0 *) - Apply (lt_le_e n0 d); Intros. -(* case 2.1 : n0 < d *) - Rewrite lift_lref_lt in H1; [ Inversion H1; Clear H1 | XAuto ]. - Rewrite <- H4 in H2; Clear H4 n0. - EApply le_false; [ Apply H | XEAuto ]. -(* case 2.2 : n0 >= d *) - Rewrite lift_lref_ge in H1; [ Inversion H1; Clear H1 | XAuto ]. - Rewrite H4 in H0; Clear H4. - EApply le_false; [ Apply H2 | XEAuto ]. -(* case 3 : TTail k *) - Rewrite lift_tail in H3; Inversion H3. - Qed. - - Theorem lift_gen_lref_ge: (h,d,n:?) (le d n) -> - (t:?) (TLRef (plus n h)) = (lift h d t) -> - t = (TLRef n). - XElim t; Intros. -(* case 1 : TSort *) - Inversion H0. -(* case 2 : TLRef n0 *) - Apply (lt_le_e n0 d); Intros. -(* case 2.1 : n0 < d *) - Rewrite lift_lref_lt in H0; [ Inversion H0; Clear H0 | XAuto ]. - Rewrite <- H3 in H1; Clear H3 n0. - EApply le_false; [ Apply H | XEAuto ]. -(* case 2.2 : n0 >= d *) - Rewrite lift_lref_ge in H0; [ Inversion H0; XEAuto | XAuto ]. -(* case 3 : TTail k *) - Rewrite lift_tail in H2; Inversion H2. - Qed. - -(* NOTE: lift_gen_tail should be used instead of these two *) (**) - Theorem lift_gen_bind: (b:?; u,t,x:?; h,d:?) - (TTail (Bind b) u t) = (lift h d x) -> - (EX y z | x = (TTail (Bind b) y z) & - u = (lift h d y) & - t = (lift h (S d) z) - ). - XElim x; Intros. -(* case 1 : TSort *) - Inversion H. -(* case 2 : TLRef n *) - Apply (lt_le_e n d); Intros. -(* case 2.1 : n < d *) - Rewrite lift_lref_lt in H; [ Inversion H | XAuto ]. -(* case 2.2 : n >= d *) - Rewrite lift_lref_ge in H; [ Inversion H | XAuto ]. -(* case 3 : TTail k *) - Rewrite lift_tail in H1; Inversion H1. - XEAuto. - Qed. - - Theorem lift_gen_flat: (f:?; u,t,x:?; h,d:?) - (TTail (Flat f) u t) = (lift h d x) -> - (EX y z | x = (TTail (Flat f) y z) & - u = (lift h d y) & - t = (lift h d z) - ). - XElim x; Intros. -(* case 1 : TSort *) - Inversion H. -(* case 2 : TLRef n *) - Apply (lt_le_e n d); Intros. -(* case 2.1 : n < d *) - Rewrite lift_lref_lt in H; [ Inversion H | XAuto ]. -(* case 2.2 : n >= d *) - Rewrite lift_lref_ge in H; [ Inversion H | XAuto ]. -(* case 3 : TTail k *) - Rewrite lift_tail in H1; Inversion H1. - XEAuto. - Qed. - - End lift_gen. - - Tactic Definition LiftGenBase := - Match Context With - | [ H: (TSort ?0) = (lift ?1 ?2 ?3) |- ? ] -> - LApply (lift_gen_sort ?1 ?2 ?0 ?3); [ Clear H; Intros | XAuto ] - | [ H1: (le ?1 ?2); H2: (lt ?2 (plus ?1 ?3)); - H3: (TLRef ?2) = (lift ?3 ?1 ?4) |- ? ] -> - Apply (lift_gen_lref_false ?3 ?1 ?2 H1 H2 ?4 H3); XAuto - | [ _: (TLRef ?1) = (lift (S ?1) (0) ?2) |- ? ] -> - EApply lift_gen_lref_false; [ Idtac | Idtac | XEAuto ]; XEAuto - | [ H: (TLRef ?1) = (lift (1) ?1 ?2) |- ? ] -> - LApply (lift_gen_lref_false (1) ?1 ?1); [ Intros H_x | XAuto ]; - LApply H_x; [ Clear H_x; Intros H_x | Arith7' ?1; XAuto ]; - LApply (H_x ?2); [ Clear H_x; Intros H_x | XAuto ]; - Apply H_x - | [ H: (TLRef (plus ?0 ?1)) = (lift ?1 ?2 ?3) |- ? ] -> - LApply (lift_gen_lref_ge ?1 ?2 ?0); [ Intros H_x | XAuto ]; - LApply (H_x ?3); [ Clear H_x H; Intros | XAuto ] - | [ H1: (TLRef ?0) = (lift ?1 ?2 ?3); H2: (lt ?0 ?4) |- ? ] -> - LApply (lift_gen_lref_lt ?1 ?2 ?0); - [ Intros H_x | Apply lt_le_trans with m:=?4; XEAuto ]; - LApply (H_x ?3); [ Clear H_x H1; Intros | XAuto ] - | [ H: (TLRef ?0) = (lift ?1 ?2 ?3) |- ? ] -> - LApply (lift_gen_lref_lt ?1 ?2 ?0); [ Intros H_x | XEAuto ]; - LApply (H_x ?3); [ Clear H_x H; Intros | XAuto ] - | [ H: (TTail (Bind ?0) ?1 ?2) = (lift ?3 ?4 ?5) |- ? ] -> - LApply (lift_gen_bind ?0 ?1 ?2 ?5 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (TTail (Flat ?0) ?1 ?2) = (lift ?3 ?4 ?5) |- ? ] -> - LApply (lift_gen_flat ?0 ?1 ?2 ?5 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XElim H; Intros. - - Section lift_props. (*****************************************************) - - Theorem lift_r: (t:?; d:?) (lift (0) d t) = t. - XElim t; Intros. -(* case 1: TSort *) - XAuto. -(* case 2: TLRef n *) - Apply (lt_le_e n d); Intros. -(* case 2.1: n < d *) - Rewrite lift_lref_lt; XAuto. -(* case 2.2: n >= d *) - Rewrite lift_lref_ge; XAuto. -(* case 3: TTail *) - LiftTailRw; XAuto. - Qed. - - Theorem lift_lref_gt : (d,n:?) (lt d n) -> - (lift (1) d (TLRef (pred n))) = (TLRef n). - Intros. - Rewrite lift_lref_ge. -(* case 1: first branch *) - Rewrite <- plus_sym; Simpl; Rewrite <- (S_pred n d); XAuto. -(* case 2: second branch *) - Apply le_S_n; Rewrite <- (S_pred n d); XAuto. - Qed. - - End lift_props. - - Hints Resolve lift_r lift_lref_gt : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/lift_gen.v b/helm/coq-contribs/LAMBDA-TYPES/lift_gen.v deleted file mode 100644 index 63b74709d..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/lift_gen.v +++ /dev/null @@ -1,116 +0,0 @@ -(*#* #stop file *) - -Require lift_defs. - - Section lift_ini. (*******************************************************) - - Tactic Definition IH := - Match Context With - | [ H1: (lift ?1 ?2 t) = (lift ?1 ?2 ?3) |- ? ] -> - LApply (H ?3 ?1 ?2); [ Clear H H1; Intros | XAuto ] - | [ H1: (lift ?1 ?2 t0) = (lift ?1 ?2 ?3) |- ? ] -> - LApply (H0 ?3 ?1 ?2); [ Clear H0 H1; Intros | XAuto ]. - -(*#* #caption "main properties of lift" #clauses lift_props *) - -(*#* #caption "injectivity" *) -(*#* #cap #alpha x in T1, t in T2, d in i *) - - Theorem lift_inj : (x,t:?; h,d:?) (lift h d x) = (lift h d t) -> x = t. - XElim x. -(* case 1 : TSort *) - Intros; Rewrite lift_sort in H; LiftGenBase; XAuto. -(* case 2 : TLRef n *) - Intros; Apply (lt_le_e n d); Intros. -(* case 2.1 : n < d *) - Rewrite lift_lref_lt in H; [ LiftGenBase; XAuto | XAuto ]. -(* case 2.2 : n >= d *) - Rewrite lift_lref_ge in H; [ LiftGenBase; XAuto | XAuto ]. -(* case 3 : TTail k *) - XElim k; Intros; [ Rewrite lift_bind in H1 | Rewrite lift_flat in H1 ]; - LiftGenBase; Rewrite H1; IH; IH; XAuto. - Qed. - - End lift_ini. - - Section lift_gen_lift. (**************************************************) - - Tactic Definition IH := - Match Context With - | [ H_x: (lift ?0 ?1 t) = (lift ?2 (plus ?3 ?0) ?4) |- ? ] -> - LApply (H ?4 ?0 ?2 ?1 ?3); [ Clear H; Intros H | XAuto ]; - LApply H; [ Clear H H_x; Intros H | XAuto ]; - XElim H; Intros - | [ H_x: (lift ?0 ?1 t0) = (lift ?2 (plus ?3 ?0) ?4) |- ? ] -> - LApply (H0 ?4 ?0 ?2 ?1 ?3); [ Clear H0; Intros H0 | XAuto ]; - LApply H0; [ Clear H0 H_x; Intros H0 | XAuto ]; - XElim H0; Intros. - -(*#* #caption "generation lemma for lift" *) -(*#* #cap #cap t1 #alpha t2 in T, x in T2, d1 in i1, d2 in i2 *) - - Theorem lift_gen_lift : (t1,x:?; h1,h2,d1,d2:?) (le d1 d2) -> - (lift h1 d1 t1) = (lift h2 (plus d2 h1) x) -> - (EX t2 | x = (lift h1 d1 t2) & - t1 = (lift h2 d2 t2) - ). - XElim t1; Intros. -(* case 1 : TSort *) - Rewrite lift_sort in H0. - LiftGenBase; Rewrite H0; Clear H0 x. - EApply ex2_intro; Rewrite lift_sort; XAuto. -(* case 2 : TLRef n *) - Apply (lt_le_e n d1); Intros. -(* case 2.1 : n < d1 *) - Rewrite lift_lref_lt in H0; [ Idtac | XAuto ]. - LiftGenBase; Rewrite H0; Clear H0 x. - EApply ex2_intro; Rewrite lift_lref_lt; XEAuto. -(* case 2.2 : n >= d1 *) - Rewrite lift_lref_ge in H0; [ Idtac | XAuto ]. - Apply (lt_le_e n d2); Intros. -(* case 2.2.1 : n < d2 *) - LiftGenBase; Rewrite H0; Clear H0 x. - EApply ex2_intro; [ Rewrite lift_lref_ge | Rewrite lift_lref_lt ]; XEAuto. -(* case 2.2.2 : n >= d2 *) - Apply (lt_le_e n (plus d2 h2)); Intros. -(* case 2.2.2.1 : n < d2 + h2 *) - EApply lift_gen_lref_false; [ Idtac | Idtac | Apply H0 ]; - [ XAuto | Rewrite plus_permute_2_in_3; XAuto ]. -(* case 2.2.2.2 : n >= d2 + h2 *) - Rewrite (le_plus_minus_sym h2 (plus n h1)) in H0; [ Idtac | XEAuto ]. - LiftGenBase; Rewrite H0; Clear H0 x. - EApply ex2_intro; - [ Rewrite le_minus_plus; [ Idtac | XEAuto ] - | Rewrite (le_plus_minus_sym h2 n); [ Idtac | XEAuto ] ]; - Rewrite lift_lref_ge; XEAuto. -(* case 3 : TTail k *) - NewInduction k. -(* case 3.1 : Bind *) - Rewrite lift_bind in H2. - LiftGenBase; Rewrite H2; Clear H2 x. - IH; Rewrite H; Rewrite H2; Clear H H2 x0. - Arith4In H4 d2 h1; IH; Rewrite H; Rewrite H0; Clear H H0 x1 t t0. - EApply ex2_intro; Rewrite lift_bind; XAuto. -(* case 3.2 : Flat *) - Rewrite lift_flat in H2. - LiftGenBase; Rewrite H2; Clear H2 x. - IH; Rewrite H; Rewrite H2; Clear H H2 x0. - IH; Rewrite H; Rewrite H0; Clear H H0 x1 t t0. - EApply ex2_intro; Rewrite lift_flat; XAuto. - Qed. - - End lift_gen_lift. - - Tactic Definition LiftGen := - Match Context With - | [ H: (lift ?1 ?2 ?3) = (lift ?1 ?2 ?4) |- ? ] -> - LApply (lift_inj ?3 ?4 ?1 ?2); [ Clear H; Intros | XAuto ] - | [ H: (lift ?0 ?1 ?2) = (lift ?3 (plus ?4 ?0) ?5) |- ? ] -> - LApply (lift_gen_lift ?2 ?5 ?0 ?3 ?1 ?4); [ Intros H_x | XAuto ]; - LApply H_x; [ Clear H H_x; Intros H | XAuto ]; - XElim H; Intros - | [ H: (lift (1) (0) ?1) = (lift (1) (S ?2) ?3) |- ? ] -> - LApply (lift_gen_lift ?1 ?3 (1) (1) (0) ?2); [ Intros H_x | XAuto ]; - LApply H_x; [ Clear H_x H; Intros H | Arith7' ?2; XAuto ]; - XElim H; Intros - | _ -> LiftGenBase. diff --git a/helm/coq-contribs/LAMBDA-TYPES/lift_props.v b/helm/coq-contribs/LAMBDA-TYPES/lift_props.v deleted file mode 100644 index 366ad999b..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/lift_props.v +++ /dev/null @@ -1,43 +0,0 @@ -(*#* #stop file *) - -Require lift_defs. - - Section lift_props. (*****************************************************) - - Theorem lift_free: (t:?; h,k,d,e:?) (le e (plus d h)) -> (le d e) -> - (lift k e (lift h d t)) = (lift (plus k h) d t). - XElim t; Intros. -(* case 1: TSort *) - Repeat Rewrite lift_sort; XAuto. -(* case 2: TLRef n *) - Apply (lt_le_e n d); Intros. -(* case 2.1: n < d *) - Repeat Rewrite lift_lref_lt; XEAuto. -(* case 2.2: n >= d *) - Repeat Rewrite lift_lref_ge; XEAuto. -(* case 3: TTail k *) - LiftTailRw; XAuto. - Qed. - - Theorem lift_d : (t:?; h,k,d,e:?) (le e d) -> - (lift h (plus k d) (lift k e t)) = (lift k e (lift h d t)). - XElim t; Intros. -(* case 1: TSort *) - Repeat Rewrite lift_sort; XAuto. -(* case 2: TLRef n *) - Apply (lt_le_e n e); Intros. -(* case 2.1: n < e *) - Cut (lt n d); Intros; Repeat Rewrite lift_lref_lt; XEAuto. -(* case 2.2: n >= e *) - Rewrite lift_lref_ge; [ Idtac | XAuto ]. - Rewrite plus_sym; Apply (lt_le_e n d); Intros. -(* case 2.2.1: n < d *) - Do 2 (Rewrite lift_lref_lt; [ Idtac | XAuto ]). - Rewrite lift_lref_ge; XAuto. -(* case 2.2.2: n >= d *) - Repeat Rewrite lift_lref_ge; XAuto. -(* case 3: TTail k *) - LiftTailRw; SRw; XAuto. - Qed. - - End lift_props. diff --git a/helm/coq-contribs/LAMBDA-TYPES/lift_tlt.v b/helm/coq-contribs/LAMBDA-TYPES/lift_tlt.v deleted file mode 100644 index 7319f3264..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/lift_tlt.v +++ /dev/null @@ -1,87 +0,0 @@ -(*#* #stop file *) - -Require tlt_defs. -Require lift_defs. - - Hint discr : ltlc := Extern 4 (lt (weight_map (wadd ? ?) (lift (S ?) ? ?)) (wadd ? ? ?)) - Simpl; Rewrite <- lift_weight_add_O. - - Hint discr : ltlc := Extern 4 (lt (weight_map ? (lift (0) (0) ?)) ?) - Rewrite lift_r. - - Section lift_tlt_props. (*************************************************) - - Theorem lift_weight_map: (t:?; h,d:?; f:?) - ((m:?) (le d m) -> (f m)=(0)) -> - (weight_map f (lift h d t)) = (weight_map f t). - XElim t; Intros. -(* case 1: TSort *) - XAuto. -(* case 2: TLRef n *) - Apply (lt_le_e n d); Intros. -(* case 2.1: n < d *) - Rewrite lift_lref_lt; XAuto. -(* case 2.2: n >= d *) - Rewrite lift_lref_ge; [ Simpl | XAuto ]. - Rewrite (H n); XAuto. -(* case 3: TTail k *) - XElim k; Intros; LiftTailRw; Simpl. -(* case 3.1: Bind *) - XElim b; [ Rewrite H; [ Idtac | XAuto ] | Idtac | Idtac ]; - Rewrite H0; Intros; Try (LeLtGen; Rewrite H2; Simpl); XAuto. -(* case 3.2: Flat *) - XAuto. - Qed. - - Hints Resolve lift_weight_map : ltlc. - - Theorem lift_weight : (t:?; h,d:?) (weight (lift h d t)) = (weight t). - Unfold weight; XAuto. - Qed. - - Theorem lift_weight_add : (w:?; t:?; h,d:?; f,g:?) - ((m:?) (lt m d) -> (g m) = (f m)) -> - (g d) = w -> - ((m:?) (le d m) -> (g (S m)) = (f m)) -> - (weight_map f (lift h d t)) = - (weight_map g (lift (S h) d t)). - XElim t; Intros. -(* case 1: TSort *) - XAuto. -(* case 2: TLRef *) - Apply (lt_le_e n d); Intros. -(* case 2.1: n < d *) - Repeat Rewrite lift_lref_lt; Simpl; XAuto. -(* case 2.2: n >= d *) - Repeat Rewrite lift_lref_ge; Simpl; Try Rewrite <- plus_n_Sm; XAuto. -(* case 3: TTail k *) - XElim k; Intros; LiftTailRw; Simpl. -(* case 1 : bind b *) - XElim b; Simpl; - Apply (f_equal nat); - (Apply (f_equal2 nat nat); [ XAuto | Idtac ]); - ( Apply H0; Simpl; Intros; Try (LeLtGen; Rewrite H4; Simpl); XAuto). -(* case 2 : Flat *) - XAuto. - Qed. - - Theorem lift_weight_add_O: (w:?; t:?; h:?; f:?) - (weight_map f (lift h (0) t)) = - (weight_map (wadd f w) (lift (S h) (0) t)). - Intros. - EApply lift_weight_add; XAuto. - Intros; Inversion H. - Qed. - - Theorem lift_tlt_dx: (k:?; u,t:?; h,d:?) - (tlt t (TTail k u (lift h d t))). - Unfold tlt; Intros. - Rewrite <- (lift_weight t h d). - Fold (tlt (lift h d t) (TTail k u (lift h d t))); XAuto. - Qed. - - End lift_tlt_props. - - Hints Resolve lift_tlt_dx : ltlc. - -(*#* #single *) diff --git a/helm/coq-contribs/LAMBDA-TYPES/pc1_defs.v b/helm/coq-contribs/LAMBDA-TYPES/pc1_defs.v deleted file mode 100644 index 22b4fcefb..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pc1_defs.v +++ /dev/null @@ -1,50 +0,0 @@ -(*#* #stop file *) - -Require Export pr0_defs. -Require Export pr1_defs. - - Definition pc1 := [t1,t2:?] (EX t | (pr1 t1 t) & (pr1 t2 t)). - - Hints Unfold pc1 : ltlc. - - Tactic Definition Pc1Unfold := - Match Context With - [ H: (pc1 ?2 ?3) |- ? ] -> Unfold pc1 in H; XDecompose H. - - Section pc1_props. (******************************************************) - - Theorem pc1_pr0_r: (t1,t2:?) (pr0 t1 t2) -> (pc1 t1 t2). - XEAuto. - Qed. - - Theorem pc1_pr0_x: (t1,t2:?) (pr0 t2 t1) -> (pc1 t1 t2). - XEAuto. - Qed. - - Theorem pc1_pr0_u: (t2,t1:?) (pr0 t1 t2) -> - (t3:?) (pc1 t2 t3) -> (pc1 t1 t3). - Intros; Pc1Unfold; XEAuto. - Qed. - - Theorem pc1_refl: (t:?) (pc1 t t). - XEAuto. - Qed. - - Theorem pc1_s: (t2,t1:?) (pc1 t1 t2) -> (pc1 t2 t1). - Intros; Pc1Unfold; XEAuto. - Qed. - - Theorem pc1_tail_1: (u1,u2:?) (pc1 u1 u2) -> - (t:?; k:?) (pc1 (TTail k u1 t) (TTail k u2 t)). - Intros; Pc1Unfold; XEAuto. - Qed. - - Theorem pc1_tail_2: (t1,t2:?) (pc1 t1 t2) -> - (u:?; k:?) (pc1 (TTail k u t1) (TTail k u t2)). - Intros; Pc1Unfold; XEAuto. - Qed. - - End pc1_props. - - Hints Resolve pc1_refl pc1_pr0_u pc1_pr0_r pc1_pr0_x pc1_s - pc1_tail_1 pc1_tail_2 : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pc1_props.v b/helm/coq-contribs/LAMBDA-TYPES/pc1_props.v deleted file mode 100644 index 840a79c84..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pc1_props.v +++ /dev/null @@ -1,25 +0,0 @@ -Require pr1_confluence. -Require pc1_defs. - -(*#* #stop file *) - - Section pc1_trans. (******************************************************) - - Theorem pc1_t: (t2,t1:?) (pc1 t1 t2) -> - (t3:?) (pc1 t2 t3) -> (pc1 t1 t3). - Intros; Repeat Pc1Unfold; Pr1Confluence; XEAuto. - Qed. - - Theorem pc1_pr0_u2: (t0,t1:?) (pr0 t0 t1) -> - (t2:?) (pc1 t0 t2) -> (pc1 t1 t2). - Intros; Apply (pc1_t t0); XAuto. - Qed. - - Theorem pc1_tail: (u1,u2:?) (pc1 u1 u2) -> (t1,t2:?) (pc1 t1 t2) -> - (k:?) (pc1 (TTail k u1 t1) (TTail k u2 t2)). - Intros; EApply pc1_t; [ EApply pc1_tail_1 | EApply pc1_tail_2 ]; XAuto. - Qed. - - End pc1_trans. - - Hints Resolve pc1_t pc1_tail : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pc3_defs.v b/helm/coq-contribs/LAMBDA-TYPES/pc3_defs.v deleted file mode 100644 index 35b114f40..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pc3_defs.v +++ /dev/null @@ -1,84 +0,0 @@ -Require Export pr2_defs. -Require Export pr3_defs. -Require Export pc1_defs. - -(*#* #caption "the relation $\\PcT{}{}{}$" *) -(*#* #cap #cap c, t, t1, t2 *) - - Definition pc3 := [c:?; t1,t2:?] (EX t | (pr3 c t1 t) & (pr3 c t2 t)). - -(*#* #stop file *) - - Hints Unfold pc3 : ltlc. - - Tactic Definition Pc3Unfold := - Match Context With - [ H: (pc3 ?1 ?2 ?3) |- ? ] -> Unfold pc3 in H; XDecompose H. - - Section pc3_props. (******************************************************) - - Theorem pc3_pr2_r: (c,t1,t2:?) (pr2 c t1 t2) -> (pc3 c t1 t2). - XEAuto. - Qed. - - Theorem pc3_pr2_x: (c,t1,t2:?) (pr2 c t2 t1) -> (pc3 c t1 t2). - XEAuto. - Qed. - - Theorem pc3_pr3_r: (c:?; t1,t2) (pr3 c t1 t2) -> (pc3 c t1 t2). - XEAuto. - Qed. - - Theorem pc3_pr3_x: (c:?; t1,t2) (pr3 c t2 t1) -> (pc3 c t1 t2). - XEAuto. - Qed. - - Theorem pc3_pr3_t: (c:?; t1,t0:?) (pr3 c t1 t0) -> - (t2:?) (pr3 c t2 t0) -> (pc3 c t1 t2). - XEAuto. - Qed. - - Theorem pc3_pr2_u: (c:?; t2,t1:?) (pr2 c t1 t2) -> - (t3:?) (pc3 c t2 t3) -> (pc3 c t1 t3). - Intros; Pc3Unfold; XEAuto. - Qed. - - Theorem pc3_refl: (c:?; t:?) (pc3 c t t). - XEAuto. - Qed. - - Theorem pc3_s: (c,t2,t1:?) (pc3 c t1 t2) -> (pc3 c t2 t1). - Intros; Pc3Unfold; XEAuto. - Qed. - - Theorem pc3_thin_dx: (c:? ;t1,t2:?) (pc3 c t1 t2) -> - (u:?; f:?) (pc3 c (TTail (Flat f) u t1) - (TTail (Flat f) u t2)). - Intros; Pc3Unfold; XEAuto. - Qed. - - Theorem pc3_tail_1: (c:?; u1,u2:?) (pc3 c u1 u2) -> - (k:?; t:?) (pc3 c (TTail k u1 t) (TTail k u2 t)). - Intros; Pc3Unfold; XEAuto. - Qed. - - Theorem pc3_tail_2: (c:?; u,t1,t2:?; k:?) (pc3 (CTail c k u) t1 t2) -> - (pc3 c (TTail k u t1) (TTail k u t2)). - Intros; Pc3Unfold; XEAuto. - Qed. - - Theorem pc3_shift: (h:?; c,e:?) (drop h (0) c e) -> - (t1,t2:?) (pc3 c t1 t2) -> - (pc3 e (app c h t1) (app c h t2)). - Intros; Pc3Unfold; XEAuto. - Qed. - - Theorem pc3_pc1: (t1,t2:?) (pc1 t1 t2) -> (c:?) (pc3 c t1 t2). - Intros; Pc1Unfold; XEAuto. - Qed. - - End pc3_props. - - Hints Resolve pc3_refl pc3_pr2_r pc3_pr2_x pc3_pr3_r pc3_pr3_x - pc3_s pc3_pr3_t pc3_thin_dx pc3_tail_1 pc3_tail_2 - pc3_pr2_u pc3_shift pc3_pc1 : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pc3_gen.v b/helm/coq-contribs/LAMBDA-TYPES/pc3_gen.v deleted file mode 100644 index 8a27227e6..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pc3_gen.v +++ /dev/null @@ -1,88 +0,0 @@ -(*#* #stop file *) - -Require lift_gen. -Require pr3_props. -Require pr3_gen. -Require pc3_defs. -Require pc3_props. - - Section pc3_gen. (********************************************************) - - Theorem pc3_gen_sort: (c:?; m,n:?) (pc3 c (TSort m) (TSort n)) -> m = n. - Intros; Pc3Unfold; Repeat Pr3GenBase. - Rewrite H0 in H; Clear H0 x c. - TGenBase; XAuto. - Qed. - - Theorem pc3_gen_abst: (c:?; u1,u2,t1,t2:?) - (pc3 c (TTail (Bind Abst) u1 t1) - (TTail (Bind Abst) u2 t2) - ) -> - (pc3 c u1 u2) /\ - (b:?; u:?) (pc3 (CTail c (Bind b) u) t1 t2). - Intros. - Pc3Unfold; Repeat Pr3GenBase; Rewrite H1 in H; Clear H1 x. - TGenBase; Rewrite H1 in H4; Rewrite H6 in H5. - XEAuto. - Qed. - - Theorem pc3_gen_lift: (c:?; t1,t2:?; h,d:?) - (pc3 c (lift h d t1) (lift h d t2)) -> - (e:?) (drop h d c e) -> - (pc3 e t1 t2). - Intros. - Pc3Unfold; Repeat Pr3Gen; Rewrite H2 in H; Clear H2 x. - LiftGen; Rewrite H in H4; XEAuto. - Qed. - - Theorem pc3_gen_not_abst: (b:?) ~b=Abst -> (c:?; t1,t2,u1,u2:?) - (pc3 c (TTail (Bind b) u1 t1) - (TTail (Bind Abst) u2 t2) - ) -> - (pc3 (CTail c (Bind b) u1) t1 - (lift (1) (0) (TTail (Bind Abst) u2 t2)) - ). - XElim b; Intros; - Try EqFalse; Pc3Unfold; Repeat Pr3Gen; - Try (Rewrite H0 in H3; TGenBase); - Rewrite H1 in H0; Clear H H1 x; - EApply pc3_pr3_t; XEAuto. - Qed. - - Theorem pc3_gen_lift_abst: (c:?; t,t2,u2:?; h,d:?) - (pc3 c (lift h d t) - (TTail (Bind Abst) u2 t2) - ) -> - (e:?) (drop h d c e) -> - (EX u1 t1 | (pr3 e t (TTail (Bind Abst) u1 t1)) & - (pr3 c u2 (lift h d u1)) & - (b:B; u:T)(pr3 (CTail c (Bind b) u) t2 (lift h (S d) t1)) - ). - Intros. - Pc3Unfold; Repeat Pr3Gen; Rewrite H1 in H; Clear H1 x. - LiftGenBase; Rewrite H in H3; Rewrite H1 in H4; Rewrite H2 in H5; XEAuto. - Qed. - - End pc3_gen. - - Tactic Definition Pc3Gen := - Match Context With - | [H: (pc3 ?1 (TSort ?2) (TSort ?3)) |- ? ] -> - LApply (pc3_gen_sort ?1 ?2 ?3); [ Clear H; Intros | XAuto ] - | [ _: (pc3 ?1 (lift ?2 ?3 ?4) (lift ?2 ?3 ?5)); - _: (drop ?2 ?3 ?1 ?6) |- ? ] -> - LApply (pc3_gen_lift ?1 ?4 ?5 ?2 ?3); [ Intros H_x | XAuto ]; - LApply (H_x ?6); [ Clear H_x; Intros | XAuto ] - | [ H: (pc3 ?1 (TTail (Bind Abst) ?2 ?3) (TTail (Bind Abst) ?4 ?5)) |- ? ] -> - LApply (pc3_gen_abst ?1 ?2 ?4 ?3 ?5);[ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (pc3 ?1 (TTail (Bind ?2) ?3 ?4) (TTail (Bind Abst) ?5 ?6)); - _: ~ ?2 = Abst |- ? ] -> - LApply (pc3_gen_not_abst ?2); [ Intros H_x | XAuto ]; - LApply (H_x ?1 ?4 ?6 ?3 ?5); [ Clear H H_x; Intros | XAuto ] - | [ _: (pc3 ?1 (lift ?2 ?3 ?4) (TTail (Bind Abst) ?5 ?6)); - _: (drop ?2 ?3 ?1 ?7) |- ? ] -> - LApply (pc3_gen_lift_abst ?1 ?4 ?6 ?5 ?2 ?3); [ Intros H_x | XAuto ]; - LApply (H_x ?7); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros - | _ -> Pr3Gen. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pc3_gen_context.v b/helm/coq-contribs/LAMBDA-TYPES/pc3_gen_context.v deleted file mode 100644 index 42f03f2ab..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pc3_gen_context.v +++ /dev/null @@ -1,22 +0,0 @@ -(*#* #stop file *) - -Require subst1_confluence. -Require csubst1_defs. -Require pr3_gen_context. -Require pc3_defs. -Require pc3_props. - - Section pc3_gen_context. (************************************************) - - Theorem pc3_gen_cabbr: (c:?; t1,t2:?) (pc3 c t1 t2) -> (e:?; u:?; d:?) - (drop d (0) c (CTail e (Bind Abbr) u)) -> - (a0:?) (csubst1 d u c a0) -> - (a:?) (drop (1) d a0 a) -> - (x1:?) (subst1 d u t1 (lift (1) d x1)) -> - (x2:?) (subst1 d u t2 (lift (1) d x2)) -> - (pc3 a x1 x2). - Intros; Pc3Unfold; Repeat Pr3GenContext. - Subst1Confluence; Rewrite H3 in H5; Clear H3 x3; XEAuto. - Qed. - - End pc3_gen_context. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pc3_props.v b/helm/coq-contribs/LAMBDA-TYPES/pc3_props.v deleted file mode 100644 index 28aa03150..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pc3_props.v +++ /dev/null @@ -1,233 +0,0 @@ -(*#* #stop file *) - -Require subst0_subst0. -Require pr0_subst0. -Require cpr0_defs. -Require pr3_defs. -Require pr3_props. -Require pr3_confluence. -Require pc3_defs. - - Section pc3_trans. (******************************************************) - - Theorem pc3_t: (t2,c,t1:?) (pc3 c t1 t2) -> - (t3:?) (pc3 c t2 t3) -> (pc3 c t1 t3). - Intros; Repeat Pc3Unfold; Pr3Confluence; XEAuto. - Qed. - - Theorem pc3_pr2_u2: (c:?; t0,t1:?) (pr2 c t0 t1) -> - (t2:?) (pc3 c t0 t2) -> (pc3 c t1 t2). - Intros; Apply (pc3_t t0); XAuto. - Qed. - - Theorem pc3_tail_12: (c:?; u1,u2:?) (pc3 c u1 u2) -> - (k:?; t1,t2:?) (pc3 (CTail c k u2) t1 t2) -> - (pc3 c (TTail k u1 t1) (TTail k u2 t2)). - Intros. - EApply pc3_t; [ Apply pc3_tail_1 | Apply pc3_tail_2 ]; XAuto. - Qed. - - Theorem pc3_tail_21: (c:?; u1,u2:?) (pc3 c u1 u2) -> - (k:?; t1,t2:?) (pc3 (CTail c k u1) t1 t2) -> - (pc3 c (TTail k u1 t1) (TTail k u2 t2)). - Intros. - EApply pc3_t; [ Apply pc3_tail_2 | Apply pc3_tail_1 ]; XAuto. - Qed. - - End pc3_trans. - - Hints Resolve pc3_t pc3_tail_12 pc3_tail_21 : ltlc. - - Tactic Definition Pc3T := - Match Context With - | [ _: (pr3 ?1 ?2 (TTail ?3 ?4 ?5)); _: (pc3 ?1 ?6 ?4) |- ? ] -> - LApply (pc3_t (TTail ?3 ?4 ?5) ?1 ?2); [ Intros H_x | XAuto ]; - LApply (H_x (TTail ?3 ?6 ?5)); [ Clear H_x; Intros | Apply pc3_s; XAuto ] - | [ _: (pc3 ?1 ?2 ?3); _: (pr3 ?1 ?3 ?4) |- ? ] -> - LApply (pc3_t ?3 ?1 ?2); [ Intros H_x | XAuto ]; - LApply (H_x ?4); [ Clear H_x; Intros | XAuto ] - | [ _: (pc3 ?1 ?2 ?3); _: (pc3 ?1 ?4 ?3) |- ? ] -> - LApply (pc3_t ?3 ?1 ?2); [ Intros H_x | XAuto ]; - LApply (H_x ?4); [ Clear H_x; Intros | XAuto ]. - - Section pc3_context. (****************************************************) - - Theorem pc3_pr0_pr2_t: (u1,u2:?) (pr0 u2 u1) -> - (c:?; t1,t2:?; k:?) (pr2 (CTail c k u2) t1 t2) -> - (pc3 (CTail c k u1) t1 t2). - Intros. - Inversion H0; Clear H0; [ XAuto | NewInduction i ]. -(* case 1: pr2_delta i = 0 *) - DropGenBase; Inversion H0; Clear H0 H4 H5 H6 c k t. - Rewrite H7 in H; Clear H7 u2. - Pr0Subst0; Apply pc3_pr3_t with t0:=x; XEAuto. -(* case 2: pr2_delta i > 0 *) - NewInduction k; DropGenBase; XEAuto. - Qed. - - Theorem pc3_pr2_pr2_t: (c:?; u1,u2:?) (pr2 c u2 u1) -> - (t1,t2:?; k:?) (pr2 (CTail c k u2) t1 t2) -> - (pc3 (CTail c k u1) t1 t2). - Intros until 1; Inversion H; Clear H; Intros. -(* case 1: pr2_free *) - EApply pc3_pr0_pr2_t; [ Apply H0 | XAuto ]. -(* case 2: pr2_delta *) - Inversion H; [ XAuto | NewInduction i0 ]. -(* case 2.1: i0 = 0 *) - DropGenBase; Inversion H4; Clear H3 H4 H7 t t4. - Rewrite <- H9; Rewrite H10 in H; Rewrite <- H11 in H6; Clear H9 H10 H11 d0 k u0. - Pr0Subst0; Subst0Subst0; Arith9'In H6 i. - EApply pc3_pr2_u. - EApply pr2_delta; XEAuto. - Apply pc3_pr2_x; EApply pr2_delta; [ Idtac | XEAuto | XEAuto ]; XEAuto. -(* case 2.2: i0 > 0 *) - Clear IHi0; NewInduction k; DropGenBase; XEAuto. - Qed. - - Theorem pc3_pr2_pr3_t: (c:?; u2,t1,t2:?; k:?) - (pr3 (CTail c k u2) t1 t2) -> - (u1:?) (pr2 c u2 u1) -> - (pc3 (CTail c k u1) t1 t2). - Intros until 1; XElim H; Intros. -(* case 1: pr3_refl *) - XAuto. -(* case 2: pr3_sing *) - EApply pc3_t. - EApply pc3_pr2_pr2_t; [ Apply H2 | Apply H ]. - XAuto. - Qed. - - Theorem pc3_pr3_pc3_t: (c:?; u1,u2:?) (pr3 c u2 u1) -> - (t1,t2:?; k:?) (pc3 (CTail c k u2) t1 t2) -> - (pc3 (CTail c k u1) t1 t2). - Intros until 1; XElim H; Intros. -(* case 1: pr3_refl *) - XAuto. -(* case 2: pr3_sing *) - Apply H1; Pc3Unfold. - EApply pc3_t; [ Idtac | Apply pc3_s ]; EApply pc3_pr2_pr3_t; XEAuto. - Qed. - - End pc3_context. - - Tactic Definition Pc3Context := - Match Context With - | [ H1: (pr0 ?3 ?2); H2: (pr2 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> - LApply (pc3_pr0_pr2_t ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?1 ?5 ?6 ?4); [ Clear H1 H2; Intros | XAuto ] - | [ H1: (pr0 ?3 ?2); H2: (pr3 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> - LApply (pc3_pr2_pr3_t ?1 ?3 ?5 ?6 ?4); [ Clear H2; Intros H2 | XAuto ]; - LApply (H2 ?2); [ Clear H1 H2; Intros | XAuto ] - | [ H1: (pr2 ?1 ?3 ?2); H2: (pr2 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> - LApply (pc3_pr2_pr2_t ?1 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?5 ?6 ?4); [ Clear H1 H2; Intros | XAuto ] - | [ H1: (pr2 ?1 ?3 ?2); H2: (pr3 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> - LApply (pc3_pr2_pr3_t ?1 ?3 ?5 ?6 ?4); [ Clear H2; Intros H2 | XAuto ]; - LApply (H2 ?2); [ Clear H1 H2; Intros | XAuto ] - | [ H1: (pr3 ?1 ?3 ?2); H2: (pc3 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> - LApply (pc3_pr3_pc3_t ?1 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?5 ?6 ?4); [ Clear H1 H2; Intros | XAuto ] - | _ -> Pr3Context. - - Section pc3_lift. (*******************************************************) - - Theorem pc3_lift: (c,e:?; h,d:?) (drop h d c e) -> - (t1,t2:?) (pc3 e t1 t2) -> - (pc3 c (lift h d t1) (lift h d t2)). - - Intros. - Pc3Unfold. - EApply pc3_pr3_t; (EApply pr3_lift; [ XEAuto | Apply H1 Orelse Apply H2 ]). - Qed. - - End pc3_lift. - - Hints Resolve pc3_lift : ltlc. - - Section pc3_cpr0. (*******************************************************) - - Remark pc3_cpr0_t_aux: (c1,c2:?) (cpr0 c1 c2) -> - (k:?; u,t1,t2:?) (pr3 (CTail c1 k u) t1 t2) -> - (pc3 (CTail c2 k u) t1 t2). - Intros; XElim H0; Intros. -(* case 1.1: pr3_refl *) - XAuto. -(* case 1.2: pr3_sing *) - EApply pc3_t; [ Idtac | XEAuto ]. Clear H2 t1 t2. - Inversion_clear H0. -(* case 1.2.1: pr2_free *) - XAuto. -(* case 1.2.2: pr2_delta *) - Cpr0Drop; Pr0Subst0. - EApply pc3_pr2_u; [ EApply pr2_delta; XEAuto | XAuto ]. - Qed. - - Theorem pc3_cpr0_t: (c1,c2:?) (cpr0 c1 c2) -> - (t1,t2:?) (pr3 c1 t1 t2) -> - (pc3 c2 t1 t2). - Intros until 1; XElim H; Intros. -(* case 1: cpr0_refl *) - XAuto. -(* case 2: cpr0_comp *) - Pc3Context; Pc3Unfold. - EApply pc3_t; [ Idtac | Apply pc3_s ]; EApply pc3_cpr0_t_aux; XEAuto. - Qed. - - Theorem pc3_cpr0: (c1,c2:?) (cpr0 c1 c2) -> (t1,t2:?) (pc3 c1 t1 t2) -> - (pc3 c2 t1 t2). - Intros; Pc3Unfold. - EApply pc3_t; [ Idtac | Apply pc3_s ]; EApply pc3_cpr0_t; XEAuto. - Qed. - - End pc3_cpr0. - - Hints Resolve pc3_cpr0 : ltlc. - - Section pc3_ind_left. (***************************************************) - - Inductive pc3_left [c:C] : T -> T -> Prop := - | pc3_left_r : (t:?) (pc3_left c t t) - | pc3_left_ur: (t1,t2:?) (pr2 c t1 t2) -> (t3:?) (pc3_left c t2 t3) -> - (pc3_left c t1 t3) - | pc3_left_ux: (t1,t2:?) (pr2 c t1 t2) -> (t3:?) (pc3_left c t1 t3) -> - (pc3_left c t2 t3). - - Hint pc3_left: ltlc := Constructors pc3_left. - - Remark pc3_left_pr3: (c:?; t1,t2:?) (pr3 c t1 t2) -> (pc3_left c t1 t2). - Intros; XElim H; XEAuto. - Qed. - - Remark pc3_left_trans: (c:?; t1,t2:?) (pc3_left c t1 t2) -> - (t3:?) (pc3_left c t2 t3) -> (pc3_left c t1 t3). - Intros until 1; XElim H; XEAuto. - Qed. - - Hints Resolve pc3_left_trans : ltlc. - - Remark pc3_left_sym: (c:?; t1,t2:?) (pc3_left c t1 t2) -> - (pc3_left c t2 t1). - Intros; XElim H; XEAuto. - Qed. - - Hints Resolve pc3_left_sym pc3_left_pr3 : ltlc. - - Remark pc3_left_pc3: (c:?; t1,t2:?) (pc3 c t1 t2) -> (pc3_left c t1 t2). - Intros; Pc3Unfold; XEAuto. - Qed. - - Remark pc3_pc3_left: (c:?; t1,t2:?) (pc3_left c t1 t2) -> (pc3 c t1 t2). - Intros; XElim H; XEAuto. - Qed. - - Hints Resolve pc3_left_pc3 pc3_pc3_left : ltlc. - - Theorem pc3_ind_left: (c:C; P:(T->T->Prop)) - ((t:T) (P t t)) -> - ((t1,t2:T) (pr2 c t1 t2) -> (t3:T) (pc3 c t2 t3) -> (P t2 t3) -> (P t1 t3)) -> - ((t1,t2:T) (pr2 c t1 t2) -> (t3:T) (pc3 c t1 t3) -> (P t1 t3) -> (P t2 t3)) -> - (t,t0:T) (pc3 c t t0) -> (P t t0). - Intros; ElimType (pc3_left c t t0); XEAuto. - Qed. - - End pc3_ind_left. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pc3_subst0.v b/helm/coq-contribs/LAMBDA-TYPES/pc3_subst0.v deleted file mode 100644 index 02a5d8a38..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pc3_subst0.v +++ /dev/null @@ -1,136 +0,0 @@ -(*#* #stop file *) - -Require subst0_subst0. -Require fsubst0_defs. -Require pr0_subst0. -Require pc3_defs. -Require pc3_props. - - Section pc3_fsubst0. (****************************************************) - - Theorem pc3_pr2_fsubst0: (c1:?; t1,t:?) (pr2 c1 t1 t) -> - (i:?; u,c2,t2:?) (fsubst0 i u c1 t1 c2 t2) -> - (e:?) (drop i (0) c1 (CTail e (Bind Abbr) u)) -> - (pc3 c2 t2 t). - Intros until 1; XElim H. -(* case 1: pr2_free *) - Intros until 2; XElim H0; Intros. -(* case 1.1: fsubst0_snd *) - Pr0Subst0; [ XAuto | Apply (pc3_pr2_u c1 x); XEAuto ]. -(* case 1.2: fsubst0_fst *) - XAuto. -(* case 1.3: fsubst0_both *) - Pr0Subst0; CSubst0Drop; [ XAuto | Apply (pc3_pr2_u c0 x); XEAuto ]. -(* case 2 : pr2_delta *) - Intros until 4; XElim H2; Intros. -(* case 2.1: fsubst0_snd. *) - Apply (pc3_t t1); [ Apply pc3_s; XEAuto | XEAuto ]. -(* case 2.2: fsubst0_fst. *) - Apply (lt_le_e i i0); Intros; CSubst0Drop. -(* case 2.2.1: i < i0, none *) - XEAuto. -(* case 2.2.2: i < i0, csubst0_snd *) - CGenBase; Rewrite <- H8 in H5; Rewrite <- H9 in H5; Rewrite <- H9 in H6; Rewrite <- H10 in H6; Clear H8 H9 H10 c2 t3 x0 x1 x2. - Subst0Subst0; Rewrite <- lt_plus_minus_r in H7; [ CSubst0Drop | XAuto ]. - Apply (pc3_pr2_u c0 x); XEAuto. -(* case 2.2.3: i < i0, csubst0_fst *) - CGenBase; Rewrite <- H8 in H6; Rewrite <- H9 in H5; Rewrite <- H9 in H6; Rewrite <- H10 in H5; Clear H8 H9 H10 c2 t3 x0 x1 x3. - Apply pc3_pr2_r; XEAuto. -(* case 2.2.4: i < i0, csubst0_both *) - CGenBase; Rewrite <- H9 in H7; Rewrite <- H10 in H5; Rewrite <- H10 in H6; Rewrite <- H10 in H7; Rewrite <- H11 in H6; Clear H9 H10 H11 c2 t3 x0 x1 x3. - Subst0Subst0; Rewrite <- lt_plus_minus_r in H8; [ CSubst0Drop | XAuto ]. - Apply (pc3_pr2_u c0 x); XEAuto. -(* case 2.2.5: i >= i0 *) - XEAuto. -(* case 2.3: fsubst0_both *) - Apply (lt_le_e i i0); Intros; CSubst0Drop. -(* case 2.3.1 : i < i0, none *) - CSubst0Drop; Apply pc3_pr2_u2 with t0 := t1; XEAuto. -(* case 2.3.2 : i < i0, csubst0_snd *) - CGenBase; Rewrite <- H9 in H6; Rewrite <- H10 in H6; Rewrite <- H10 in H7; Rewrite <- H11 in H7; Clear H9 H10 H11 c2 t3 x0 x1 x2. - Subst0Subst0; Rewrite <- lt_plus_minus_r in H8; [ CSubst0Drop | XAuto ]. - Apply (pc3_pr2_u2 c0 t1); [ Idtac | Apply (pc3_pr2_u c0 x) ]; XEAuto. -(* case 2.3.3: i < i0, csubst0_fst *) - CGenBase; Rewrite <- H9 in H7; Rewrite <- H10 in H6; Rewrite <- H10 in H7; Rewrite <- H11 in H6; Clear H9 H10 H11 c2 t3 x0 x1 x3. - CSubst0Drop; Apply (pc3_pr2_u2 c0 t1); [ Idtac | Apply pc3_pr2_r ]; XEAuto. -(* case 2.3.4: i < i0, csubst0_both *) - CGenBase; Rewrite <- H10 in H8; Rewrite <- H11 in H6; Rewrite <- H11 in H7; Rewrite <- H11 in H8; Rewrite <- H12 in H7; Clear H10 H11 H12 c2 t3 x0 x1 x3. - Subst0Subst0; Rewrite <- lt_plus_minus_r in H9; [ CSubst0Drop | XAuto ]. - Apply (pc3_pr2_u2 c0 t1); [ Idtac | Apply (pc3_pr2_u c0 x) ]; XEAuto. -(* case 2.3.5: i >= i0 *) - CSubst0Drop; Apply (pc3_pr2_u2 c0 t1); XEAuto. - Qed. - - Theorem pc3_pr2_fsubst0_back: (c1:?; t,t1:?) (pr2 c1 t t1) -> - (i:?; u,c2,t2:?) (fsubst0 i u c1 t1 c2 t2) -> - (e:?) (drop i (0) c1 (CTail e (Bind Abbr) u)) -> - (pc3 c2 t t2). - Intros until 1; XElim H. -(* case 1: pr2_free *) - Intros until 2; XElim H0; Intros. -(* case 1.1: fsubst0_snd. *) - Apply (pc3_pr2_u c1 t2); XEAuto. -(* case 1.2: fsubst0_fst. *) - XAuto. -(* case 1.3: fsubst0_both. *) - CSubst0Drop; Apply (pc3_pr2_u c0 t2); XEAuto. -(* case 2: pr2_delta *) - Intros until 4; XElim H2; Intros. -(* case 2.1: fsubst0_snd. *) - Apply (pc3_t t2); Apply pc3_pr3_r; XEAuto. -(* case 2.2: fsubst0_fst. *) - Apply (lt_le_e i i0); Intros; CSubst0Drop. -(* case 2.2.1: i < i0, none *) - XEAuto. -(* case 2.2.2: i < i0, csubst0_bind *) - CGenBase; Rewrite <- H8 in H5; Rewrite <- H9 in H5; Rewrite <- H9 in H6; Rewrite <- H10 in H6; Clear H8 H9 H10 c2 t3 x0 x1 x2. - Subst0Subst0; Rewrite <- lt_plus_minus_r in H7; [ CSubst0Drop | XAuto ]. - Apply (pc3_pr2_u c0 x); XEAuto. -(* case 2.2.3: i < i0, csubst0_fst *) - CGenBase; Rewrite <- H8 in H6; Rewrite <- H9 in H5; Rewrite <- H9 in H6; Rewrite <- H10 in H5; Clear H8 H9 H10 c2 t3 x0 x1 x3. - Apply pc3_pr2_r; XEAuto. -(* case 2.2.4: i < i0, csubst0_both *) - CGenBase; Rewrite <- H9 in H7; Rewrite <- H10 in H5; Rewrite <- H10 in H6; Rewrite <- H10 in H7; Rewrite <- H11 in H6; Clear H9 H10 H11 c2 t3 x0 x1 x3. - Subst0Subst0; Rewrite <- lt_plus_minus_r in H8; [ CSubst0Drop | XAuto ]. - Apply (pc3_pr2_u c0 x); XEAuto. -(* case 2.2.5: i >= i0 *) - XEAuto. -(* case 2.3: fsubst0_both *) - Apply (lt_le_e i i0); Intros; CSubst0Drop. -(* case 2.3.1 : i < i0, none *) - CSubst0Drop; Apply pc3_pr2_u with t2:=t2; Try Apply pc3_pr3_r; XEAuto. -(* case 2.3.2 : i < i0, csubst0_snd *) - CGenBase; Rewrite <- H9 in H6; Rewrite <- H10 in H6; Rewrite <- H10 in H7; Rewrite <- H11 in H7; Clear H9 H10 H11 c2 t3 x0 x1 x2. - Subst0Subst0; Rewrite <- lt_plus_minus_r in H8; [ CSubst0Drop | XAuto ]. - Apply (pc3_pr2_u c0 x); [ Idtac | Apply (pc3_pr2_u2 c0 t0) ]; XEAuto. -(* case 2.3.3: i < i0, csubst0_fst *) - CGenBase; Rewrite <- H9 in H7; Rewrite <- H10 in H6; Rewrite <- H10 in H7; Rewrite <- H11 in H6; Clear H9 H10 H11 c2 t3 x0 x1 x3. - CSubst0Drop; Apply (pc3_pr2_u c0 t0); [ Idtac | Apply pc3_pr2_r ]; XEAuto. -(* case 2.3.4: i < i0, csubst0_both *) - CGenBase; Rewrite <- H10 in H8; Rewrite <- H11 in H6; Rewrite <- H11 in H7; Rewrite <- H11 in H8; Rewrite <- H12 in H7; Clear H10 H11 H12 c2 t3 x0 x1 x3. - Subst0Subst0; Rewrite <- lt_plus_minus_r in H9; [ CSubst0Drop | XAuto ]. - Apply (pc3_pr2_u c0 x); [ Idtac | Apply (pc3_pr2_u2 c0 t0) ]; XEAuto. -(* case 2.3.5: i >= i0 *) - CSubst0Drop; Apply (pc3_pr2_u c0 t0); XEAuto. - Qed. - - Opaque pc3. - - Theorem pc3_fsubst0: (c1:?; t1,t:?) (pc3 c1 t1 t) -> - (i:?; u,c2,t2:?) (fsubst0 i u c1 t1 c2 t2) -> - (e:?) (drop i (0) c1 (CTail e (Bind Abbr) u)) -> - (pc3 c2 t2 t). - Intros until 1; XElimUsing pc3_ind_left H. -(* case 1: pc3_refl *) - Intros until 1; XElim H; Intros; Try CSubst0Drop; XEAuto. -(* case 2: pc3_pr2_u *) - Intros until 4; XElim H2; Intros; - (Apply (pc3_t t2); [ EApply pc3_pr2_fsubst0; XEAuto | XEAuto ]). -(* case 2: pc3_pr2_u2 *) - Intros until 4; XElim H2; Intros; - (Apply (pc3_t t0); [ Apply pc3_s; EApply pc3_pr2_fsubst0_back; XEAuto | XEAuto ]). - Qed. - - End pc3_fsubst0. - - Hints Resolve pc3_fsubst0 : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr0_confluence.v b/helm/coq-contribs/LAMBDA-TYPES/pr0_confluence.v deleted file mode 100644 index c23d6743f..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr0_confluence.v +++ /dev/null @@ -1,176 +0,0 @@ -(*#* #stop file *) - -Require tlt_defs. -Require lift_gen. -Require lift_tlt. -Require subst0_gen. -Require subst0_confluence. -Require pr0_defs. -Require pr0_lift. -Require pr0_gen. -Require pr0_subst0. - - Section pr0_confluence. (*************************************************) - - Tactic Definition SSubstInv := - Match Context With - | [ H0: (TTail ? ? ?) = (TTail ? ? ?) |- ? ] -> - Inversion H0; Clear H0 - | [ H0: (pr0 (TTail (Bind ?) ? ?) ?) |- ? ] -> - Inversion H0; Clear H0 - | _ -> EqFalse Orelse LiftGen Orelse Pr0Gen. - - Tactic Definition SSubstBack := - Match Context With - | [ H0: Abst = ?1; H1:? |- ? ] -> - Rewrite <- H0 in H1 Orelse Rewrite <- H0 Orelse Clear H0 ?1 - | [ H0: Abbr = ?1; H1:? |- ? ] -> - Rewrite <- H0 in H1 Orelse Rewrite <- H0 Orelse Clear H0 ?1 - | [ H0: (? ?) = ?1; H1:? |- ? ] -> - Rewrite <- H0 in H1 Orelse Rewrite <- H0 Orelse Clear H0 ?1 - | [ H0: (? ? ? ?) = ?1; H1:? |- ? ] -> - Rewrite <- H0 in H1 Orelse Rewrite <- H0 Orelse Clear H0 ?1. - - Tactic Definition SSubst := - Match Context With - [ H0: ?1 = ?; H1:? |- ? ] -> - Rewrite H0 in H1 Orelse Rewrite H0 Orelse Clear H0 ?1. - - Tactic Definition XSubst := - Repeat (SSubstInv Orelse SSubstBack Orelse SSubst). - - Tactic Definition IH := - Match Context With - | [ H0: (pr0 ?1 ?2); H1: (pr0 ?1 ?3) |- ? ] -> - LApply (H ?1); [ Intros H_x | XEAuto ]; - LApply (H_x ?2); [ Clear H_x; Intros H_x | XAuto ]; - LApply (H_x ?3); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Clear H0 H1; Intros. - -(* case pr0_cong pr0_upsilon pr0_refl ***************************************) - - Remark pr0_cong_upsilon_refl: (b:?) ~ b = Abst -> - (u0,u3:?) (pr0 u0 u3) -> - (t4,t5:?) (pr0 t4 t5) -> - (u2,v2,x:?) (pr0 u2 x) -> (pr0 v2 x) -> - (EX t:T | (pr0 (TTail (Flat Appl) u2 (TTail (Bind b) u0 t4)) t) & - (pr0 (TTail (Bind b) u3 (TTail (Flat Appl) (lift (1) (0) v2) t5)) t)). - Intros. - Apply ex2_intro with x:=(TTail (Bind b) u3 (TTail (Flat Appl) (lift (1) (0) x) t5)); XAuto. - Qed. - -(* case pr0_cong pr0_upsilon pr0_cong ***************************************) - - Remark pr0_cong_upsilon_cong: (b:?) ~ b = Abst -> - (u2,v2,x:?) (pr0 u2 x) -> (pr0 v2 x) -> - (t2,t5,x0:?) (pr0 t2 x0) -> (pr0 t5 x0) -> - (u5,u3,x1:?) (pr0 u5 x1) -> (pr0 u3 x1) -> - (EX t:T | (pr0 (TTail (Flat Appl) u2 (TTail (Bind b) u5 t2)) t) & - (pr0 (TTail (Bind b) u3 (TTail (Flat Appl) (lift (1) (0) v2) t5)) t)). - Intros. - Apply ex2_intro with x:=(TTail (Bind b) x1 (TTail (Flat Appl) (lift (1) (0) x) x0)); XAuto. - Qed. - -(* case pr0_cong pr0_upsilon pr0_delta **************************************) - - Remark pr0_cong_upsilon_delta: ~ Abbr = Abst -> - (u5,t2,w:?) (subst0 (0) u5 t2 w) -> - (u2,v2,x:?) (pr0 u2 x) -> (pr0 v2 x) -> - (t5,x0:?) (pr0 t2 x0) -> (pr0 t5 x0) -> - (u3,x1:?) (pr0 u5 x1) -> (pr0 u3 x1) -> - (EX t:T | (pr0 (TTail (Flat Appl) u2 (TTail (Bind Abbr) u5 w)) t) & - (pr0 (TTail (Bind Abbr) u3 (TTail (Flat Appl) (lift (1) (0) v2) t5)) t)). - Intros; Pr0Subst0. -(* case 1: x0 is a lift *) - Apply ex2_intro with x:=(TTail (Bind Abbr) x1 (TTail (Flat Appl) (lift (1) (0) x) x0)); XAuto. -(* case 2: x0 is not a lift *) - Apply ex2_intro with x:=(TTail (Bind Abbr) x1 (TTail (Flat Appl) (lift (1) (0) x) x2)); XEAuto. - Qed. - -(* case pr0_cong pr0_upsilon pr0_zeta ***************************************) - - Remark pr0_cong_upsilon_zeta: (b:?) ~ b = Abst -> - (u0,u3:?) (pr0 u0 u3) -> - (u2,v2,x0:?) (pr0 u2 x0) -> (pr0 v2 x0) -> - (x,t3,x1:?) (pr0 x x1) -> (pr0 t3 x1) -> - (EX t:T | (pr0 (TTail (Flat Appl) u2 t3) t) & - (pr0 (TTail (Bind b) u3 (TTail (Flat Appl) (lift (1) (0) v2) (lift (1) (0) x))) t)). - Intros; LiftTailRwBack; XEAuto. - Qed. - -(* case pr0_cong pr0_delta **************************************************) - - Remark pr0_cong_delta: (u3,t5,w:?) (subst0 (0) u3 t5 w) -> - (u2,x:?) (pr0 u2 x) -> (pr0 u3 x) -> - (t3,x0:?) (pr0 t3 x0) -> (pr0 t5 x0) -> - (EX t:T | (pr0 (TTail (Bind Abbr) u2 t3) t) & - (pr0 (TTail (Bind Abbr) u3 w) t)). - Intros; Pr0Subst0; XEAuto. - Qed. - -(* case pr0_upsilon pr0_upsilon *********************************************) - - Remark pr0_upsilon_upsilon: (b:?) ~ b = Abst -> - (v1,v2,x0:?) (pr0 v1 x0) -> (pr0 v2 x0) -> - (u1,u2,x1:?) (pr0 u1 x1) -> (pr0 u2 x1) -> - (t1,t2,x2:?) (pr0 t1 x2) -> (pr0 t2 x2) -> - (EX t:T | (pr0 (TTail (Bind b) u1 (TTail (Flat Appl) (lift (1) (0) v1) t1)) t) & - (pr0 (TTail (Bind b) u2 (TTail (Flat Appl) (lift (1) (0) v2) t2)) t)). - Intros. - Apply ex2_intro with x:=(TTail (Bind b) x1 (TTail (Flat Appl) (lift (1) (0) x0) x2)); XAuto. - Qed. - -(* case pr0_delta pr0_delta *************************************************) - - Remark pr0_delta_delta: (u2,t3,w:?) (subst0 (0) u2 t3 w) -> - (u3,t5,w0:?) (subst0 (0) u3 t5 w0) -> - (x:?) (pr0 u2 x) -> (pr0 u3 x) -> - (x0:?) (pr0 t3 x0) -> (pr0 t5 x0) -> - (EX t:T | (pr0 (TTail (Bind Abbr) u2 w) t) & - (pr0 (TTail (Bind Abbr) u3 w0) t)). - Intros; Pr0Subst0; Pr0Subst0; Try Subst0Confluence; XSubst; XEAuto. - Qed. - -(* case pr0_delta pr0_epsilon ***********************************************) - - Remark pr0_delta_epsilon: (u2,t3,w:?) (subst0 (0) u2 t3 w) -> - (t4:?) (pr0 (lift (1) (0) t4) t3) -> - (t2:?) (EX t:T | (pr0 (TTail (Bind Abbr) u2 w) t) & (pr0 t2 t)). - Intros; Pr0Gen; XSubst; Subst0Gen. - Qed. - -(* main *********************************************************************) - - Hints Resolve pr0_cong_upsilon_refl pr0_cong_upsilon_cong : ltlc. - Hints Resolve pr0_cong_upsilon_delta pr0_cong_upsilon_zeta : ltlc. - Hints Resolve pr0_cong_delta : ltlc. - Hints Resolve pr0_upsilon_upsilon : ltlc. - Hints Resolve pr0_delta_delta pr0_delta_epsilon : ltlc. - -(*#* #start file *) - -(*#* #caption "confluence with itself: Church-Rosser property" *) -(*#* #cap #cap t0, t1, t2, t *) - - Theorem pr0_confluence: (t0,t1:?) (pr0 t0 t1) -> (t2:?) (pr0 t0 t2) -> - (EX t | (pr0 t1 t) & (pr0 t2 t)). - -(*#* #stop file *) - - XElimUsing tlt_wf_ind t0; Intros. - Inversion H0; Inversion H1; Clear H0 H1; - XSubst; Repeat IH; XDEAuto 4. - Qed. - - End pr0_confluence. - - Tactic Definition Pr0Confluence := - Match Context With - [ H1: (pr0 ?1 ?2); H2: (pr0 ?1 ?3) |-? ] -> - LApply (pr0_confluence ?1 ?2); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?3); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros. - -(*#* #start file *) - -(*#* #single *) diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr0_defs.v b/helm/coq-contribs/LAMBDA-TYPES/pr0_defs.v deleted file mode 100644 index 640b56f1f..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr0_defs.v +++ /dev/null @@ -1,101 +0,0 @@ -Require Export subst0_defs. - -(*#* #caption "axioms for the relation $\\PrZ{}{}$", - "reflexivity", "compatibility", "$\\beta$-contraction", "$\\upsilon$-swap", - "$\\delta$-expansion", "$\\zeta$-contraction", "$\\epsilon$-contraction" -*) -(*#* #cap #cap t, t1, t2 #alpha u in V, u1 in V1, u2 in V2, v1 in W1, v2 in W2, w in T, k in z *) - - Inductive pr0 : T -> T -> Prop := -(* structural rules *) - | pr0_refl : (t:?) (pr0 t t) - | pr0_comp : (u1,u2:?) (pr0 u1 u2) -> (t1,t2:?) (pr0 t1 t2) -> - (k:?) (pr0 (TTail k u1 t1) (TTail k u2 t2)) -(* axiom rules *) - | pr0_beta : (u,v1,v2:?) (pr0 v1 v2) -> (t1,t2:?) (pr0 t1 t2) -> - (pr0 (TTail (Flat Appl) v1 (TTail (Bind Abst) u t1)) - (TTail (Bind Abbr) v2 t2)) - | pr0_upsilon: (b:?) ~b=Abst -> (v1,v2:?) (pr0 v1 v2) -> - (u1,u2:?) (pr0 u1 u2) -> (t1,t2:?) (pr0 t1 t2) -> - (pr0 (TTail (Flat Appl) v1 (TTail (Bind b) u1 t1)) - (TTail (Bind b) u2 (TTail (Flat Appl) (lift (1) (0) v2) t2))) - | pr0_delta : (u1,u2:?) (pr0 u1 u2) -> (t1,t2:?) (pr0 t1 t2) -> - (w:?) (subst0 (0) u2 t2 w) -> - (pr0 (TTail (Bind Abbr) u1 t1) (TTail (Bind Abbr) u2 w)) - | pr0_zeta : (b:?) ~b=Abst -> (t1,t2:?) (pr0 t1 t2) -> - (u:?) (pr0 (TTail (Bind b) u (lift (1) (0) t1)) t2) - | pr0_epsilon: (t1,t2:?) (pr0 t1 t2) -> - (u:?) (pr0 (TTail (Flat Cast) u t1) t2). - -(*#* #stop file *) - - Hint pr0 : ltlc := Constructors pr0. - - Section pr0_gen_base. (***************************************************) - - Theorem pr0_gen_sort : (x:?; n:?) (pr0 (TSort n) x) -> x = (TSort n). - Intros; Inversion H; XAuto. - Qed. - - Theorem pr0_gen_lref : (x:?; n:?) (pr0 (TLRef n) x) -> x = (TLRef n). - Intros; Inversion H; XAuto. - Qed. - - Theorem pr0_gen_abst : (u1,t1,x:?) (pr0 (TTail (Bind Abst) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Bind Abst) u2 t2) & - (pr0 u1 u2) & (pr0 t1 t2) - ). - - Intros; Inversion H; Clear H. -(* case 1 : pr0_refl *) - XEAuto. -(* case 2 : pr0_cont *) - XEAuto. -(* case 3 : pr0_zeta *) - XElim H4; XAuto. - Qed. - - Theorem pr0_gen_appl : (u1,t1,x:?) (pr0 (TTail (Flat Appl) u1 t1) x) -> (OR - (EX u2 t2 | x = (TTail (Flat Appl) u2 t2) & - (pr0 u1 u2) & (pr0 t1 t2) - ) | - (EX y1 z1 u2 t2 | t1 = (TTail (Bind Abst) y1 z1) & - x = (TTail (Bind Abbr) u2 t2) & - (pr0 u1 u2) & (pr0 z1 t2) - ) | - (EX b y1 z1 u2 v2 t2 | - ~b=Abst & - t1 = (TTail (Bind b) y1 z1) & - x = (TTail (Bind b) v2 (TTail (Flat Appl) (lift (1) (0) u2) t2)) & - (pr0 u1 u2) & (pr0 y1 v2) & (pr0 z1 t2)) - ). - Intros; Inversion H; XEAuto. - Qed. - - Theorem pr0_gen_cast : (u1,t1,x:?) (pr0 (TTail (Flat Cast) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Flat Cast) u2 t2) & - (pr0 u1 u2) & (pr0 t1 t2) - ) \/ - (pr0 t1 x). - Intros; Inversion H; XEAuto. - Qed. - - End pr0_gen_base. - - Hints Resolve pr0_gen_sort pr0_gen_lref : ltlc. - - Tactic Definition Pr0GenBase := - Match Context With - | [ H: (pr0 (TSort ?1) ?2) |- ? ] -> - LApply (pr0_gen_sort ?2 ?1); [ Clear H; Intros | XAuto ] - | [ H: (pr0 (TLRef ?1) ?2) |- ? ] -> - LApply (pr0_gen_lref ?2 ?1); [ Clear H; Intros | XAuto ] - | [ H: (pr0 (TTail (Bind Abst) ?1 ?2) ?3) |- ? ] -> - LApply (pr0_gen_abst ?1 ?2 ?3); [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (pr0 (TTail (Flat Appl) ?1 ?2) ?3) |- ? ] -> - LApply (pr0_gen_appl ?1 ?2 ?3); [ Clear H; Intros H | XAuto ]; - XElim H; Intros H; XElim H; Intros - | [ H: (pr0 (TTail (Flat Cast) ?1 ?2) ?3) |- ? ] -> - LApply (pr0_gen_cast ?1 ?2 ?3); [ Clear H; Intros H | XAuto ]; - XElim H; [ Intros H; XElim H; Intros | Intros ]. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr0_gen.v b/helm/coq-contribs/LAMBDA-TYPES/pr0_gen.v deleted file mode 100644 index bfe189586..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr0_gen.v +++ /dev/null @@ -1,99 +0,0 @@ -(*#* #stop file *) - -Require lift_gen. -Require lift_props. -Require subst0_gen. -Require pr0_defs. -Require pr0_lift. - - Section pr0_gen_abbr. (***************************************************) - - Theorem pr0_gen_abbr : (u1,t1,x:?) (pr0 (TTail (Bind Abbr) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Bind Abbr) u2 t2) & - (pr0 u1 u2) & - (pr0 t1 t2) \/ - (EX y | (pr0 t1 y) & (subst0 (0) u2 y t2)) - ) \/ - (pr0 t1 (lift (1) (0) x)). - Intros. - Inversion H; Clear H; XDEAuto 6. - Qed. - - End pr0_gen_abbr. - - Section pr0_gen_void. (***************************************************) - - Theorem pr0_gen_void : (u1,t1,x:?) (pr0 (TTail (Bind Void) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Bind Void) u2 t2) & - (pr0 u1 u2) & (pr0 t1 t2) - ) \/ - (pr0 t1 (lift (1) (0) x)). - Intros. - Inversion H; Clear H; XEAuto. - Qed. - - End pr0_gen_void. - - Section pr0_gen_lift. (***************************************************) - - Tactic Definition IH := - Match Context With - | [ H: (_:?; _:?) ?0 = (lift ? ? ?) -> ?; - H0: ?0 = (lift ? ?2 ?3) |- ? ] -> - LApply (H ?3 ?2); [ Clear H H0; Intros H_x | XAuto ]; - XElim H_x; Intro; Intros H_x; Intro; - Try Rewrite H_x; Try Rewrite H_x in H3; Clear H_x. - -(*#* #caption "generation lemma for lift" *) -(*#* #cap #alpha t1 in U1, t2 in U2, x in T, d in i *) - - Theorem pr0_gen_lift : (t1,x:?; h,d:?) (pr0 (lift h d t1) x) -> - (EX t2 | x = (lift h d t2) & (pr0 t1 t2)). - Intros until 1; InsertEq H '(lift h d t1); - UnIntro H d; UnIntro H t1; XElim H; Clear y x; Intros; - Rename x into t3; Rename x0 into d. -(* case 1 : pr0_r *) - XEAuto. -(* case 2 : pr0_c *) - NewInduction k; LiftGen; Rewrite H3; Clear H3 t0; - IH; IH; XEAuto. -(* case 3 : pr0_beta *) - LiftGen; Rewrite H3; Clear H3 t0. - LiftGen; Rewrite H3; Clear H3 H5 x1 k. - IH; IH; XEAuto. -(* case 4 : pr0_upsilon *) - LiftGen; Rewrite H6; Clear H6 t0. - LiftGen; Rewrite H6; Clear H6 x1. - IH; IH; IH. - Rewrite <- lift_d; [ Simpl | XAuto ]. - Rewrite <- lift_flat; XEAuto. -(* case 5 : pr0_delta *) - LiftGen; Rewrite H4; Clear H4 t0. - IH; IH; Arith3In H3 d; Subst0Gen. - Rewrite H3; XEAuto. -(* case 6 : pr0_zeta *) - LiftGen; Rewrite H2; Clear H2 t0. - Arith7In H4 d; LiftGen; Rewrite H2; Clear H2 x1. - IH; XEAuto. -(* case 7 : pr0_zeta *) - LiftGen; Rewrite H1; Clear H1 t0. - IH; XEAuto. - Qed. - - End pr0_gen_lift. - - Tactic Definition Pr0Gen := - Match Context With - | [ H: (pr0 (TTail (Bind Abbr) ?1 ?2) ?3) |- ? ] -> - LApply (pr0_gen_abbr ?1 ?2 ?3); [ Clear H; Intros H | XAuto ]; - XElim H; - [ Intros H; XElim H; Do 4 Intro; Intros H_x; - XElim H_x; [ Intros | Intros H_x; XElim H_x; Intros ] - | Intros ] - | [ H: (pr0 (TTail (Bind Void) ?1 ?2) ?3) |- ? ] -> - LApply (pr0_gen_void ?1 ?2 ?3); [ Clear H; Intros H | XAuto ]; - XElim H; [ Intros H; XElim H; Intros | Intros ] - | [ H: (pr0 (lift ?0 ?1 ?2) ?3) |- ? ] -> - LApply (pr0_gen_lift ?2 ?3 ?0 ?1); [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | _ -> Pr0GenBase. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr0_lift.v b/helm/coq-contribs/LAMBDA-TYPES/pr0_lift.v deleted file mode 100644 index b6d9ba247..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr0_lift.v +++ /dev/null @@ -1,39 +0,0 @@ -Require lift_props. -Require subst0_lift. -Require pr0_defs. - -(*#* #caption "main properties of the relation $\\PrZ{}{}$" *) -(*#* #clauses pr0_props *) - -(*#* #stop file *) - - Section pr0_lift. (*******************************************************) - -(*#* #caption "conguence with lift" *) -(*#* #cap #cap t1,t2 #alpha d in i *) - - Theorem pr0_lift: (t1,t2:?) (pr0 t1 t2) -> - (h,d:?) (pr0 (lift h d t1) (lift h d t2)). - - Intros until 1; XElim H; Intros. -(* case 1: pr0_refl *) - XAuto. -(* case 2: pr0_cong *) - LiftTailRw; XAuto. -(* case 3 : pr0_beta *) - LiftTailRw; XAuto. -(* case 4: pr0_upsilon *) - LiftTailRw; Simpl; Arith0 d; Rewrite lift_d; XAuto. -(* case 5: pr0_delta *) - LiftTailRw; Simpl. - EApply pr0_delta; [ XAuto | Apply H2 | Idtac ]. - LetTac d' := (S d); Arith10 d; Unfold d'; XAuto. -(* case 6: pr0_zeta *) - LiftTailRw; Simpl; Arith0 d; Rewrite lift_d; XAuto. -(* case 7: pr0_epsilon *) - LiftTailRw; XAuto. - Qed. - - End pr0_lift. - - Hints Resolve pr0_lift : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr0_subst0.v b/helm/coq-contribs/LAMBDA-TYPES/pr0_subst0.v deleted file mode 100644 index 46a137e18..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr0_subst0.v +++ /dev/null @@ -1,105 +0,0 @@ -Require subst0_gen. -Require subst0_lift. -Require subst0_subst0. -Require subst0_confluence. -Require pr0_defs. -Require pr0_lift. - -(*#* #stop file *) - - Section pr0_subst0. (*****************************************************) - - Tactic Definition IH := - Match Context With - | [ H1: (u1:?) (pr0 u1 ?1) -> ?; H2: (pr0 ?2 ?1) |- ? ] -> - LApply (H1 ?2); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; Intros - | [ H1: (u1:?) (pr0 ?1 u1) -> ?; H2: (pr0 ?1 ?2) |- ? ] -> - LApply (H1 ?2); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; Intros - | [ H1: (v1,w1:?; i:?) (subst0 i v1 ?1 w1) -> (v2:T) (pr0 v1 v2) -> ?; - H2: (subst0 ?2 ?3 ?1 ?4); H3: (pr0 ?3 ?5) |- ? ] -> - LApply (H1 ?3 ?4 ?2); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?5); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; [ Intros | Intros H1; XElim H1; Intros ]. - - Theorem pr0_subst0_back: (u2,t1,t2:?; i:?) (subst0 i u2 t1 t2) -> - (u1:?) (pr0 u1 u2) -> - (EX t | (subst0 i u1 t1 t) & (pr0 t t2)). - Intros until 1; XElim H; Intros; - Repeat IH; XEAuto. - Qed. - - Theorem pr0_subst0_fwd: (u2,t1,t2:?; i:?) (subst0 i u2 t1 t2) -> - (u1:?) (pr0 u2 u1) -> - (EX t | (subst0 i u1 t1 t) & (pr0 t2 t)). - Intros until 1; XElim H; Intros; - Repeat IH; XEAuto. - Qed. - - Hints Resolve pr0_subst0_fwd : ltlc. - -(*#* #start file *) - -(*#* #caption "confluence with strict substitution" *) -(*#* #cap #cap t1, t2 #alpha v1 in W1, v2 in W2, w1 in U1, w2 in U2 *) - - Theorem pr0_subst0: (t1,t2:?) (pr0 t1 t2) -> - (v1,w1:?; i:?) (subst0 i v1 t1 w1) -> - (v2:?) (pr0 v1 v2) -> - (pr0 w1 t2) \/ - (EX w2 | (pr0 w1 w2) & (subst0 i v2 t2 w2)). - -(*#* #stop file *) - - Intros until 1; XElim H; Clear t1 t2; Intros. -(* case 1: pr0_refl *) - XEAuto. -(* case 2: pr0_cong *) - Subst0Gen; Rewrite H3; Repeat IH; XEAuto. -(* case 3: pr0_beta *) - Repeat Subst0Gen; Rewrite H3; Try Rewrite H5; Try Rewrite H6; - Repeat IH; XEAuto. -(* case 4: pr0_upsilon *) - Repeat Subst0Gen; Rewrite H6; Try Rewrite H8; Try Rewrite H9; - Repeat IH; XDEAuto 7. -(* case 5: pr0_delta *) - Subst0Gen; Rewrite H4; Repeat IH; - [ XEAuto | Idtac | XEAuto | Idtac | XEAuto | Idtac | Idtac | Idtac ]. - Subst0Subst0; Arith9'In H9 i; XEAuto. - Subst0Confluence; XEAuto. - Subst0Subst0; Arith9'In H10 i; XEAuto. - Subst0Confluence; XEAuto. - Subst0Subst0; Arith9'In H11 i; Subst0Confluence; XDEAuto 6. -(* case 6: pr0_zeta *) - Repeat Subst0Gen; Rewrite H2; Try Rewrite H4; Try Rewrite H5; - Try (Simpl in H5; Rewrite <- minus_n_O in H5); - Try (Simpl in H6; Rewrite <- minus_n_O in H6); - Try IH; XEAuto. -(* case 7: pr0_epsilon *) - Subst0Gen; Rewrite H1; Try IH; XEAuto. - Qed. - - End pr0_subst0. - - Tactic Definition Pr0Subst0 := - Match Context With - | [ H1: (pr0 ?1 ?2); H2: (subst0 ?3 ?4 ?1 ?5); - H3: (pr0 ?4 ?6) |- ? ] -> - LApply (pr0_subst0 ?1 ?2); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?4 ?5 ?3); [ Clear H1 H2; Intros H1 | XAuto ]; - LApply (H1 ?6); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; [ Intros | Intros H1; XElim H1; Intros ] - | [ H1: (pr0 ?1 ?2); H2: (subst0 ?3 ?4 ?1 ?5) |- ? ] -> - LApply (pr0_subst0 ?1 ?2); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?4 ?5 ?3); [ Clear H1 H2; Intros H1 | XAuto ]; - LApply (H1 ?4); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; [ Intros | Intros H1; XElim H1; Intros ] - | [ _: (subst0 ?0 ?1 ?2 ?3); _: (pr0 ?4 ?1) |- ? ] -> - LApply (pr0_subst0_back ?1 ?2 ?3 ?0); [ Intros H_x | XAuto ]; - LApply (H_x ?4); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros - | [ H1: (subst0 ?0 ?1 ?2 ?3); H2: (pr0 ?1 ?4) |- ? ] -> - LApply (pr0_subst0_fwd ?1 ?2 ?3 ?0); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?4); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr0_subst1.v b/helm/coq-contribs/LAMBDA-TYPES/pr0_subst1.v deleted file mode 100644 index fbf8e8b38..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr0_subst1.v +++ /dev/null @@ -1,63 +0,0 @@ -(*#* #stop file *) - -Require subst1_defs. -Require pr0_defs. -Require pr0_subst0. - - Section pr0_subst1_props. (***********************************************) - - Theorem pr0_delta1: (u1,u2:?) (pr0 u1 u2) -> (t1,t2:?) (pr0 t1 t2) -> - (w:?) (subst1 (0) u2 t2 w) -> - (pr0 (TTail (Bind Abbr) u1 t1) (TTail (Bind Abbr) u2 w)). - Intros until 3; XElim H1; Clear w; XEAuto. - Qed. - - Theorem pr0_subst1_back: (u2,t1,t2:?; i:?) (subst1 i u2 t1 t2) -> - (u1:?) (pr0 u1 u2) -> - (EX t | (subst1 i u1 t1 t) & (pr0 t t2)). - Intros until 1; XElim H; Intros; - Try Pr0Subst0; XEAuto. - Qed. - - Theorem pr0_subst1_fwd: (u2,t1,t2:?; i:?) (subst1 i u2 t1 t2) -> - (u1:?) (pr0 u2 u1) -> - (EX t | (subst1 i u1 t1 t) & (pr0 t2 t)). - Intros until 1; XElim H; Intros; - Try Pr0Subst0; XEAuto. - Qed. - - Theorem pr0_subst1: (t1,t2:?) (pr0 t1 t2) -> - (v1,w1:?; i:?) (subst1 i v1 t1 w1) -> - (v2:?) (pr0 v1 v2) -> - (EX w2 | (pr0 w1 w2) & (subst1 i v2 t2 w2)). - Intros until 2; XElim H0; Intros; - Try Pr0Subst0; XEAuto. - Qed. - - End pr0_subst1_props. - - Hints Resolve pr0_delta1 : ltlc. - - Tactic Definition Pr0Subst1 := - Match Context With - | [ H1: (pr0 ?1 ?2); H2: (subst1 ?3 ?4 ?1 ?5); - H3: (pr0 ?4 ?6) |- ? ] -> - LApply (pr0_subst1 ?1 ?2); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?4 ?5 ?3); [ Clear H1 H2; Intros H1 | XAuto ]; - LApply (H1 ?6); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; Intros - | [ H1: (pr0 ?1 ?2); H2: (subst1 ?3 ?4 ?1 ?5) |- ? ] -> - LApply (pr0_subst1 ?1 ?2); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?4 ?5 ?3); [ Clear H1 H2; Intros H1 | XAuto ]; - LApply (H1 ?4); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; Intros - | [ H1: (subst1 ?0 ?1 ?2 ?3); H2: (pr0 ?4 ?1) |- ? ] -> - LApply (pr0_subst1_back ?1 ?2 ?3 ?0); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?4); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros - | [ H1: (subst1 ?0 ?1 ?2 ?3); H2: (pr0 ?1 ?4) |- ? ] -> - LApply (pr0_subst1_fwd ?1 ?2 ?3 ?0); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?4); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros - | _ -> Pr0Subst0. - diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr1_confluence.v b/helm/coq-contribs/LAMBDA-TYPES/pr1_confluence.v deleted file mode 100644 index fac076d31..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr1_confluence.v +++ /dev/null @@ -1,56 +0,0 @@ -(*#* #stop file *) - -Require pr0_confluence. -Require pr1_defs. - -(*#* #caption "main properties of predicate \\texttt{pr1}" *) -(*#* #clauses pr1_props *) - - Section pr1_confluence. (*************************************************) - -(*#* #caption "confluence with single step reduction: strip lemma" *) -(*#* #cap #cap t0, t1, t2, t *) - - Theorem pr1_strip : (t0,t1:?) (pr1 t0 t1) -> (t2:?) (pr0 t0 t2) -> - (EX t | (pr1 t1 t) & (pr1 t2 t)). - Intros until 1; XElim H; Intros. -(* case 1 : pr1_r *) - XEAuto. -(* case 2 : pr1_u *) - Pr0Confluence. - LApply (H1 x); [ Clear H1 H2; Intros H1 | XAuto ]. - XElim H1; Intros; XEAuto. - Qed. - -(*#* #caption "confluence with itself: Church-Rosser property" *) -(*#* #cap #cap t0, t1, t2, t *) - - Theorem pr1_confluence : (t0,t1:?) (pr1 t0 t1) -> (t2:?) (pr1 t0 t2) -> - (EX t | (pr1 t1 t) & (pr1 t2 t)). - Intros until 1; XElim H; Intros. -(* case 1 : pr1_r *) - XEAuto. -(* case 2 : pr1_u *) - LApply (pr1_strip t3 t5); [ Clear H2; Intros H2 | XAuto ]. - LApply (H2 t2); [ Clear H H2; Intros H | XAuto ]. - XElim H; Intros. - LApply (H1 x); [ Clear H1 H2; Intros H1 | XAuto ]. - XElim H1; Intros; XEAuto. - Qed. - - End pr1_confluence. - - Tactic Definition Pr1Confluence := - Match Context With - | [ H1: (pr1 ?1 ?2); H2: (pr0 ?1 ?3) |-? ] -> - LApply (pr1_strip ?1 ?2); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?3); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros - | [ H1: (pr1 ?1 ?2); H2: (pr1 ?1 ?3) |-? ] -> - LApply (pr1_confluence ?1 ?2); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?3); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros - | _ -> Pr0Confluence. - -(*#* #single *) - diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr1_defs.v b/helm/coq-contribs/LAMBDA-TYPES/pr1_defs.v deleted file mode 100644 index ed05b0e5d..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr1_defs.v +++ /dev/null @@ -1,34 +0,0 @@ -(*#* #stop file *) - -Require Export pr0_defs. - - Inductive pr1 : T -> T -> Prop := - | pr1_r: (t:?) (pr1 t t) - | pr1_u: (t2,t1:?) (pr0 t1 t2) -> (t3:?) (pr1 t2 t3) -> (pr1 t1 t3). - - Hint pr1 : ltlc := Constructors pr1. - - Section pr1_props. (******************************************************) - - Theorem pr1_pr0: (t1,t2:?) (pr0 t1 t2) -> (pr1 t1 t2). - XEAuto. - Qed. - - Theorem pr1_t: (t2,t1:?) (pr1 t1 t2) -> - (t3:?) (pr1 t2 t3) -> (pr1 t1 t3). - Intros until 1; XElim H; XEAuto. - Qed. - - Theorem pr1_tail_1: (u1,u2:?) (pr1 u1 u2) -> - (t:?; k:?) (pr1 (TTail k u1 t) (TTail k u2 t)). - Intros; XElim H; XEAuto. - Qed. - - Theorem pr1_tail_2: (t1,t2:?) (pr1 t1 t2) -> - (u:?; k:?) (pr1 (TTail k u t1) (TTail k u t2)). - Intros; XElim H; XEAuto. - Qed. - - End pr1_props. - - Hints Resolve pr1_pr0 pr1_t pr1_tail_1 pr1_tail_2 : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr2_confluence.v b/helm/coq-contribs/LAMBDA-TYPES/pr2_confluence.v deleted file mode 100644 index 8b2fd4769..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr2_confluence.v +++ /dev/null @@ -1,74 +0,0 @@ -(*#* #stop file *) - -Require subst0_confluence. -Require drop_props. -Require pr0_subst0. -Require pr0_confluence. -Require pr2_defs. - - Section pr2_confluence. (*************************************************) - -(* case 1.1 : pr2_free pr2_free *********************************************) - - Remark pr2_free_free: (c:?; t0,t1,t2:?) - (pr0 t0 t1) -> (pr0 t0 t2) -> - (EX t:T | (pr2 c t1 t) & (pr2 c t2 t)). - Intros; Pr0Confluence; XEAuto. - Qed. - -(* case 1.2 : pr2_free pr2_delta ********************************************) - - Remark pr2_free_delta: (c,d:?; t0,t1,t2,t4,u:?; i:?) - (pr0 t0 t1) -> - (drop i (0) c (CTail d (Bind Abbr) u)) -> - (pr0 t0 t4) -> - (subst0 i u t4 t2) -> - (EX t | (pr2 c t1 t) & (pr2 c t2 t)). - Intros; Pr0Confluence; Pr0Subst0; XEAuto. - Qed. - -(* case 2.2 : pr2_delta pr2_delta *******************************************) - - Remark pr2_delta_delta: (c,d,d0:?; t0,t1,t2,t3,t4,u,u0:?; i,i0:?) - (drop i (0) c (CTail d (Bind Abbr) u)) -> - (pr0 t0 t3) -> - (subst0 i u t3 t1) -> - (drop i0 (0) c (CTail d0 (Bind Abbr) u0)) -> - (pr0 t0 t4) -> - (subst0 i0 u0 t4 t2) -> - (EX t:T | (pr2 c t1 t) & (pr2 c t2 t)). - Intros; Pr0Confluence; Repeat Pr0Subst0; - [ XEAuto | XEAuto | XEAuto | Idtac ]. - Apply (neq_eq_e i i0); Intros. -(* case 1 : i != i0 *) - Subst0Confluence; XEAuto. -(* case 2 : i = i0 *) - Rewrite H5 in H; Rewrite H5 in H3; Clear H5 i. - DropDis; Inversion H2; Rewrite H7 in H3; Clear H2 H6 H7 d u. - Subst0Confluence; [ Rewrite H2 in H0; XEAuto | XEAuto | XEAuto | XEAuto ]. - Qed. - -(* main *********************************************************************) - - Hints Resolve pr2_free_free pr2_free_delta pr2_delta_delta : ltlc. - -(*#* #caption "confluence with itself: Church-Rosser property" *) -(*#* #cap #cap c, t0, t1, t2, t *) - - Theorem pr2_confluence: (c,t0,t1:?) (pr2 c t0 t1) -> - (t2:?) (pr2 c t0 t2) -> - (EX t | (pr2 c t1 t) & (pr2 c t2 t)). - Intros; Inversion H; Inversion H0; XDEAuto 3. - Qed. - - End pr2_confluence. - - Tactic Definition Pr2Confluence := - Match Context With - | [ H1: (pr2 ?1 ?2 ?3); H2: (pr2 ?1 ?2 ?4) |-? ] -> - LApply (pr2_confluence ?1 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?4); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros - | _ -> Pr0Confluence. - -(*#* #single *) diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr2_defs.v b/helm/coq-contribs/LAMBDA-TYPES/pr2_defs.v deleted file mode 100644 index 9dab9cafe..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr2_defs.v +++ /dev/null @@ -1,137 +0,0 @@ -Require Export drop_defs. -Require Export pr0_defs. - -(*#* #caption "current axioms for the relation $\\PrS{}{}{}$", - "context-free case", "context-dependent $\\delta$-expansion" -*) -(*#* #cap #cap c, d, t, t1, t2 #alpha u in V *) - - Inductive pr2 [c:C; t1:T] : T -> Prop := -(* structural rules *) - | pr2_free : (t2:?) (pr0 t1 t2) -> (pr2 c t1 t2) -(* axiom rules *) - | pr2_delta: (d:?; u:?; i:?) - (drop i (0) c (CTail d (Bind Abbr) u)) -> - (t2:?) (pr0 t1 t2) -> (t:?) (subst0 i u t2 t) -> - (pr2 c t1 t). - -(*#* #stop file *) - - Hint pr2 : ltlc := Constructors pr2. - - Section pr2_gen_base. (***************************************************) - - Theorem pr2_gen_sort: (c:?; x:?; n:?) (pr2 c (TSort n) x) -> - x = (TSort n). - Intros; Inversion H; Pr0GenBase; - [ XAuto | Rewrite H1 in H2; Subst0GenBase ]. - Qed. - - Theorem pr2_gen_lref: (c:?; x:?; n:?) (pr2 c (TLRef n) x) -> - x = (TLRef n) \/ - (EX d u | (drop n (0) c (CTail d (Bind Abbr) u)) & - x = (lift (S n) (0) u) - ). - Intros; Inversion H; Pr0GenBase; - [ XAuto | Rewrite H1 in H2; Subst0GenBase; Rewrite <- H2 in H0; XEAuto ]. - Qed. - - Theorem pr2_gen_abst: (c:?; u1,t1,x:?) - (pr2 c (TTail (Bind Abst) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Bind Abst) u2 t2) & - (pr2 c u1 u2) & (b:?; u:?) - (pr2 (CTail c (Bind b) u) t1 t2) - ). - Intros; Inversion H; Pr0GenBase; - [ XEAuto | Rewrite H1 in H2; Subst0GenBase; XDEAuto 6 ]. - Qed. - - Theorem pr2_gen_appl: (c:?; u1,t1,x:?) - (pr2 c (TTail (Flat Appl) u1 t1) x) -> (OR - (EX u2 t2 | x = (TTail (Flat Appl) u2 t2) & - (pr2 c u1 u2) & (pr2 c t1 t2) - ) | - (EX y1 z1 u2 t2 | t1 = (TTail (Bind Abst) y1 z1) & - x = (TTail (Bind Abbr) u2 t2) & - (pr2 c u1 u2) & (b:?; u:?) - (pr2 (CTail c (Bind b) u) z1 t2) - ) | - (EX b y1 z1 z2 u2 v2 t2 | - ~b=Abst & - t1 = (TTail (Bind b) y1 z1) & - x = (TTail (Bind b) v2 z2) & - (pr2 c u1 u2) & (pr2 c y1 v2) & (pr0 z1 t2)) - ). - Intros; Inversion H; Pr0GenBase; - Try Rewrite H1 in H2; Try Rewrite H4 in H2; Try Rewrite H5 in H2; - Try Subst0GenBase; XDEAuto 7. - Qed. - - Theorem pr2_gen_cast: (c:?; u1,t1,x:?) - (pr2 c (TTail (Flat Cast) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Flat Cast) u2 t2) & - (pr2 c u1 u2) & (pr2 c t1 t2) - ) \/ - (pr2 c t1 x). - Intros; Inversion H; Pr0GenBase; - Try Rewrite H1 in H2; Try Subst0GenBase; XEAuto. - Qed. - - End pr2_gen_base. - - Tactic Definition Pr2GenBase := - Match Context With - | [ H: (pr2 ?1 (TSort ?2) ?3) |- ? ] -> - LApply (pr2_gen_sort ?1 ?3 ?2); [ Clear H; Intros | XAuto ] - | [ H: (pr2 ?1 (TLRef ?2) ?3) |- ? ] -> - LApply (pr2_gen_lref ?1 ?3 ?2); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (pr2 ?1 (TTail (Bind Abst) ?2 ?3) ?4) |- ? ] -> - LApply (pr2_gen_abst ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (pr2 ?1 (TTail (Flat Appl) ?2 ?3) ?4) |- ? ] -> - LApply (pr2_gen_appl ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (pr2 ?1 (TTail (Flat Cast) ?2 ?3) ?4) |- ? ] -> - LApply (pr2_gen_cast ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XDecompose H. - - Section pr2_props. (******************************************************) - - Theorem pr2_thin_dx: (c:?; t1,t2:?) (pr2 c t1 t2) -> - (u:?; f:?) (pr2 c (TTail (Flat f) u t1) - (TTail (Flat f) u t2)). - Intros; XElim H; XEAuto. - Qed. - - Theorem pr2_tail_1: (c:?; u1,u2:?) (pr2 c u1 u2) -> - (k:?; t:?) (pr2 c (TTail k u1 t) (TTail k u2 t)). - Intros; XElim H; XEAuto. - Qed. - - Theorem pr2_tail_2: (c:?; u,t1,t2:?; k:?) (pr2 (CTail c k u) t1 t2) -> - (pr2 c (TTail k u t1) (TTail k u t2)). - XElim k; Intros; ( - XElim H; [ XAuto | XElim i; Intros; DropGenBase; CGenBase; XEAuto ]). - Qed. - - Hints Resolve pr2_tail_2 : ltlc. - - Theorem pr2_shift: (i:?; c,e:?) (drop i (0) c e) -> - (t1,t2:?) (pr2 c t1 t2) -> - (pr2 e (app c i t1) (app c i t2)). - XElim i. -(* case 1: i = 0 *) - Intros; DropGenBase; Rewrite H in H0. - Repeat Rewrite app_O; XAuto. -(* case 2: i > 0 *) - XElim c. -(* case 2.1: CSort *) - Intros; DropGenBase; Rewrite H0; XAuto. -(* case 2.2: CTail *) - XElim k; Intros; Simpl; DropGenBase; XAuto. - Qed. - - End pr2_props. - - Hints Resolve pr2_thin_dx pr2_tail_1 pr2_tail_2 pr2_shift : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr2_gen.v b/helm/coq-contribs/LAMBDA-TYPES/pr2_gen.v deleted file mode 100644 index 98d128233..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr2_gen.v +++ /dev/null @@ -1,78 +0,0 @@ -(*#* #stop file *) - -Require subst0_gen. -Require subst0_lift. -Require drop_props. -Require pr0_gen. -Require pr0_subst0. -Require pr2_defs. - - Section pr2_gen. (********************************************************) - - Theorem pr2_gen_abbr: (c:?; u1,t1,x:?) - (pr2 c (TTail (Bind Abbr) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Bind Abbr) u2 t2) & - (pr2 c u1 u2) & (OR - (b:?; u:?) (pr2 (CTail c (Bind b) u) t1 t2) | - (EX u | (pr0 u1 u) & (pr2 (CTail c (Bind Abbr) u) t1 t2)) | - (EX y z | (pr2 (CTail c (Bind Abbr) u1) t1 y) & (pr0 y z) & (pr2 (CTail c (Bind Abbr) u1) z t2)) - )) \/ (b:?; u:?) - (pr2 (CTail c (Bind b) u) t1 (lift (1) (0) x)). - Intros; Inversion H; - Pr0Gen; Try Rewrite H1 in H2; Try Subst0Gen; Try Pr0Subst0; XDEAuto 10. - Qed. - - Theorem pr2_gen_void: (c:?; u1,t1,x:?) - (pr2 c (TTail (Bind Void) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Bind Void) u2 t2) & - (pr2 c u1 u2) & (b:?; u:?) - (pr2 (CTail c (Bind b) u) t1 t2) - ) \/ (b:?; u:?) - (pr2 (CTail c (Bind b) u) t1 (lift (1) (0) x)). - Intros; Inversion H; - Try Pr0Gen; Try Rewrite H1 in H2; Try Subst0Gen; XDEAuto 7. - Qed. - -(*#* #caption "generation lemma for lift" *) -(*#* #cap #cap c #alpha e in D, t1 in U1, t2 in U2, x in T, d in i *) - - Theorem pr2_gen_lift: (c:?; t1,x:?; h,d:?) (pr2 c (lift h d t1) x) -> - (e:?) (drop h d c e) -> - (EX t2 | x = (lift h d t2) & (pr2 e t1 t2)). - Intros. - Inversion H; Clear H; Pr0Gen. -(* case 1 : pr2_free *) - XEAuto. -(* case 2 : pr2_delta *) - Rewrite H in H3; Clear H H4 t t2. - Apply (lt_le_e i d); Intros. -(* case 2.1 : i < d *) - Rewrite (lt_plus_minus i d) in H0; [ Idtac | XAuto ]. - Rewrite (lt_plus_minus i d) in H3; [ Idtac | XAuto ]. - DropDis; Rewrite H0 in H3; Clear H0 u. - Subst0Gen; Rewrite <- lt_plus_minus in H0; XEAuto. -(* case 2.2 : i >= d *) - Apply (lt_le_e i (plus d h)); Intros. -(* case 2.2.1 : i < d + h *) - EApply subst0_gen_lift_false; [ Apply H | Apply H4 | XEAuto ]. -(* case 2.2.2 : i >= d + h *) - DropDis; Subst0Gen; XEAuto. - Qed. - - End pr2_gen. - - Tactic Definition Pr2Gen := - Match Context With - | [ H: (pr2 ?1 (TTail (Bind Abbr) ?2 ?3) ?4) |- ? ] -> - LApply (pr2_gen_abbr ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (pr2 ?1 (TTail (Bind Void) ?2 ?3) ?4) |- ? ] -> - LApply (pr2_gen_void ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H0: (pr2 ?1 (lift ?2 ?3 ?4) ?5); - H1: (drop ?2 ?3 ?1 ?6) |- ? ] -> - LApply (pr2_gen_lift ?1 ?4 ?5 ?2 ?3); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?6); [ Clear H0; Intros H0 | XAuto ]; - XDecompose H0 - | _ -> Pr2GenBase. - diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr2_gen_context.v b/helm/coq-contribs/LAMBDA-TYPES/pr2_gen_context.v deleted file mode 100644 index 61d2ffef7..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr2_gen_context.v +++ /dev/null @@ -1,62 +0,0 @@ -(*#* #stop file *) - -Require drop_props. -Require subst1_gen. -Require subst1_subst1. -Require subst1_confluence. -Require csubst1_defs. -Require pr0_gen. -Require pr0_subst1. -Require pr2_defs. -Require pr2_gen. -Require pr2_subst1. - - Section pr2_gen_context. (************************************************) - - Theorem pr2_gen_cabbr: (c:?; t1,t2:?) (pr2 c t1 t2) -> (e:?; u:?; d:?) - (drop d (0) c (CTail e (Bind Abbr) u)) -> - (a0:?) (csubst1 d u c a0) -> - (a:?) (drop (1) d a0 a) -> - (x1:?) (subst1 d u t1 (lift (1) d x1)) -> - (EX x2 | (subst1 d u t2 (lift (1) d x2)) & - (pr2 a x1 x2) - ). - Intros until 1; XElim H; Intros; - Pr0Subst1; Pr0Gen. -(* case 1: pr2_free *) - Rewrite H in H3; Clear H x; XEAuto. -(* case 2: pr2_delta *) - Rewrite H0 in H5; Clear H0 x. - Apply (lt_eq_gt_e i d0); Intros. -(* case 2.1: i < d0 *) - Subst1Confluence; CSubst1Drop. - Rewrite minus_x_Sy in H; [ Idtac | XAuto ]. - CSubst1GenBase; Rewrite H in H7; Clear H x2. - Rewrite (lt_plus_minus i d0) in H4; [ Idtac | XAuto ]. - DropDis; Rewrite H in H8; Clear H x3. - Subst1Subst1; Pattern 2 d0 in H; Rewrite (lt_plus_minus i d0) in H; [ Idtac | XAuto ]. - Subst1Gen; Rewrite H in H10; Simpl in H10; Clear H x3. - Rewrite <- lt_plus_minus in H10; [ Idtac | XAuto ]. - Rewrite <- lt_plus_minus_r in H10; XEAuto. -(* case 2.2: i = d0 *) - Rewrite H0 in H; Rewrite H0 in H1; Clear H0 i. - DropDis; Inversion H; Rewrite <- H8 in H1; Rewrite <- H8 in H2; Rewrite <- H8; Clear H H7 H8 e u. - Subst1Confluence; Subst1Gen; Rewrite H0 in H; Clear H0 x; XEAuto. -(* case 2.3: i > d0 *) - Subst1Confluence; Subst1Gen; Rewrite H5 in H1; Clear H2 H5 x. - CSubst1Drop; DropDis; XEAuto. - Qed. - - End pr2_gen_context. - - Tactic Definition Pr2GenContext := - Match Context With - | [ H0: (pr2 ?1 ?2 ?3); H1: (drop ?4 (0) ?1 (CTail ?5 (Bind Abbr) ?6)); - H2: (csubst1 ?4 ?6 ?1 ?7); H3: (drop (1) ?4 ?7 ?8); - H4: (subst1 ?4 ?6 ?2 (lift (1) ?4 ?9)) |- ? ] -> - LApply (pr2_gen_cabbr ?1 ?2 ?3); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?5 ?6 ?4); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?7); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?8); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?9); [ Clear H0 H4; Intros H0 | XAuto ]; - XElim H0; Intros. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr2_lift.v b/helm/coq-contribs/LAMBDA-TYPES/pr2_lift.v deleted file mode 100644 index 3546cb5f2..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr2_lift.v +++ /dev/null @@ -1,33 +0,0 @@ -(*#* #stop file *) - -Require subst0_lift. -Require drop_props. -Require pr0_lift. -Require pr2_defs. - -(*#* #caption "main properties of predicate \\texttt{pr2}" *) -(*#* #clauses pr2_props *) - - Section pr2_lift. (*******************************************************) - -(*#* #caption "conguence with lift" *) -(*#* #cap #cap c, t1, t2 #alpha e in D, d in i *) - - Theorem pr2_lift : (c,e:?; h,d:?) (drop h d c e) -> - (t1,t2:?) (pr2 e t1 t2) -> - (pr2 c (lift h d t1) (lift h d t2)). - Intros until 2; XElim H0; Intros. -(* case 1 : pr2_free *) - XAuto. -(* case 2 : pr2_delta *) - Apply (lt_le_e i d); Intros; DropDis. -(* case 2.1 : i < d *) - Rewrite minus_x_Sy in H0; [ Idtac | XAuto ]. - DropGenBase; Rewrite H0 in H; Simpl in H; XEAuto. -(* case 2.2 : i >= d *) - XEAuto. - Qed. - - End pr2_lift. - - Hints Resolve pr2_lift : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr2_subst1.v b/helm/coq-contribs/LAMBDA-TYPES/pr2_subst1.v deleted file mode 100644 index 5c7302875..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr2_subst1.v +++ /dev/null @@ -1,48 +0,0 @@ -(*#* #stop file *) - -Require subst1_defs. -Require subst1_confluence. -Require drop_props. -Require pr0_subst1. -Require pr2_defs. - - Section pr2_subst1_props. (***********************************************) - - Theorem pr2_delta1: (c,d:?; u:?; i:?) (drop i (0) c (CTail d (Bind Abbr) u)) -> - (t1,t2:?) (pr0 t1 t2) -> (t:?) (subst1 i u t2 t) -> - (pr2 c t1 t). - Intros; XElim H1; Clear t; XEAuto. - Qed. - - Hints Resolve pr2_delta1 : ltlc. - - Theorem pr2_subst1: (c,e:?; v:?; i:?) (drop i (0) c (CTail e (Bind Abbr) v)) -> - (t1,t2:?) (pr2 c t1 t2) -> - (w1:?) (subst1 i v t1 w1) -> - (EX w2 | (pr2 c w1 w2) & (subst1 i v t2 w2)). - Intros until 2; XElim H0; Intros; - Pr0Subst1. -(* case 1: pr2_free *) - XEAuto. -(* case 2: pr2_delta *) - Apply (neq_eq_e i i0); Intros. -(* case 2.1: i <> i0 *) - Subst1Confluence; XEAuto. -(* case 2.2: i = i0 *) - Rewrite <- H4 in H0; Rewrite <- H4 in H2; Clear H4 i0. - DropDis; Inversion H0; Rewrite H6 in H3; Clear H0 H5 H6 e v. - Subst1Confluence; XEAuto. - Qed. - - End pr2_subst1_props. - - Hints Resolve pr2_delta1 : ltlc. - - Tactic Definition Pr2Subst1 := - Match Context With - | [ H0: (drop ?1 (0) ?2 (CTail ?3 (Bind Abbr) ?4)); - H1: (pr2 ?2 ?5 ?6); H3: (subst1 ?1 ?4 ?5 ?7) |- ? ] -> - LApply (pr2_subst1 ?2 ?3 ?4 ?1); [ Intros H_x | XAuto ]; - LApply (H_x ?5 ?6); [ Clear H_x H1; Intros H1 | XAuto ]; - LApply (H1 ?7); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; Intros. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr3_confluence.v b/helm/coq-contribs/LAMBDA-TYPES/pr3_confluence.v deleted file mode 100644 index 6f5019bc9..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr3_confluence.v +++ /dev/null @@ -1,59 +0,0 @@ -Require pr2_confluence. -Require pr3_defs. - - Section pr3_confluence. (*************************************************) - -(*#* #stop theorem *) - -(*#* #caption "confluence with single step reduction: strip lemma" *) -(*#* #cap #cap c, t0, t1, t2, t *) - - Theorem pr3_strip : (c:?; t0,t1:?) (pr3 c t0 t1) -> (t2:?) (pr2 c t0 t2) -> - (EX t | (pr3 c t1 t) & (pr3 c t2 t)). - Intros until 1; XElim H; Intros. -(* case 1 : pr3_refl *) - XEAuto. -(* case 2 : pr3_sing *) - Pr2Confluence. - LApply (H1 x); [ Clear H1 H2; Intros H1 | XAuto ]. - XElim H1; Intros; XEAuto. - Qed. - -(*#* #start theorem *) - -(*#* #caption "confluence with itself: Church-Rosser property" *) -(*#* #cap #cap c, t0, t1, t2, t *) - - Theorem pr3_confluence : (c:?; t0,t1:?) (pr3 c t0 t1) -> (t2:?) (pr3 c t0 t2) -> - (EX t | (pr3 c t1 t) & (pr3 c t2 t)). - -(*#* #stop file *) - - Intros until 1; XElim H; Intros. -(* case 1 : pr3_refl *) - XEAuto. -(* case 2 : pr3_sing *) - LApply (pr3_strip c t3 t5); [ Clear H2; Intros H2 | XAuto ]. - LApply (H2 t2); [ Clear H H2; Intros H | XAuto ]. - XElim H; Intros. - LApply (H1 x); [ Clear H1 H2; Intros H1 | XAuto ]. - XElim H1; Intros; XEAuto. - Qed. - - End pr3_confluence. - - Tactic Definition Pr3Confluence := - Match Context With - | [ H1: (pr3 ?1 ?2 ?3); H2: (pr2 ?1 ?2 ?4) |-? ] -> - LApply (pr3_strip ?1 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?4); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros - | [ H1: (pr3 ?1 ?2 ?3); H2: (pr3 ?1 ?2 ?4) |-? ] -> - LApply (pr3_confluence ?1 ?2 ?3); [ Clear H1; Intros H1 | XAuto ]; - LApply (H1 ?4); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros - | _ -> Pr2Confluence. - -(*#* #start file *) - -(*#* #single *) diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr3_defs.v b/helm/coq-contribs/LAMBDA-TYPES/pr3_defs.v deleted file mode 100644 index df6764b3f..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr3_defs.v +++ /dev/null @@ -1,194 +0,0 @@ -Require Export pr1_defs. -Require Export pr2_defs. - -(*#* #caption "axioms for the relation $\\PrT{}{}{}$", - "reflexivity", "single step transitivity" -*) -(*#* #cap #cap c, t, t1, t2, t3 *) - - Inductive pr3 [c:C] : T -> T -> Prop := - | pr3_refl: (t:?) (pr3 c t t) - | pr3_sing: (t2,t1:?) (pr2 c t1 t2) -> - (t3:?) (pr3 c t2 t3) -> (pr3 c t1 t3). - -(*#* #stop file *) - - Hint pr3: ltlc := Constructors pr3. - - Section pr3_gen_base. (***************************************************) - - Theorem pr3_gen_sort: (c:?; x:?; n:?) (pr3 c (TSort n) x) -> - x = (TSort n). - Intros; InsertEq H '(TSort n); XElim H; Clear y x; Intros. -(* case 1: pr3_refl *) - XAuto. -(* case 2: pr3_sing *) - Rewrite H2 in H; Clear H2 t1; Pr2GenBase; XAuto. - Qed. - - Tactic Definition IH := - Match Context With - | [ H: (u,t:T) (TTail (Bind Abst) ?1 ?2) = (TTail (Bind Abst) u t) -> ? |- ? ] -> - LApply (H ?1 ?2); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (u,t:T) (TTail (Flat Appl) ?1 ?2) = (TTail (Flat Appl) u t) -> ? |- ? ] -> - LApply (H ?1 ?2); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (u,t:T) (TTail (Flat Cast) ?1 ?2) = (TTail (Flat Cast) u t) -> ? |- ? ] -> - LApply (H ?1 ?2); [ Clear H; Intros H | XAuto ]; - XDecompose H. - - Theorem pr3_gen_abst: (c:?; u1,t1,x:?) - (pr3 c (TTail (Bind Abst) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Bind Abst) u2 t2) & - (pr3 c u1 u2) & (b:?; u:?) - (pr3 (CTail c (Bind b) u) t1 t2) - ). - Intros until 1; InsertEq H '(TTail (Bind Abst) u1 t1); - UnIntro H t1; UnIntro H u1; XElim H; Clear y x; Intros; - Rename x into u0; Rename x0 into t0. -(* case 1 : pr3_refl *) - XEAuto. -(* case 2 : pr3_sing *) - Rewrite H2 in H; Clear H0 H2 t1; Pr2GenBase. - Rewrite H0 in H1; Clear H0 t2; IH; XEAuto. - Qed. - - Theorem pr3_gen_appl: (c:?; u1,t1,x:?) - (pr3 c (TTail (Flat Appl) u1 t1) x) -> (OR - (EX u2 t2 | x = (TTail (Flat Appl) u2 t2) & - (pr3 c u1 u2) & (pr3 c t1 t2) - ) | - (EX y1 z1 u2 t2 | (pr3 c (TTail (Bind Abbr) u2 t2) x) & - (pr3 c u1 u2) & - (pr3 c t1 (TTail (Bind Abst) y1 z1)) & - (b:?; u:?) (pr3 (CTail c (Bind b) u) z1 t2) - ) | - (EX b y1 z1 z2 u2 v2 t2 | - (pr3 c (TTail (Bind b) v2 z2) x) & ~b=Abst & - (pr3 c u1 u2) & - (pr3 c t1 (TTail (Bind b) y1 z1)) & - (pr3 c y1 v2) & (pr0 z1 t2)) - ). - Intros; InsertEq H '(TTail (Flat Appl) u1 t1). - UnIntro t1 H; UnIntro u1 H. - XElim H; Clear y x; Intros; - Rename x into u0; Rename x0 into t0. -(* case 1: pr3_refl *) - XEAuto. -(* case 2: pr3_sing *) - Rewrite H2 in H; Clear H2 t1; Pr2GenBase. -(* case 2.1: short step: compatibility *) - Rewrite H3 in H1; Clear H0 H3 t2. - IH; Try (Rewrite H0; Clear H0 t3); XDEAuto 6. -(* case 2.2: short step: beta *) - Rewrite H4 in H0; Rewrite H3; Clear H1 H3 H4 t0 t2; XEAuto. -(* case 2.3: short step: upsilon *) - Rewrite H5 in H0; Rewrite H4; Clear H1 H4 H5 t0 t2; XEAuto. - Qed. - - Theorem pr3_gen_cast: (c:?; u1,t1,x:?) - (pr3 c (TTail (Flat Cast) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Flat Cast) u2 t2) & - (pr3 c u1 u2) & (pr3 c t1 t2) - ) \/ - (pr3 c t1 x). - Intros; InsertEq H '(TTail (Flat Cast) u1 t1); - UnIntro H t1; UnIntro H u1; XElim H; Clear y x; Intros; - Rename x into u0; Rename x0 into t0. -(* case 1: pr3_refl *) - Rewrite H; Clear H t; XEAuto. -(* case 2: pr3_sing *) - Rewrite H2 in H; Clear H2 t1; Pr2GenBase. -(* case 2.1: short step: compatinility *) - Rewrite H3 in H1; Clear H0 H3 t2; - IH; Try Rewrite H0; XEAuto. -(* case 2.2: short step: epsilon *) - XEAuto. - Qed. - - End pr3_gen_base. - - Tactic Definition Pr3GenBase := - Match Context With - | [ H: (pr3 ?1 (TSort ?2) ?3) |- ? ] -> - LApply (pr3_gen_sort ?1 ?3 ?2); [ Clear H; Intros | XAuto ] - | [ H: (pr3 ?1 (TTail (Bind Abst) ?2 ?3) ?4) |- ? ] -> - LApply (pr3_gen_abst ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (pr3 ?1 (TTail (Flat Appl) ?2 ?3) ?4) |- ? ] -> - LApply (pr3_gen_appl ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (pr3 ?1 (TTail (Flat Cast) ?2 ?3) ?4) |- ? ] -> - LApply (pr3_gen_cast ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XDecompose H. - - Section pr3_props. (******************************************************) - - Theorem pr3_pr2: (c,t1,t2:?) (pr2 c t1 t2) -> (pr3 c t1 t2). - XEAuto. - Qed. - - Theorem pr3_t: (t2,t1,c:?) (pr3 c t1 t2) -> - (t3:?) (pr3 c t2 t3) -> (pr3 c t1 t3). - Intros until 1; XElim H; XEAuto. - Qed. - - Theorem pr3_thin_dx: (c:?; t1,t2:?) (pr3 c t1 t2) -> - (u:?; f:?) (pr3 c (TTail (Flat f) u t1) - (TTail (Flat f) u t2)). - Intros; XElim H; XEAuto. - Qed. - - Theorem pr3_tail_1: (c:?; u1,u2:?) (pr3 c u1 u2) -> - (k:?; t:?) (pr3 c (TTail k u1 t) (TTail k u2 t)). - Intros until 1; XElim H; Intros. -(* case 1: pr3_refl *) - XAuto. -(* case 2: pr3_sing *) - EApply pr3_sing; [ Apply pr2_tail_1; Apply H | XAuto ]. - Qed. - - Theorem pr3_tail_2: (c:?; u,t1,t2:?; k:?) (pr3 (CTail c k u) t1 t2) -> - (pr3 c (TTail k u t1) (TTail k u t2)). - Intros until 1; XElim H; Intros. -(* case 1: pr3_refl *) - XAuto. -(* case 2: pr3_sing *) - EApply pr3_sing; [ Apply pr2_tail_2; Apply H | XAuto ]. - Qed. - - Hints Resolve pr3_tail_1 pr3_tail_2 : ltlc. - - Theorem pr3_tail_21: (c:?; u1,u2:?) (pr3 c u1 u2) -> - (k:?; t1,t2:?) (pr3 (CTail c k u1) t1 t2) -> - (pr3 c (TTail k u1 t1) (TTail k u2 t2)). - Intros. - EApply pr3_t; [ Apply pr3_tail_2 | Apply pr3_tail_1 ]; XAuto. - Qed. - - Theorem pr3_tail_12: (c:?; u1,u2:?) (pr3 c u1 u2) -> - (k:?; t1,t2:?) (pr3 (CTail c k u2) t1 t2) -> - (pr3 c (TTail k u1 t1) (TTail k u2 t2)). - Intros. - EApply pr3_t; [ Apply pr3_tail_1 | Apply pr3_tail_2 ]; XAuto. - Qed. - - Theorem pr3_shift: (h:?; c,e:?) (drop h (0) c e) -> - (t1,t2:?) (pr3 c t1 t2) -> - (pr3 e (app c h t1) (app c h t2)). - Intros until 2; XElim H0; Clear t1 t2; Intros. -(* case 1: pr3_refl *) - XAuto. -(* case 2: pr3_sing *) - XEAuto. - Qed. - - Theorem pr3_pr1: (t1,t2:?) (pr1 t1 t2) -> (c:?) (pr3 c t1 t2). - Intros until 1; XElim H; XEAuto. - Qed. - - End pr3_props. - - Hints Resolve pr3_pr2 pr3_t pr3_pr1 - pr3_thin_dx pr3_tail_12 pr3_tail_21 pr3_shift : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr3_gen.v b/helm/coq-contribs/LAMBDA-TYPES/pr3_gen.v deleted file mode 100644 index e96f49fc3..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr3_gen.v +++ /dev/null @@ -1,132 +0,0 @@ -(*#* #stop file *) - -Require pr2_gen. -Require pr3_defs. -Require pr3_props. - - Section pr3_gen_lift. (***************************************************) - -(*#* #caption "generation lemma for lift" *) -(*#* #cap #cap c #alpha e in D, t1 in U1, t2 in U2, x in T, d in i *) - - Theorem pr3_gen_lift: (c:?; t1,x:?; h,d:?) (pr3 c (lift h d t1) x) -> - (e:?) (drop h d c e) -> - (EX t2 | x = (lift h d t2) & (pr3 e t1 t2)). - Intros until 1; InsertEq H '(lift h d t1); - UnIntro H t1; XElim H; Clear y x; Intros; Rename x into t4. -(* case 1 : pr3_refl *) - XEAuto. -(* case 2 : pr3_sing *) - Rewrite H2 in H; Pr2Gen. - LApply (H1 x); [ Clear H1; Intros H1 | XAuto ]. - LApply (H1 e); [ Clear H1; Intros H1 | XAuto ]. - XElim H1; XEAuto. - Qed. - - End pr3_gen_lift. - - Section pr3_gen_lref. (***************************************************) - - Theorem pr3_gen_lref: (c:?; x:?; n:?) (pr3 c (TLRef n) x) -> - x = (TLRef n) \/ - (EX d u v | (drop n (0) c (CTail d (Bind Abbr) u)) & - (pr3 d u v) & - x = (lift (S n) (0) v) - ). - Intros; InsertEq H '(TLRef n); XElim H; Clear y x; Intros. -(* case 1: pr3_refl *) - XAuto. -(* case 2: pr3_sing *) - Rewrite H2 in H; Clear H2 t1; Pr2GenBase. -(* case 2.1: pr2_free *) - XAuto. -(* case 2.2: pr2_delta *) - Rewrite H4 in H0; Clear H1 H4 t2. - LApply (pr3_gen_lift c x1 t3 (S n) (0)); [ Clear H0; Intros | XAuto ]. - LApply (H x0); [ Clear H; Intros | XEAuto ]. - XElim H; XEAuto. - Qed. - - End pr3_gen_lref. - - Section pr3_gen_bind. (***************************************************) - - Tactic Definition IH := - Match Context With - | [ H: (u,t:T) (TTail (Bind Void) ?1 ?2) = (TTail (Bind Void) u t) -> ? |- ? ] -> - LApply (H ?1 ?2); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (u,t:T) (TTail (Bind Abbr) ?1 ?2) = (TTail (Bind Abbr) u t) -> ? |- ? ] -> - LApply (H ?1 ?2); [ Clear H; Intros H | XAuto ]; - XDecompose H. - - Theorem pr3_gen_void: (c:?; u1,t1,x:?) (pr3 c (TTail (Bind Void) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Bind Void) u2 t2) & - (pr3 c u1 u2) & (b:?; u:?) - (pr3 (CTail c (Bind b) u) t1 t2) - ) \/ - (pr3 (CTail c (Bind Void) u1) t1 (lift (1) (0) x)). - Intros until 1; InsertEq H '(TTail (Bind Void) u1 t1); - UnIntro t1 H; UnIntro u1 H; XElim H; Intros. -(* case 1 : pr3_refl *) - Rewrite H; XEAuto. -(* case 2 : pr3_sing *) - Rewrite H2 in H; Clear H2 t0; Pr2Gen. -(* case 2.1 : short step: compatibility *) - Rewrite H3 in H1; Clear H0 H3 t2. - IH; Try Pr3Context; Try Rewrite H2; XEAuto. -(* case 2.2 : short step: zeta *) - XEAuto. - Qed. - - Theorem pr3_gen_abbr: (c:?; u1,t1,x:?) (pr3 c (TTail (Bind Abbr) u1 t1) x) -> - (EX u2 t2 | x = (TTail (Bind Abbr) u2 t2) & - (pr3 c u1 u2) & - (pr3 (CTail c (Bind Abbr) u1) t1 t2) - ) \/ - (pr3 (CTail c (Bind Abbr) u1) t1 (lift (1) (0) x)). - Intros until 1; InsertEq H '(TTail (Bind Abbr) u1 t1); - UnIntro H t1; UnIntro H u1; XElim H; Clear y x; Intros; - Rename x into u1; Rename x0 into t4. -(* case 1: pr3_refl *) - Rewrite H; XEAuto. -(* case 2: pr3_sing *) - Rewrite H2 in H; Clear H2 t1; Pr2Gen. -(* case 2.1: short step: compatibility *) - Rewrite H3 in H1; Clear H0 H3 t2. - IH; Repeat Pr3Context; - Try (Rewrite H0; Clear H0 t3; Left; EApply ex3_2_intro); - XEAuto. -(* case 2.2: short step: beta *) - Rewrite H3 in H1; Clear H0 H3 t1. - IH; Repeat Pr3Context; - Try (Rewrite H0; Clear H0 t3; Left; EApply ex3_2_intro); - XEAuto. -(* case 2.3: short step: delta *) - Rewrite H3 in H1; Clear H0 H3 t2. - IH; Repeat Pr3Context; - Try (Rewrite H0; Clear H0 t3; Left; EApply ex3_2_intro); - XDEAuto 7. -(* case 2.4: short step: zeta *) - XEAuto. - Qed. - - End pr3_gen_bind. - - Tactic Definition Pr3Gen := - Match Context With - | [ H: (pr3 ?1 (TLRef ?2) ?3) |- ? ] -> - LApply (pr3_gen_lref ?1 ?3 ?2); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (pr3 ?1 (TTail (Bind Void) ?2 ?3) ?4) |- ? ] -> - LApply (pr3_gen_void ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H: (pr3 ?1 (TTail (Bind Abbr) ?2 ?3) ?4) |- ? ] -> - LApply (pr3_gen_abbr ?1 ?2 ?3 ?4); [ Clear H; Intros H | XAuto ]; - XDecompose H - | [ H0: (pr3 ?1 (lift ?2 ?3 ?4) ?5); - H1: (drop ?2 ?3 ?1 ?6) |- ? ] -> - LApply (pr3_gen_lift ?1 ?4 ?5 ?2 ?3); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?6); [ Clear H0; Intros H0 | XAuto ]; - XDecompose H0 - | _ -> Pr3GenBase. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr3_gen_context.v b/helm/coq-contribs/LAMBDA-TYPES/pr3_gen_context.v deleted file mode 100644 index a7f3e92be..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr3_gen_context.v +++ /dev/null @@ -1,42 +0,0 @@ -(*#* #stop file *) - -Require csubst1_defs. -Require pr2_gen_context. -Require pr3_defs. - - Section pr3_gen_context. (************************************************) - - Theorem pr3_gen_cabbr: (c:?; t1,t2:?) (pr3 c t1 t2) -> (e:?; u:?; d:?) - (drop d (0) c (CTail e (Bind Abbr) u)) -> - (a0:?) (csubst1 d u c a0) -> - (a:?) (drop (1) d a0 a) -> - (x1:?) (subst1 d u t1 (lift (1) d x1)) -> - (EX x2 | (subst1 d u t2 (lift (1) d x2)) & - (pr3 a x1 x2) - ). - Intros until 1; XElim H; Intros. -(* case 1: pr3_refl *) - XEAuto. -(* case 1: pr3_refl *) - Pr2GenContext. - LApply (H1 e u d); [ Clear H1; Intros H1 | XAuto ]. - LApply (H1 a0); [ Clear H1; Intros H1 | XAuto ]. - LApply (H1 a); [ Clear H1; Intros H1 | XAuto ]. - LApply (H1 x); [ Clear H1; Intros H1 | XAuto ]. - XElim H1; XEAuto. - Qed. - - End pr3_gen_context. - - Tactic Definition Pr3GenContext := - Match Context With - | [ H0: (pr3 ?1 ?2 ?3); H1: (drop ?4 (0) ?1 (CTail ?5 (Bind Abbr) ?6)); - H2: (csubst1 ?4 ?6 ?1 ?7); H3: (drop (1) ?4 ?7 ?8); - H4: (subst1 ?4 ?6 ?2 (lift (1) ?4 ?9)) |- ? ] -> - LApply (pr3_gen_cabbr ?1 ?2 ?3); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?5 ?6 ?4); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?7); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?8); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?9); [ Clear H0 H4; Intros H0 | XAuto ]; - XElim H0; Intros - | _ -> Pr2GenContext. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr3_props.v b/helm/coq-contribs/LAMBDA-TYPES/pr3_props.v deleted file mode 100644 index b5c7df937..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr3_props.v +++ /dev/null @@ -1,127 +0,0 @@ -Require subst0_subst0. -Require pr0_subst0. -Require cpr0_defs. -Require pr2_lift. -Require pr2_gen. -Require pr3_defs. - -(*#* #caption "main properties of the relation $\\PrT{}{}{}$" *) -(*#* #clauses *) - -(*#* #stop file *) - - Section pr3_context. (****************************************************) - - Theorem pr3_pr0_pr2_t: (u1,u2:?) (pr0 u1 u2) -> - (c:?; t1,t2:?; k:?) (pr2 (CTail c k u2) t1 t2) -> - (pr3 (CTail c k u1) t1 t2). - Intros; Inversion H0; Clear H0; XAuto. - NewInduction i. -(* case 1 : pr2_delta i = 0 *) - DropGenBase; Inversion H0; Clear H0 H4 H5 H6 c k t. - Rewrite H7 in H; Clear H7 u2. - Pr0Subst0; XEAuto. -(* case 2 : pr2_delta i > 0 *) - NewInduction k; DropGenBase; XEAuto. - Qed. - - Theorem pr3_pr2_pr2_t: (c:?; u1,u2:?) (pr2 c u1 u2) -> - (t1,t2:?; k:?) (pr2 (CTail c k u2) t1 t2) -> - (pr3 (CTail c k u1) t1 t2). - Intros until 1; Inversion H; Clear H; Intros. -(* case 1 : pr2_free *) - EApply pr3_pr0_pr2_t; [ Apply H0 | XAuto ]. -(* case 2 : pr2_delta *) - Inversion H; [ XAuto | NewInduction i0 ]. -(* case 2.1 : i0 = 0 *) - DropGenBase; Inversion H4; Clear H3 H4 H7 t t4. - Rewrite <- H9; Rewrite H10 in H; Rewrite <- H11 in H6; Clear H9 H10 H11 d0 k u0. - Subst0Subst0; Arith9'In H4 i; Clear H2 H H6 u2. - Pr0Subst0; Apply pr3_sing with t2:=x0; XEAuto. -(* case 2.2 : i0 > 0 *) - Clear IHi0; NewInduction k; DropGenBase; XEAuto. - Qed. - - Theorem pr3_pr2_pr3_t: (c:?; u2,t1,t2:?; k:?) - (pr3 (CTail c k u2) t1 t2) -> - (u1:?) (pr2 c u1 u2) -> - (pr3 (CTail c k u1) t1 t2). - Intros until 1; XElim H; Intros. -(* case 1 : pr3_refl *) - XAuto. -(* case 2 : pr3_sing *) - EApply pr3_t. - EApply pr3_pr2_pr2_t; [ Apply H2 | Apply H ]. - XAuto. - Qed. - -(*#* #caption "reduction inside context items" *) -(*#* #cap #cap t1, t2 #alpha c in E, u1 in V1, u2 in V2, k in z *) - - Theorem pr3_pr3_pr3_t: (c:?; u1,u2:?) (pr3 c u1 u2) -> - (t1,t2:?; k:?) (pr3 (CTail c k u2) t1 t2) -> - (pr3 (CTail c k u1) t1 t2). - Intros until 1; XElim H; Intros. -(* case 1 : pr3_refl *) - XAuto. -(* case 2 : pr3_sing *) - EApply pr3_pr2_pr3_t; [ Apply H1; XAuto | XAuto ]. - Qed. - - End pr3_context. - - Tactic Definition Pr3Context := - Match Context With - | [ H1: (pr0 ?2 ?3); H2: (pr2 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> - LApply (pr3_pr0_pr2_t ?2 ?3); [ Intros H_x | XAuto ]; - LApply (H_x ?1 ?5 ?6 ?4); [ Clear H_x H2; Intros | XAuto ] - | [ H1: (pr0 ?2 ?3); H2: (pr3 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> - LApply (pr3_pr2_pr3_t ?1 ?3 ?5 ?6 ?4); [ Clear H2; Intros H2 | XAuto ]; - LApply (H2 ?2); [ Clear H2; Intros | XAuto ] - | [ H1: (pr2 ?1 ?2 ?3); H2: (pr2 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> - LApply (pr3_pr2_pr2_t ?1 ?2 ?3); [ Intros H_x | XAuto ]; - LApply (H_x ?5 ?6 ?4); [ Clear H_x H2; Intros | XAuto ] - | [ H1: (pr2 ?1 ?2 ?3); H2: (pr3 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> - LApply (pr3_pr2_pr3_t ?1 ?3 ?5 ?6 ?4); [ Clear H2; Intros H2 | XAuto ]; - LApply (H2 ?2); [ Clear H2; Intros | XAuto ] - | [ H1: (pr3 ?1 ?2 ?3); H2: (pr3 (CTail ?1 ?4 ?3) ?5 ?6) |- ? ] -> - LApply (pr3_pr3_pr3_t ?1 ?2 ?3); [ Intros H_x | XAuto ]; - LApply (H_x ?5 ?6 ?4); [ Clear H_x H2; Intros | XAuto ]. - - Section pr3_lift. (*******************************************************) - -(*#* #caption "conguence with lift" *) -(*#* #cap #cap c, t1, t2 #alpha e in D, d in i *) - - Theorem pr3_lift: (c,e:?; h,d:?) (drop h d c e) -> - (t1,t2:?) (pr3 e t1 t2) -> - (pr3 c (lift h d t1) (lift h d t2)). - Intros until 2; XElim H0; Intros; XEAuto. - Qed. - - End pr3_lift. - - Hints Resolve pr3_lift : ltlc. - - Section pr3_cpr0. (*******************************************************) - - Theorem pr3_cpr0_t: (c1,c2:?) (cpr0 c2 c1) -> (t1,t2:?) (pr3 c1 t1 t2) -> - (pr3 c2 t1 t2). - Intros until 1; XElim H; Intros. -(* case 1 : cpr0_refl *) - XAuto. -(* case 2 : cpr0_comp *) - Pr3Context; Clear H1. - XElim H2; Intros. -(* case 2.1 : pr3_refl *) - XAuto. -(* case 2.2 : pr3_sing *) - EApply pr3_t; [ Idtac | XEAuto ]. Clear H2 H3 c1 c2 t1 t2 t4 u2. - Inversion_clear H1. -(* case 2.2.1 : pr2_free *) - XAuto. -(* case 2.2.1 : pr2_delta *) - Cpr0Drop; Pr0Subst0; Apply pr3_sing with t2:=x; XEAuto. - Qed. - - End pr3_cpr0. diff --git a/helm/coq-contribs/LAMBDA-TYPES/pr3_subst1.v b/helm/coq-contribs/LAMBDA-TYPES/pr3_subst1.v deleted file mode 100644 index 3db6ce000..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/pr3_subst1.v +++ /dev/null @@ -1,32 +0,0 @@ -(*#* #stop file *) - -Require subst1_defs. -Require pr2_subst1. -Require pr3_defs. - - Section pr3_subst1_props. (***********************************************) - - Theorem pr3_subst1: (c,e:?; v:?; i:?) (drop i (0) c (CTail e (Bind Abbr) v)) -> - (t1,t2:?) (pr3 c t1 t2) -> - (w1:?) (subst1 i v t1 w1) -> - (EX w2 | (pr3 c w1 w2) & (subst1 i v t2 w2)). - Intros until 2; XElim H0; Clear t1 t2; Intros. -(* case 1: pr3_refl *) - XEAuto. -(* case 2: pr3_single *) - Pr2Subst1. - LApply (H2 x); [ Clear H2; Intros H2 | XAuto ]. - XElim H2; XEAuto. - Qed. - - End pr3_subst1_props. - - Tactic Definition Pr3Subst1 := - Match Context With - | [ H0: (drop ?1 (0) ?2 (CTail ?3 (Bind Abbr) ?4)); - H1: (pr3 ?2 ?5 ?6); H3: (subst1 ?1 ?4 ?5 ?7) |- ? ] -> - LApply (pr3_subst1 ?2 ?3 ?4 ?1); [ Intros H_x | XAuto ]; - LApply (H_x ?5 ?6); [ Clear H_x H1; Intros H1 | XAuto ]; - LApply (H1 ?7); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; Intros - | _ -> Pr2Subst1. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst0_confluence.v b/helm/coq-contribs/LAMBDA-TYPES/subst0_confluence.v deleted file mode 100644 index bbbfdc469..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst0_confluence.v +++ /dev/null @@ -1,80 +0,0 @@ -(*#* #stop file *) - -Require lift_gen. -Require subst0_gen. -Require subst0_defs. - - Section subst0_confluence. (**********************************************) - - Tactic Definition IH := - Match Context With - | [ H1: (t2,u2:?; i2:?) (subst0 i2 u2 ?1 t2) -> ~?2=i2 -> ?; - H2: (subst0 ?3 ?4 ?1 ?5); H3: ~?2=?3 |- ? ] -> - LApply (H1 ?5 ?4 ?3); [ Clear H1; Intros H1 | XAuto ]; - LApply H1; [ Clear H1; Intros H1 | XAuto ]; - XElim H1; Intros - | [ H1: (t2,u2:?; i2:?) (subst0 i2 u2 ?1 t2) -> ~(s k ?2)=i2 -> ?; - H2: (subst0 (s k ?3) ?4 ?1 ?5); H3: ~?2=?3 |- ? ] -> - LApply (H1 ?5 ?4 (s k ?3)); [ Clear H1; Intros H1 | XAuto ]; - LApply H1; [ Clear H1; Intros H1 | Unfold not in H3; Unfold not; XEAuto ]; - XElim H1; Intros - | [ H1: (t2:T) (subst0 ?1 ?2 ?3 t2) -> ?; H2: (subst0 ?1 ?2 ?3 ?4) |- ? ] -> - LApply (H1 ?4); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; Intros H1; [ Try Rewrite H1 | XElim H1; Intros | Idtac | Idtac ]. - - Theorem subst0_confluence_neq : (t0,t1,u1:?; i1:?) (subst0 i1 u1 t0 t1) -> - (t2,u2:?; i2:?) (subst0 i2 u2 t0 t2) -> - ~i1=i2 -> - (EX t | (subst0 i2 u2 t1 t) & - (subst0 i1 u1 t2 t)). - - Intros until 1; XElim H; Intros; - Subst0GenBase; Try Rewrite H in H0; Try Rewrite H1; Try Rewrite H3; - Try EqFalse; Repeat IH; XEAuto. - Qed. - - Theorem subst0_confluence_eq : (t0,t1,u:?; i:?) (subst0 i u t0 t1) -> - (t2:?) (subst0 i u t0 t2) -> (OR - t1 = t2 | - (EX t | (subst0 i u t1 t) & (subst0 i u t2 t)) | - (subst0 i u t1 t2) | - (subst0 i u t2 t1)). - Intros until 1; XElim H; Intros; - Subst0GenBase; Try Rewrite H1; Try Rewrite H3; - Repeat IH; XEAuto. - Qed. - - End subst0_confluence. - - Tactic Definition Subst0Confluence := - Match Context With - | [ H0: (subst0 ?1 ?2 ?3 ?4); - H1: (subst0 ?1 ?2 ?3 ?5) |- ? ] -> - LApply (subst0_confluence_eq ?3 ?4 ?2 ?1); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?5); [ Clear H0; Intros H0 | XAuto ]; - XElim H0; [ Intros | Intros H0; XElim H0; Intros | Intros | Intros ] - | [ H0: (subst0 ?1 ?2 ?3 ?4); - H1: (subst0 ?5 ?6 ?3 ?7) |- ? ] -> - LApply (subst0_confluence_neq ?3 ?4 ?2 ?1); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?7 ?6 ?5); [ Clear H0 H1; Intros H0 | XAuto ]; - LApply H0; [ Clear H0; Intros H0 | Simpl; XAuto ]; - XElim H0; Intros. - - Section subst0_confluence_lift. (*****************************************) - - Theorem subst0_confluence_lift: (t0,t1,u:?; i:?) (subst0 i u t0 (lift (1) i t1)) -> - (t2:?) (subst0 i u t0 (lift (1) i t2)) -> - t1 = t2. - Intros; Subst0Confluence; - Try Subst0Gen; SymEqual; LiftGen; XEAuto. - Qed. - - End subst0_confluence_lift. - - Tactic Definition Subst0ConfluenceLift := - Match Context With - | [ H0: (subst0 ?1 ?2 ?3 (lift (1) ?1 ?4)); - H1: (subst0 ?1 ?2 ?3 (lift (1) ?1 ?5)) |- ? ] -> - LApply (subst0_confluence_lift ?3 ?4 ?2 ?1); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?5); [ Clear H0; Intros | XAuto ] - | _ -> Subst0Confluence. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst0_defs.v b/helm/coq-contribs/LAMBDA-TYPES/subst0_defs.v deleted file mode 100644 index d99a405db..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst0_defs.v +++ /dev/null @@ -1,62 +0,0 @@ -Require Export lift_defs. - -(*#* #caption "axioms for strict substitution in terms", - "substituted local reference", - "substituted tail item: first operand", - "substituted tail item: second operand", - "substituted tail item: both operands" -*) -(*#* #cap #cap t, t1, t2 #alpha v in W, u in V, u1 in V1, u2 in V2, k in z, s in p *) - - Inductive subst0 : nat -> T -> T -> T -> Prop := - | subst0_lref: (v:?; i:?) (subst0 i v (TLRef i) (lift (S i) (0) v)) - | subst0_fst : (v,u2,u1:?; i:?) (subst0 i v u1 u2) -> - (t:?; k:?) (subst0 i v (TTail k u1 t) (TTail k u2 t)) - | subst0_snd : (k:?; v,t2,t1:?; i:?) (subst0 (s k i) v t1 t2) -> (u:?) - (subst0 i v (TTail k u t1) (TTail k u t2)) - | subst0_both: (v,u1,u2:?; i:?) (subst0 i v u1 u2) -> - (k:?; t1,t2:?) (subst0 (s k i) v t1 t2) -> - (subst0 i v (TTail k u1 t1) (TTail k u2 t2)). - -(*#* #stop file *) - - Hint subst0 : ltlc := Constructors subst0. - - Section subst0_gen_base. (************************************************) - - Theorem subst0_gen_sort : (v,x:?; i,n:?) (subst0 i v (TSort n) x) -> - (P:Prop) P. - Intros; Inversion H. - Qed. - - Theorem subst0_gen_lref : (v,x:?; i,n:?) (subst0 i v (TLRef n) x) -> - n = i /\ x = (lift (S n) (0) v). - Intros; Inversion H; XAuto. - Qed. - - Theorem subst0_gen_tail : (k:?; v,u1,t1,x:?; i:?) - (subst0 i v (TTail k u1 t1) x) -> (OR - (EX u2 | x = (TTail k u2 t1) & - (subst0 i v u1 u2)) | - (EX t2 | x = (TTail k u1 t2) & - (subst0 (s k i) v t1 t2)) | - (EX u2 t2 | x = (TTail k u2 t2) & - (subst0 i v u1 u2) & - (subst0 (s k i) v t1 t2)) - ). - - Intros; Inversion H; XEAuto. - Qed. - - End subst0_gen_base. - - Tactic Definition Subst0GenBase := - Match Context With - | [ H: (subst0 ?1 ?2 (TSort ?3) ?4) |- ? ] -> - Apply (subst0_gen_sort ?2 ?4 ?1 ?3); Apply H - | [ H: (subst0 ?1 ?2 (TLRef ?3) ?4) |- ? ] -> - LApply (subst0_gen_lref ?2 ?4 ?1 ?3); [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (subst0 ?1 ?2 (TTail ?3 ?4 ?5) ?6) |- ? ] -> - LApply (subst0_gen_tail ?3 ?2 ?4 ?5 ?6 ?1); [ Clear H; Intros H | XAuto ]; - XElim H; Intros H; XElim H; Intros. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst0_gen.v b/helm/coq-contribs/LAMBDA-TYPES/subst0_gen.v deleted file mode 100644 index d46ca3555..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst0_gen.v +++ /dev/null @@ -1,130 +0,0 @@ -(*#* #stop file *) - -Require lift_props. -Require subst0_defs. - - Section subst0_gen_lift_lt. (*********************************************) - - Tactic Definition IH := - Match Context With - [ H1: (x:T; i,h,d:nat) (subst0 i (lift h d ?1) (lift h (S (plus i d)) ?2) x) -> ?; - H2: (subst0 ?3 (lift ?4 ?5 ?1) (lift ?4 (S (plus ?3 ?5)) ?2) ?6) |- ? ] -> - LApply (H1 ?6 ?3 ?4 ?5); [ Clear H1 H2; Intros H1 | XAuto ]; - XElim H1; Intros. - - Theorem subst0_gen_lift_lt : (u,t1,x:?; i,h,d:?) (subst0 i (lift h d u) (lift h (S (plus i d)) t1) x) -> - (EX t2 | x = (lift h (S (plus i d)) t2) & (subst0 i u t1 t2)). - XElim t1; Intros. -(* case 1: TSort *) - Rewrite lift_sort in H; Subst0GenBase. -(* case 2: TLRef n *) - Apply (lt_le_e n (S (plus i d))); Intros. -(* case 2.1: n < 1 + i + d *) - Rewrite lift_lref_lt in H; [ Idtac | XAuto ]. - Subst0GenBase; Rewrite H1; Rewrite H. - Rewrite <- lift_d; Simpl; XEAuto. -(* case 2.2: n >= 1 + i + d *) - Rewrite lift_lref_ge in H; [ Idtac | XAuto ]. - Subst0GenBase; Rewrite <- H in H0. - EApply le_false; [ Idtac | Apply H0 ]; XAuto. -(* case 3: TTail k *) - Rewrite lift_tail in H1; Subst0GenBase; Rewrite H1; Clear H1 x. -(* case 3.1: subst0_fst *) - IH; Rewrite H; Rewrite <- lift_tail; XEAuto. -(* case 3.2: subst0_snd *) - SRwIn H2; IH; Rewrite H0; SRwBack; Rewrite <- lift_tail; XEAuto. -(* case 3.2: subst0_snd *) - SRwIn H3; Repeat IH; Rewrite H; Rewrite H0; SRwBack; - Rewrite <- lift_tail; XEAuto. - Qed. - - End subst0_gen_lift_lt. - - Section subst0_gen_lift_false. (******************************************) - - Theorem subst0_gen_lift_false : (t,u,x:?; h,d,i:?) - (le d i) -> (lt i (plus d h)) -> - (subst0 i u (lift h d t) x) -> - (P:Prop) P. - XElim t; Intros. -(* case 1: TSort *) - Rewrite lift_sort in H1; Subst0GenBase. -(* case 2: TLRef n *) - Apply (lt_le_e n d); Intros. -(* case 2.1: n < d *) - Rewrite lift_lref_lt in H1; [ Idtac | XAuto ]. - Subst0GenBase; Rewrite H1 in H2. - EApply le_false; [ Apply H | XAuto ]. -(* case 2.2: n >= d *) - Rewrite lift_lref_ge in H1; [ Idtac | XAuto ]. - Subst0GenBase; Rewrite <- H1 in H0. - EApply le_false; [ Apply H2 | XEAuto ]. -(* case 3: TTail k *) - Rewrite lift_tail in H3; Subst0GenBase. -(* case 3.1: subst0_fst *) - EApply H; XEAuto. -(* case 3.2: subst0_snd *) - EApply H0; [ Idtac | Idtac | XEAuto ]; [ Idtac | SRwBack ]; XAuto. -(* case 3.3: subst0_both *) - EApply H; XEAuto. - Qed. - - End subst0_gen_lift_false. - - Section subst0_gen_lift_ge. (*********************************************) - - Tactic Definition IH := - Match Context With - [ H1: (x:?; i,h,d:?) (subst0 i ?1 (lift h d ?2) x) -> ?; - H2: (subst0 ?3 ?1 (lift ?4 ?5 ?2) ?6) |- ? ] -> - LApply (H1 ?6 ?3 ?4 ?5); [ Clear H1 H2; Intros H1 | XAuto ]; - LApply H1; [ Clear H1; Intros H1 | SRwBack; XAuto ]; - XElim H1; Intros. - - Theorem subst0_gen_lift_ge : (u,t1,x:?; i,h,d:?) (subst0 i u (lift h d t1) x) -> - (le (plus d h) i) -> - (EX t2 | x = (lift h d t2) & (subst0 (minus i h) u t1 t2)). - XElim t1; Intros. -(* case 1: TSort *) - Rewrite lift_sort in H; Subst0GenBase. -(* case 2: TLRef n *) - Apply (lt_le_e n d); Intros. -(* case 2.1: n < d *) - Rewrite lift_lref_lt in H; [ Idtac | XAuto ]. - Subst0GenBase; Rewrite H in H1. - EApply le_false; [ Apply H0 | XAuto ]. -(* case 2.2: n >= d *) - Rewrite lift_lref_ge in H; [ Idtac | XAuto ]. - Subst0GenBase; Rewrite <- H; Rewrite H2. - Rewrite minus_plus_r. - EApply ex2_intro; [ Idtac | XAuto ]. - Rewrite lift_free; [ Idtac | XEAuto (**) | XAuto ]. - Rewrite plus_sym; Rewrite plus_n_Sm; XAuto. -(* case 3: TTail k *) - Rewrite lift_tail in H1; Subst0GenBase; Rewrite H1; Clear H1 x; - Repeat IH; Try Rewrite H; Try Rewrite H0; - Rewrite <- lift_tail; Try Rewrite <- s_minus in H1; XEAuto. - Qed. - - End subst0_gen_lift_ge. - - Tactic Definition Subst0Gen := - Match Context With - | [ H: (subst0 ?0 (lift ?1 ?2 ?3) (lift ?1 (S (plus ?0 ?2)) ?4) ?5) |- ? ] -> - LApply (subst0_gen_lift_lt ?3 ?4 ?5 ?0 ?1 ?2); [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (subst0 ?0 ?1 (lift (1) ?0 ?2) ?3) |- ? ] -> - LApply (subst0_gen_lift_false ?2 ?1 ?3 (1) ?0 ?0); [ Intros H_x | XAuto ]; - LApply H_x; [ Clear H_x; Intros H_x | Rewrite plus_sym; XAuto ]; - LApply H_x; [ Clear H H_x; Intros H | XAuto ]; - Apply H - | [ _: (le ?1 ?2); _: (lt ?2 (plus ?1 ?3)); - _: (subst0 ?2 ?4 (lift ?3 ?1 ?5) ?6) |- ? ] -> - Apply (subst0_gen_lift_false ?5 ?4 ?6 ?3 ?1 ?2); XAuto - | [ _: (subst0 ?1 ?2 (lift (S ?1) (0) ?3) ?4) |- ? ] -> - Apply (subst0_gen_lift_false ?3 ?2 ?4 (S ?1) (0) ?1); XAuto - | [ H: (subst0 ?0 ?1 (lift ?2 ?3 ?4) ?5) |- ? ] -> - LApply (subst0_gen_lift_ge ?1 ?4 ?5 ?0 ?2 ?3); [ Clear H; Intros H | XAuto ]; - LApply H; [ Clear H; Intros H | Simpl; XAuto ]; - XElim H; Intros - | _ -> Subst0GenBase. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst0_lift.v b/helm/coq-contribs/LAMBDA-TYPES/subst0_lift.v deleted file mode 100644 index caabbe0b7..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst0_lift.v +++ /dev/null @@ -1,56 +0,0 @@ -(*#* #stop file *) - -Require lift_props. -Require subst0_defs. - - Section subst0_lift. (****************************************************) - - Theorem subst0_lift_lt: (t1,t2,u:?; i:?) (subst0 i u t1 t2) -> - (d:?) (lt i d) -> (h:?) - (subst0 i (lift h (minus d (S i)) u) (lift h d t1) (lift h d t2)). - Intros until 1; XElim H; Intros. -(* case 1: subst0_lref *) - Rewrite lift_lref_lt; [ Idtac | XAuto ]. - LetTac w := (minus d (S i0)). - Arith8 d '(S i0); Rewrite lift_d; XAuto. -(* case 2: subst0_fst *) - LiftTailRw; XAuto. -(* case 3: subst0_snd *) - SRwBackIn H0; LiftTailRw; Rewrite <- (minus_s_s k); XAuto. -(* case 4: subst0_both *) - SRwBackIn H2; LiftTailRw. - Apply subst0_both; [ Idtac | Rewrite <- (minus_s_s k) ]; XAuto. - Qed. - - Theorem subst0_lift_ge: (t1,t2,u:?; i,h:?) (subst0 i u t1 t2) -> - (d:?) (le d i) -> - (subst0 (plus i h) u (lift h d t1) (lift h d t2)). - Intros until 1; XElim H; Intros. -(* case 1: subst0_lref *) - Rewrite lift_lref_ge; [ Idtac | XAuto ]. - Rewrite lift_free; [ Idtac | Simpl; XAuto | XAuto ]. - Arith5'c h i0; XAuto. -(* case 2: subst0_fst *) - LiftTailRw; XAuto. -(* case 3: subst0_snd *) - SRwBackIn H0; LiftTailRw; XAuto. -(* case 4: subst0_snd *) - SRwBackIn H2; LiftTailRw; XAuto. - Qed. - - Theorem subst0_lift_ge_S: (t1,t2,u:?; i:?) (subst0 i u t1 t2) -> - (d:?) (le d i) -> - (subst0 (S i) u (lift (1) d t1) (lift (1) d t2)). - Intros; Arith7 i; Apply subst0_lift_ge; XAuto. - Qed. - - Theorem subst0_lift_ge_s: (t1,t2,u:?; i:?) (subst0 i u t1 t2) -> - (d:?) (le d i) -> (b:?) - (subst0 (s (Bind b) i) u (lift (1) d t1) (lift (1) d t2)). - Intros; Simpl; Apply subst0_lift_ge_S; XAuto. - Qed. - - End subst0_lift. - - Hints Resolve subst0_lift_lt subst0_lift_ge - subst0_lift_ge_S subst0_lift_ge_s : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst0_subst0.v b/helm/coq-contribs/LAMBDA-TYPES/subst0_subst0.v deleted file mode 100644 index 9f9b6da86..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst0_subst0.v +++ /dev/null @@ -1,68 +0,0 @@ -(*#* #stop file *) - -Require subst0_defs. -Require subst0_gen. -Require subst0_lift. - - Section subst0_subst0. (**************************************************) - - Tactic Definition IH := - Match Context With - | [ H1: (u1,u:?; i:?) (subst0 i u u1 ?1) -> ?; - H2: (subst0 ?2 ?3 ?4 ?1) |- ? ] -> - LApply (H1 ?4 ?3 ?2); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; Intros - | [ H1: (u1,u:?; i:?) (subst0 i u ?1 u1) -> ?; - H2: (subst0 ?2 ?3 ?1 ?4) |- ? ] -> - LApply (H1 ?4 ?3 ?2); [ Clear H1; Intros H1 | XAuto ]; - XElim H1; Intros. - - Theorem subst0_subst0: (t1,t2,u2:?; j:?) (subst0 j u2 t1 t2) -> - (u1,u:?; i:?) (subst0 i u u1 u2) -> - (EX t | (subst0 j u1 t1 t) & (subst0 (S (plus i j)) u t t2)). - Intros until 1; XElim H; Intros. -(* case 1 : subst0_lref *) - Arith5 i0 i; XEAuto. -(* case 2 : subst0_fst *) - IH; XEAuto. -(* case 3 : subst0_snd *) - IH; SRwBackIn H2; XEAuto. -(* case 4 : subst0_both *) - Repeat IH; SRwBackIn H4; XEAuto. - Qed. - - Theorem subst0_subst0_back: (t1,t2,u2:?; j:?) (subst0 j u2 t1 t2) -> - (u1,u:?; i:?) (subst0 i u u2 u1) -> - (EX t | (subst0 j u1 t1 t) & (subst0 (S (plus i j)) u t2 t)). - Intros until 1; XElim H; Intros. -(* case 1 : subst0_lref *) - Arith5 i0 i; XEAuto. -(* case 2 : subst0_fst *) - IH; XEAuto. -(* case 3 : subst0_snd *) - IH; SRwBackIn H2; XEAuto. -(* case 4 : subst0_both *) - Repeat IH; SRwBackIn H4; XEAuto. - Qed. - - Theorem subst0_trans: (t2,t1,v:?; i:?) (subst0 i v t1 t2) -> - (t3:?) (subst0 i v t2 t3) -> - (subst0 i v t1 t3). - Intros until 1; XElim H; Intros; - Subst0Gen; Try Rewrite H1; Try Rewrite H3; XAuto. - Qed. - - End subst0_subst0. - - Hints Resolve subst0_trans : ltlc. - - Tactic Definition Subst0Subst0 := - Match Context With - | [ H1: (subst0 ?0 ?1 ?2 ?3); H2: (subst0 ?4 ?5 ?6 ?1) |- ? ] -> - LApply (subst0_subst0 ?2 ?3 ?1 ?0); [ Intros H_x | XAuto ]; - LApply (H_x ?6 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros - | [ H1: (subst0 ?0 ?1 ?2 ?3); H2: (subst0 ?4 ?5 ?1 ?6) |- ? ] -> - LApply (subst0_subst0_back ?2 ?3 ?1 ?0); [ Intros H_x | XAuto ]; - LApply (H_x ?6 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst0_tlt.v b/helm/coq-contribs/LAMBDA-TYPES/subst0_tlt.v deleted file mode 100644 index b5fef207b..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst0_tlt.v +++ /dev/null @@ -1,62 +0,0 @@ -(*#* #stop file *) - -Require tlt_defs. -Require lift_tlt. -Require subst0_defs. - - Section subst0_tlt_props. (***********************************************) - - Theorem subst0_weight_le : (u,t,z:?; d:?) (subst0 d u t z) -> - (f,g:?) ((m:?) (le (f m) (g m))) -> - (lt (weight_map f (lift (S d) (0) u)) (g d)) -> - (le (weight_map f z) (weight_map g t)). - Intros until 1; XElim H. -(* case 1: subst0_lref *) - Intros; XAuto. -(* case 2: subst0_fst *) - XElim k; [ XElim b | Idtac ]; Simpl; [ Auto 7 with ltlc (**) | XAuto | XAuto | XAuto ]. -(* case 3: subst0_snd *) - XElim k; [ XElim b | Idtac ]; Simpl; [ Auto 7 with ltlc (**) | XAuto | XAuto | XAuto ]. -(* case 4: subst0_both *) - XElim k; [ XElim b | Idtac ]; Simpl; [ Auto 7 with ltlc (**) | XAuto | XAuto | XAuto ]. - Qed. - - Theorem subst0_weight_lt : (u,t,z:?; d:?) (subst0 d u t z) -> (f,g:?) - ((m:?) (le (f m) (g m))) -> - (lt (weight_map f (lift (S d) (0) u)) (g d)) -> - (lt (weight_map f z) (weight_map g t)). - Intros until 1; XElim H. -(* case 1: subst0_lref *) - Intros; XAuto. -(* case 2: subst0_fst *) - XElim k; [ XElim b | Idtac ]; Simpl; Intros; - Apply lt_n_S; (Apply lt_le_plus_plus; [ XAuto | Idtac ]); (**) - [ Auto 6 with ltlc (**) | XAuto | XAuto | XAuto ]. -(* case 3: subst0_snd *) - XElim k; [ XElim b | Idtac ]; Simpl; - [ Auto 8 with ltlc | Auto 6 with ltlc | Auto 6 with ltlc | XAuto ]. (**) -(* case 3: subst0_both *) - XElim k; [ XElim b | Idtac ]; Simpl; - Intros; Apply lt_n_S; [ Apply lt_le_plus_plus | Apply lt_plus_plus | Apply lt_plus_plus | Apply lt_plus_plus ]; XAuto. - EApply subst0_weight_le; [ XEAuto | XAuto | XAuto ]. - Qed. - - Theorem subst0_tlt_tail: (u,t,z:?) (subst0 (0) u t z) -> - (tlt (TTail (Bind Abbr) u z) - (TTail (Bind Abbr) u t) - ). - Unfold tlt weight; Intros; Simpl. - Apply lt_n_S; Apply le_lt_plus_plus; [ XAuto | Idtac ]. - EApply subst0_weight_lt; [ XEAuto | XAuto | XAuto ]. - Qed. - - Theorem subst0_tlt: (u,t,z:?) (subst0 (0) u t z) -> - (tlt z (TTail (Bind Abbr) u t)). - Intros. - EApply tlt_trans; [ Idtac | Apply subst0_tlt_tail; XEAuto]. - XAuto. - Qed. - - End subst0_tlt_props. - - Hints Resolve subst0_tlt : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst1_confluence.v b/helm/coq-contribs/LAMBDA-TYPES/subst1_confluence.v deleted file mode 100644 index 0c473e9ef..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst1_confluence.v +++ /dev/null @@ -1,82 +0,0 @@ -(*#* #stop file *) - -Require lift_gen. -Require subst0_gen. -Require subst0_confluence. -Require subst1_defs. -Require subst1_gen. - - Section subst1_confluence. (**********************************************) - - Theorem subst1_confluence_neq: (t0,t1,u1:?; i1:?) (subst1 i1 u1 t0 t1) -> - (t2,u2:?; i2:?) (subst1 i2 u2 t0 t2) -> - ~i1=i2 -> - (EX t | (subst1 i2 u2 t1 t) & - (subst1 i1 u1 t2 t) - ). - Intros until 1; XElim H; Clear t1; Intros. -(* case 1; subst1_refl *) - XEAuto. -(* case 2; subst1_single *) - XElim H0; Intros; Try Subst0Confluence; XEAuto. - Qed. - - Theorem subst1_confluence_eq : (t0,t1,u:?; i:?) (subst1 i u t0 t1) -> - (t2:?) (subst1 i u t0 t2) -> - (EX t | (subst1 i u t1 t) & - (subst1 i u t2 t) - ). - Intros until 1; XElim H; Intros. -(* case 1; subst1_refl *) - XEAuto. -(* case 2; subst1_single *) - XElim H0; Intros; - Try Subst0Confluence; Try Rewrite H0; XEAuto. - Qed. - - Theorem subst1_confluence_lift: (t0,t1,u:?; i:?) (subst1 i u t0 (lift (1) i t1)) -> - (t2:?) (subst1 i u t0 (lift (1) i t2)) -> - t1 = t2. - Intros until 1; InsertEq H '(lift (1) i t1); XElim H; Clear y; Intros. -(* case 1: subst1_refl *) - Rewrite H in H0; Clear H t0. - Subst1Gen; SymEqual; LiftGen; XEAuto. -(* case 2: subst1_single *) - Rewrite H0 in H; Clear H0 t2. - InsertEq H1 '(lift (1) i t3); XElim H0; Clear y; Intros. -(* case 2.1: subst1_refl *) - Rewrite H0 in H; Clear H0 t0; Subst0Gen. -(* case 2.2: subst1_single *) - Rewrite H1 in H0; Clear H1 t2; Subst0ConfluenceLift; XAuto. - Qed. - - End subst1_confluence. - - Tactic Definition Subst1Confluence := - Match Context With - | [ H0: (subst1 ?1 ?2 ?3 (lift (1) ?1 ?4)); - H1: (subst1 ?1 ?2 ?3 (lift (1) ?1 ?5)) |- ? ] -> - LApply (subst1_confluence_lift ?3 ?4 ?2 ?1); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?5); [ Clear H0; Intros | XAuto ] - | [ H0: (subst1 ?1 ?2 ?3 ?4); - H1: (subst1 ?1 ?2 ?3 ?5) |- ? ] -> - LApply (subst1_confluence_eq ?3 ?4 ?2 ?1); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?5); [ Clear H0; Intros H0 | XAuto ]; - XElim H0; Intros - | [ H0: (subst0 ?1 ?2 ?3 ?4); - H1: (subst1 ?1 ?2 ?3 ?5) |- ? ] -> - LApply (subst1_confluence_eq ?3 ?4 ?2 ?1); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?5); [ Clear H0; Intros H0 | XAuto ]; - XElim H0; Intros - | [ H0: (subst1 ?1 ?2 ?3 ?4); - H1: (subst1 ?5 ?6 ?3 ?7) |- ? ] -> - LApply (subst1_confluence_neq ?3 ?4 ?2 ?1); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?7 ?6 ?5); [ Clear H0 H1; Intros H0 | XAuto ]; - LApply H0; [ Clear H0; Intros H0 | XAuto ]; - XElim H0; Intros - | [ H0: (subst0 ?1 ?2 ?3 ?4); - H1: (subst1 ?5 ?6 ?3 ?7) |- ? ] -> - LApply (subst1_confluence_neq ?3 ?4 ?2 ?1); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?7 ?6 ?5); [ Clear H0 H1; Intros H0 | XAuto ]; - LApply H0; [ Clear H0; Intros H0 | XAuto ]; - XElim H0; Intros. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst1_defs.v b/helm/coq-contribs/LAMBDA-TYPES/subst1_defs.v deleted file mode 100644 index 93e0d2ecf..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst1_defs.v +++ /dev/null @@ -1,58 +0,0 @@ -(*#* #stop file *) - -Require Export subst0_defs. - - Inductive subst1 [i:nat; v:T; t1:T] : T -> Prop := - | subst1_refl : (subst1 i v t1 t1) - | subst1_single : (t2:?) (subst0 i v t1 t2) -> (subst1 i v t1 t2). - - Hint subst1 : ltlc := Constructors subst1. - - Section subst1_props. (***************************************************) - - Theorem subst1_tail: (v,u1,u2:?; i:?) (subst1 i v u1 u2) -> - (k:?; t1,t2:?) (subst1 (s k i) v t1 t2) -> - (subst1 i v (TTail k u1 t1) (TTail k u2 t2)). - Intros until 1; XElim H; Clear u2. -(* case 1: csubst1_refl *) - Intros until 1; XElim H; Clear t2; XAuto. -(* case 2: csubst1_single *) - Intros until 2; XElim H0; Clear t3; XAuto. - Qed. - - End subst1_props. - - Hints Resolve subst1_tail : ltlc. - - Section subst1_gen_base. (************************************************) - - Theorem subst1_gen_sort : (v,x:?; i,n:?) (subst1 i v (TSort n) x) -> - x = (TSort n). - Intros; XElim H; Clear x; Intros; - Try Subst0GenBase; XAuto. - Qed. - - Theorem subst1_gen_lref : (v,x:?; i,n:?) (subst1 i v (TLRef n) x) -> - x = (TLRef n) \/ - n = i /\ x = (lift (S n) (0) v). - Intros; XElim H; Clear x; Intros; - Try Subst0GenBase; XAuto. - Qed. - - Theorem subst1_gen_tail : (k:?; v,u1,t1,x:?; i:?) - (subst1 i v (TTail k u1 t1) x) -> - (EX u2 t2 | x = (TTail k u2 t2) & - (subst1 i v u1 u2) & - (subst1 (s k i) v t1 t2) - ). - Intros; XElim H; Clear x; Intros; - Try Subst0GenBase; XEAuto. - Qed. - - End subst1_gen_base. - - Tactic Definition Subst1GenBase := - Match Context With - | [ H: (subst1 ?1 ?2 (TTail ?3 ?4 ?5) ?6) |- ? ] -> - LApply (subst1_gen_tail ?3 ?2 ?4 ?5 ?6 ?1); [ Clear H; Intros H | XAuto ]; - XElim H; Intros. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst1_gen.v b/helm/coq-contribs/LAMBDA-TYPES/subst1_gen.v deleted file mode 100644 index 0b2d4a170..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst1_gen.v +++ /dev/null @@ -1,44 +0,0 @@ -(*#* #stop file *) - -Require subst0_gen. -Require subst1_defs. - - Section subst1_gen_lift. (************************************************) - - Theorem subst1_gen_lift_lt : (u,t1,x:?; i,h,d:?) (subst1 i (lift h d u) (lift h (S (plus i d)) t1) x) -> - (EX t2 | x = (lift h (S (plus i d)) t2) & (subst1 i u t1 t2)). - Intros; XElim H; Clear x; Intros; - Try Subst0Gen; XEAuto. - Qed. - - Theorem subst1_gen_lift_eq : (t,u,x:?; h,d,i:?) - (le d i) -> (lt i (plus d h)) -> - (subst1 i u (lift h d t) x) -> - x = (lift h d t). - Intros; XElim H1; Clear x; Intros; - Try Subst0Gen; XAuto. - Qed. - - Theorem subst1_gen_lift_ge : (u,t1,x:?; i,h,d:?) (subst1 i u (lift h d t1) x) -> - (le (plus d h) i) -> - (EX t2 | x = (lift h d t2) & (subst1 (minus i h) u t1 t2)). - Intros; XElim H; Clear x; Intros; - Try Subst0Gen; XEAuto. - Qed. - - End subst1_gen_lift. - - Tactic Definition Subst1Gen := - Match Context With - | [ H: (subst1 ?0 (lift ?1 ?2 ?3) (lift ?1 (S (plus ?0 ?2)) ?4) ?5) |- ? ] -> - LApply (subst1_gen_lift_lt ?3 ?4 ?5 ?0 ?1 ?2); [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (subst1 ?0 ?1 (lift (1) ?0 ?2) ?3) |- ? ] -> - LApply (subst1_gen_lift_eq ?2 ?1 ?3 (1) ?0 ?0); [ Intros H_x | XAuto ]; - LApply H_x; [ Clear H_x; Intros H_x | Rewrite plus_sym; XAuto ]; - LApply H_x; [ Clear H H_x; Intros | XAuto ] - | [ H0: (subst1 ?0 ?1 (lift (1) ?4 ?2) ?3); H1: (lt ?4 ?0) |- ? ] -> - LApply (subst1_gen_lift_ge ?1 ?2 ?3 ?0 (1) ?4); [ Clear H0; Intros H0 | XAuto ]; - LApply H0; [ Clear H0; Intros H0 | Rewrite plus_sym; XAuto ]; - XElim H0; Intros - | _ -> Subst1GenBase. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst1_lift.v b/helm/coq-contribs/LAMBDA-TYPES/subst1_lift.v deleted file mode 100644 index 396757179..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst1_lift.v +++ /dev/null @@ -1,23 +0,0 @@ -(*#* #stop file *) - -Require lift_props. -Require subst0_lift. -Require subst1_defs. - - Section subst1_lift. (****************************************************) - - Theorem subst1_lift_lt : (t1,t2,u:?; i:?) (subst1 i u t1 t2) -> - (d:?) (lt i d) -> (h:?) - (subst1 i (lift h (minus d (S i)) u) (lift h d t1) (lift h d t2)). - Intros until 1; XElim H; Clear t2; XAuto. - Qed. - - Theorem subst1_lift_ge : (t1,t2,u:?; i,h:?) (subst1 i u t1 t2) -> - (d:?) (le d i) -> - (subst1 (plus i h) u (lift h d t1) (lift h d t2)). - Intros until 1; XElim H; Clear t2; XAuto. - Qed. - - End subst1_lift. - - Hints Resolve subst1_lift_lt subst1_lift_ge : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/subst1_subst1.v b/helm/coq-contribs/LAMBDA-TYPES/subst1_subst1.v deleted file mode 100644 index 0f437ed9a..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/subst1_subst1.v +++ /dev/null @@ -1,60 +0,0 @@ -(*#* #stop file *) - -Require subst0_subst0. -Require subst1_defs. - - Section subst1_subst1. (**************************************************) - - Theorem subst1_subst1: (t1,t2,u2:?; j:?) (subst1 j u2 t1 t2) -> - (u1,u:?; i:?) (subst1 i u u1 u2) -> - (EX t | (subst1 j u1 t1 t) & (subst1 (S (plus i j)) u t t2)). - Intros until 1; XElim H; Clear t2. -(* case 1: subst1_refl on first premise *) - XEAuto. -(* case 2: subst1_single on first premise *) - Intros until 2; InsertEq H0 u2; XElim H0; Clear y; Intros. -(* case 2.1: subst1_refl on second premise *) - Rewrite H0; Clear H0 u1; XEAuto. -(* case 2.2: subst1_single on second premise *) - Rewrite H1 in H0; Clear H1 t0; Subst0Subst0; XEAuto. - Qed. - - Theorem subst1_subst1_back: (t1,t2,u2:?; j:?) (subst1 j u2 t1 t2) -> - (u1,u:?; i:?) (subst1 i u u2 u1) -> - (EX t | (subst1 j u1 t1 t) & (subst1 (S (plus i j)) u t2 t)). - Intros until 1; XElim H; Clear t2. -(* case 1: subst1_refl on first premise *) - XEAuto. -(* case 2: subst1_single on first premise *) - Intros until 2; XElim H0; Clear u1; Intros; - Try Subst0Subst0; XEAuto. - Qed. - - Theorem subst1_trans: (t2,t1,v:?; i:?) (subst1 i v t1 t2) -> - (t3:?) (subst1 i v t2 t3) -> - (subst1 i v t1 t3). - Intros until 1; XElim H; Clear t2. -(* case 1: subst1_refl on first premise *) - XEAuto. -(* case 2: subst1_single on first premise *) - Intros until 2; XElim H0; Clear t3; XEAuto. - Qed. - - End subst1_subst1. - - Hints Resolve subst1_trans : ltlc. - - Tactic Definition Subst1Subst1 := - Match Context With - | [ H1: (subst1 ?0 ?1 ?2 ?3); H2: (subst1 ?4 ?5 ?6 ?1) |- ? ] -> - LApply (subst1_subst1 ?2 ?3 ?1 ?0); [ Intros H_x | XAuto ]; - LApply (H_x ?6 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros - | [ H1: (subst1 ?0 ?1 ?2 ?3); H2: (subst0 ?4 ?5 ?6 ?1) |- ? ] -> - LApply (subst1_subst1 ?2 ?3 ?1 ?0); [ Intros H_x | XAuto ]; - LApply (H_x ?6 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros - | [ H1: (subst1 ?0 ?1 ?2 ?3); H2: (subst1 ?4 ?5 ?1 ?6) |- ? ] -> - LApply (subst1_subst1_back ?2 ?3 ?1 ?0); [ Intros H_x | XAuto ]; - LApply (H_x ?6 ?5 ?4); [ Clear H_x; Intros H_x | XAuto ]; - XElim H_x; Intros. diff --git a/helm/coq-contribs/LAMBDA-TYPES/terms_defs.v b/helm/coq-contribs/LAMBDA-TYPES/terms_defs.v deleted file mode 100644 index c84b1c2c7..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/terms_defs.v +++ /dev/null @@ -1,85 +0,0 @@ -(*#* #stop file *) - -Require Export Base. - - Inductive Set B := Abbr: B - | Abst: B - | Void: B. - - Inductive Set F := Appl: F - | Cast: F. - - Inductive Set K := Bind: B -> K - | Flat: F -> K. - - Inductive Set T := TSort: nat -> T - | TLRef: nat -> T - | TTail: K -> T -> T -> T. - - Hint f3KTT : ltlc := Resolve (f_equal3 K T T). - - Tactic Definition TGenBase := - Match Context With - | [ H: (TSort ?) = (TSort ?) |- ? ] -> Inversion H; Clear H - | [ H: (TLRef ?) = (TLRef ?) |- ? ] -> Inversion H; Clear H - | [ H: (TTail ? ? ?) = (TTail ? ? ?) |- ? ] -> Inversion H; Clear H - | _ -> Idtac. - - Definition s: K -> nat -> nat := [k;i] Cases k of - | (Bind _) => (S i) - | (Flat _) => i - end. - - Section s_props. (********************************************************) - - Theorem s_S: (k:?; i:?) (s k (S i)) = (S (s k i)). - XElim k; XAuto. - Qed. - - Theorem s_plus: (k:?; i,j:?) (s k (plus i j)) = (plus (s k i) j). - XElim k; XAuto. - Qed. - - Theorem s_plus_sym: (k:?; i,j:?) (s k (plus i j)) = (plus i (s k j)). - XElim k; [ Intros; Simpl; Rewrite plus_n_Sm | Idtac ]; XAuto. - Qed. - - Theorem s_minus: (k:?; i,j:?) (le j i) -> - (s k (minus i j)) = (minus (s k i) j). - XElim k; [ Intros; Unfold s; Cbv Iota | XAuto ]. - Rewrite minus_Sn_m; XAuto. - Qed. - - Theorem minus_s_s: (k:?; i,j:?) (minus (s k i) (s k j)) = (minus i j). - XElim k; XAuto. - Qed. - - Theorem s_le: (k:?; i,j:?) (le i j) -> (le (s k i) (s k j)). - XElim k; Simpl; XAuto. - Qed. - - Theorem s_lt: (k:?; i,j:?) (lt i j) -> (lt (s k i) (s k j)). - XElim k; Simpl; XAuto. - Qed. - - Theorem s_inj: (k:?; i,j:?) (s k i) = (s k j) -> i = j. - XElim k; XEAuto. - Qed. - - End s_props. - - Hints Resolve s_le s_lt s_inj : ltlc. - - Tactic Definition SRw := - Repeat (Rewrite s_S Orelse Rewrite s_plus_sym). - - Tactic Definition SRwIn H := - Repeat (Rewrite s_S in H Orelse Rewrite s_plus in H). - - Tactic Definition SRwBack := - Repeat (Rewrite <- s_S Orelse Rewrite <- s_plus Orelse Rewrite <- s_plus_sym). - - Tactic Definition SRwBackIn H := - Repeat (Rewrite <- s_S in H Orelse Rewrite <- s_plus in H Orelse Rewrite <- s_plus_sym in H). - - Hint discr : ltlc := Extern 4 (le ? (plus (s ? ?) ?)) SRwBack. diff --git a/helm/coq-contribs/LAMBDA-TYPES/tlt_defs.v b/helm/coq-contribs/LAMBDA-TYPES/tlt_defs.v deleted file mode 100644 index eb3f6fb27..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/tlt_defs.v +++ /dev/null @@ -1,115 +0,0 @@ -(*#* #stop file *) - -Require Export terms_defs. - - Definition wadd : (nat -> nat) -> nat -> (nat -> nat) := - [f;w;n] Cases n of (0) => w | (S m) => (f m) end. - - Fixpoint weight_map [f:nat->nat; t:T] : nat := Cases t of - | (TSort n) => (0) - | (TLRef n) => (f n) - | (TTail (Bind Abbr) u t) => - (S (plus (weight_map f u) (weight_map (wadd f (S (weight_map f u))) t))) - | (TTail (Bind _) u t) => - (S (plus (weight_map f u) (weight_map (wadd f (0)) t))) - | (TTail _ u t) => (S (plus (weight_map f u) (weight_map f t))) - end. - - Definition weight : T -> nat := (weight_map [_](0)). - - Definition tlt : T -> T -> Prop := [t1,t2](lt (weight t1) (weight t2)). - - Section wadd_props. (*****************************************************) - - Theorem wadd_le: (f,g:?) ((n:?) (le (f n) (g n))) -> (v,w:?) (le v w) -> - (n:?) (le (wadd f v n) (wadd g w n)). - XElim n; Simpl; XAuto. - Qed. - - Theorem wadd_lt: (f,g:?) ((n:?) (le (f n) (g n))) -> (v,w:?) (lt v w) -> - (n:?) (le (wadd f v n) (wadd g w n)). - XElim n; Simpl; XAuto. - Qed. - - Theorem wadd_O: (n:?) (wadd [_](0) (0) n) = (0). - XElim n; XAuto. - Qed. - - End wadd_props. - - Hints Resolve wadd_le wadd_lt wadd_O : ltlc. - - Section weight_props. (***************************************************) - - Theorem weight_le : (t:?; f,g:?) ((n:?) (le (f n) (g n))) -> - (le (weight_map f t) (weight_map g t)). - XElim t; [ XAuto | Simpl; XAuto | Idtac ]. - XElim k; Simpl; [ Idtac | XAuto ]. - XElim b; Auto 7 with ltlc. (**) - Qed. - - Theorem weight_eq : (t:?; f,g:?) ((n:?) (f n) = (g n)) -> - (weight_map f t) = (weight_map g t). - Intros; Apply le_antisym; Apply weight_le; - Intros; Rewrite (H n); XAuto. - Qed. - - Hints Resolve weight_le weight_eq : ltlc. - - Theorem weight_add_O : (t:?) (weight_map (wadd [_](0) (0)) t) = (weight_map [_](0) t). - XAuto. - Qed. - - Theorem weight_add_S : (t:?; m:?) (le (weight_map (wadd [_](0) (0)) t) (weight_map (wadd [_](0) (S m)) t)). - XAuto. - Qed. - - End weight_props. - - Hints Resolve weight_le weight_add_S : ltlc. - - Section tlt_props. (******************************************************) - - Theorem tlt_trans: (v,u,t:?) (tlt u v) -> (tlt v t) -> (tlt u t). - Unfold tlt; XEAuto. - Qed. - - Theorem tlt_tail_sx: (k:?; u,t:?) (tlt u (TTail k u t)). - Unfold tlt weight. - XElim k; Simpl; [ XElim b | Idtac ]; XAuto. - Qed. - - Theorem tlt_tail_dx: (k:?; u,t:?) (tlt t (TTail k u t)). - Unfold tlt weight. - XElim k; Simpl; [ Idtac | XAuto ]. - XElim b; Intros; Try Rewrite weight_add_O; [ Idtac | XAuto | XAuto ]. - EApply lt_le_trans; [ Apply lt_n_Sn | Apply le_n_S ]. - EApply le_trans; [ Rewrite <- (weight_add_O t); Apply weight_add_S | XAuto ]. - Qed. - - End tlt_props. - - Hints Resolve tlt_tail_sx tlt_tail_dx tlt_trans : ltlc. - - Section tlt_wf. (*********************************************************) - - Local Q: (T -> Prop) -> nat -> Prop := - [P;n] (t:?) (weight t) = n -> (P t). - - Remark q_ind: (P:T->Prop)((n:?) (Q P n)) -> (t:?) (P t). - Unfold Q; Intros. - Apply (H (weight t) t); XAuto. - Qed. - - Theorem tlt_wf_ind: (P:T->Prop) - ((t:?)((v:?)(tlt v t) -> (P v)) -> (P t)) -> - (t:?)(P t). - Unfold tlt; Intros. - XElimUsing q_ind t; Intros. - Apply lt_wf_ind; Clear n; Intros. - Unfold Q in H0; Unfold Q; Intros. - Rewrite <- H1 in H0; Clear H1. - Apply H; XEAuto. - Qed. - - End tlt_wf. diff --git a/helm/coq-contribs/LAMBDA-TYPES/ty0_defs.v b/helm/coq-contribs/LAMBDA-TYPES/ty0_defs.v deleted file mode 100644 index 073a3282a..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/ty0_defs.v +++ /dev/null @@ -1,125 +0,0 @@ -Require Export pc3_defs. - -(*#* #stop record *) - - Record G : Set := { - next : nat -> nat; - base : nat; - next_lt : (n:?) (lt n (next n)); - base_next: (n:?) (le base n) -> (next n) = (S n) - }. - -(*#* #start record *) - -(*#* #caption "current axioms for typing", - "well formed context sort", "well formed context binder", - "conversion rule", "typed sort", "typed reference to abbreviation", - "typed reference to abstraction", "typed binder", "typed application", - "typed cast" -*) -(*#* #cap #cap c, d, t, t0, t1, t2, w #alpha m in h, n in i, u in V, v in U *) - - Inductive wf0 [g:G] : C -> Prop := - | wf0_sort: (m:?) (wf0 g (CSort m)) - | wf0_bind: (c:?; u,t:?) (ty0 g c u t) -> - (b:?) (wf0 g (CTail c (Bind b) u)) - with ty0 [g:G] : C -> T -> T -> Prop := -(* structural rules *) - | ty0_conv: (c:?; t2,t:?) (ty0 g c t2 t) -> - (u,t1:?) (ty0 g c u t1) -> (pc3 c t1 t2) -> - (ty0 g c u t2) -(* axiom rules *) - | ty0_sort: (c:?) (wf0 g c) -> - (m:?) (ty0 g c (TSort m) (TSort (next g m))) - | ty0_abbr: (c:?) (wf0 g c) -> - (n:?; d:?; u:?) (drop n (0) c (CTail d (Bind Abbr) u)) -> - (t:?) (ty0 g d u t) -> - (ty0 g c (TLRef n) (lift (S n) (0) t)) - | ty0_abst: (c:?) (wf0 g c) -> - (n:?; d:?; u:?) (drop n (0) c (CTail d (Bind Abst) u)) -> - (t:?) (ty0 g d u t) -> - (ty0 g c (TLRef n) (lift (S n) (0) u)) - | ty0_bind: (c:?; u,t:?) (ty0 g c u t) -> - (b:?; t1,t2:?) (ty0 g (CTail c (Bind b) u) t1 t2) -> - (t0:?) (ty0 g (CTail c (Bind b) u) t2 t0) -> - (ty0 g c (TTail (Bind b) u t1) (TTail (Bind b) u t2)) - | ty0_appl: (c:?; w,u:?) (ty0 g c w u) -> - (v,t:?) (ty0 g c v (TTail (Bind Abst) u t)) -> - (ty0 g c (TTail (Flat Appl) w v) - (TTail (Flat Appl) w (TTail (Bind Abst) u t)) - ) - | ty0_cast: (c:?; t1,t2:?) (ty0 g c t1 t2) -> - (t0:?) (ty0 g c t2 t0) -> - (ty0 g c (TTail (Flat Cast) t2 t1) t2). - -(*#* #stop file *) - - Hint wf0 : ltlc := Constructors wf0. - - Hint ty0 : ltlc := Constructors ty0. - - Section wf0_props. (******************************************************) - - Theorem wf0_ty0: (g:?; c:?; u,t:?) (ty0 g c u t) -> (wf0 g c). - Intros; XElim H; XAuto. - Qed. - - Hints Resolve wf0_ty0 : ltlc. - - Theorem wf0_drop_O: (c,e:?; h:?) (drop h (0) c e) -> - (g:?) (wf0 g c) -> (wf0 g e). - XElim c. -(* case 1 : CSort *) - Intros; DropGenBase; Rewrite H; XAuto. -(* case 2 : CTail k *) - Intros c IHc; XElim k; ( - XElim h; Intros; DropGenBase; - [ Rewrite H in H0; XAuto | Inversion H1; XEAuto ] ). - Qed. - - End wf0_props. - - Hints Resolve wf0_ty0 wf0_drop_O : ltlc. - - Tactic Definition Wf0Ty0 := - Match Context With - [ _: (ty0 ?1 ?2 ?3 ?4) |- ? ] -> - LApply (wf0_ty0 ?1 ?2 ?3 ?4); [ Intros H_x | XAuto ]; - Inversion_clear H_x. - - Tactic Definition Wf0DropO := - Match Context With - | [ _: (drop ?1 (0) ?2 ?3); _: (wf0 ?4 ?2) |- ? ] -> - LApply (wf0_drop_O ?2 ?3 ?1); [ Intros H_x | XAuto ]; - LApply (H_x ?4); [ Clear H_x; Intros | XAuto ]. - - Section wf0_facilities. (*************************************************) - - Theorem wf0_drop_wf0: (g:?; c:?) (wf0 g c) -> - (b:?; e:?; u:?; h:?) - (drop h (0) c (CTail e (Bind b) u)) -> (wf0 g e). - Intros. - Wf0DropO; Inversion H1; XEAuto. - Qed. - - Theorem ty0_drop_wf0: (g:?; c:?; t1,t2:?) (ty0 g c t1 t2) -> - (b:?; e:?; u:?; h:?) - (drop h (0) c (CTail e (Bind b) u)) -> (wf0 g e). - Intros. - EApply wf0_drop_wf0; [ Idtac | EApply H0 ]; XEAuto. - Qed. - - End wf0_facilities. - - Hints Resolve wf0_drop_wf0 ty0_drop_wf0 : ltlc. - - Tactic Definition DropWf0 := - Match Context With - | [ _: (ty0 ?1 ?2 ?3 ?4); - _: (drop ?5 (0) ?2 (CTail ?6 (Bind ?7) ?8)) |- ? ] -> - LApply (ty0_drop_wf0 ?1 ?2 ?3 ?4); [ Intros H_x | XAuto ]; - LApply (H_x ?7 ?6 ?8 ?5); [ Clear H_x; Intros | XAuto ] - | [ _: (wf0 ?1 ?2); - _: (drop ?5 (0) ?2 (CTail ?6 (Bind ?7) ?8)) |- ? ] -> - LApply (wf0_drop_wf0 ?1 ?2); [ Intros H_x | XAuto ]; - LApply (H_x ?7 ?6 ?8 ?5); [ Clear H_x; Intros | XAuto ]. diff --git a/helm/coq-contribs/LAMBDA-TYPES/ty0_gen.v b/helm/coq-contribs/LAMBDA-TYPES/ty0_gen.v deleted file mode 100644 index 29e3d6470..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/ty0_gen.v +++ /dev/null @@ -1,185 +0,0 @@ -Require pc3_props. -Require ty0_defs. - -(*#* #caption "generation lemma of typing" #clauses *) - - Section ty0_gen_base. (***************************************************) - -(*#* #caption "generation lemma for sorts" *) -(*#* #cap #cap c #alpha x in T, n in h *) - - Theorem ty0_gen_sort: (g:?; c:?; x:?; n:?) - (ty0 g c (TSort n) x) -> - (pc3 c (TSort (next g n)) x). - -(*#* #stop proof *) - - Intros until 1; InsertEq H '(TSort n); XElim H; Intros. -(* case 1 : ty0_conv *) - XEAuto. -(* case 2 : ty0_sort *) - Inversion H0; XAuto. -(* case 3 : ty0_abbr *) - Inversion H3. -(* case 4 : ty0_abst *) - Inversion H3. -(* case 5 : ty0_bind *) - Inversion H5. -(* case 6 : ty0_appl *) - Inversion H3. -(* case 7 : ty0_cast *) - Inversion H3. - Qed. - -(*#* #start proof *) - -(*#* #caption "generation lemma for bound references" *) -(*#* #cap #cap c, e #alpha x in T, t in U, u in V, n in i *) - - Theorem ty0_gen_lref: (g:?; c:?; x:?; n:?) (ty0 g c (TLRef n) x) -> - (EX e u t | (pc3 c (lift (S n) (0) t) x) & - (drop n (0) c (CTail e (Bind Abbr) u)) & - (ty0 g e u t) - ) \/ - (EX e u t | (pc3 c (lift (S n) (0) u) x) & - (drop n (0) c (CTail e (Bind Abst) u)) & - (ty0 g e u t) - ). - -(*#* #stop proof *) - - Intros until 1; InsertEq H '(TLRef n); XElim H; Intros. -(* case 1 : ty0_conv *) - LApply H2; [ Clear H2; Intros H2 | XAuto ]. - XElim H2; Intros; XElim H2; XEAuto. -(* case 2 : ty0_sort *) - Inversion H0. -(* case 3 : ty0_abbr *) - Inversion H3 ; Rewrite H5 in H0; XEAuto. -(* case 4 : ty0_abst *) - Inversion H3; Rewrite H5 in H0; XEAuto. -(* case 5 : ty0_bind *) - Inversion H5. -(* case 6 : ty0_appl *) - Inversion H3. -(* case 7 : ty0_cast *) - Inversion H3. - Qed. - -(*#* #start proof *) - -(*#* #caption "generation lemma for binders" *) -(*#* #cap #cap c #alpha x in T, t1 in U1, t2 in U2, u in V, t in U, t0 in U3 *) - - Theorem ty0_gen_bind: (g:?; b:?; c:?; u,t1,x:?) (ty0 g c (TTail (Bind b) u t1) x) -> - (EX t2 t t0 | (pc3 c (TTail (Bind b) u t2) x) & - (ty0 g c u t) & - (ty0 g (CTail c (Bind b) u) t1 t2) & - (ty0 g (CTail c (Bind b) u) t2 t0) - ). - -(*#* #stop proof *) - - Intros until 1; InsertEq H '(TTail (Bind b) u t1); XElim H; Intros. -(* case 1 : ty0_conv *) - LApply H2; [ Clear H2; Intros H2 | XAuto ]. - XElim H2; XEAuto. -(* case 2 : ty0_sort *) - Inversion H0. -(* case 3 : ty0_abbr *) - Inversion H3. -(* case 4 : ty0_abst *) - Inversion H3. -(* case 5 : ty0_bind *) - Inversion H5. - Rewrite H7 in H1; Rewrite H7 in H3. - Rewrite H8 in H; Rewrite H8 in H1; Rewrite H8 in H3. - Rewrite H9 in H1; XEAuto. -(* case 6 : ty0_appl *) - Inversion H3. -(* case 7 : ty0_cast *) - Inversion H3. - Qed. - -(*#* #start proof *) - -(*#* #caption "generation lemma for applications" *) -(*#* #cap #cap c #alpha x in T, v in U1, w in V1, u in V2, t in U2 *) - - Theorem ty0_gen_appl: (g:?; c:?; w,v,x:?) (ty0 g c (TTail (Flat Appl) w v) x) -> - (EX u t | (pc3 c (TTail (Flat Appl) w (TTail (Bind Abst) u t)) x) & - (ty0 g c v (TTail (Bind Abst) u t)) & - (ty0 g c w u) - ). - -(*#* #stop proof *) - - Intros until 1; InsertEq H '(TTail (Flat Appl) w v); XElim H; Intros. -(* case 1 : ty0_conv *) - LApply H2; [ Clear H2; Intros H2 | XAuto ]. - XElim H2; XEAuto. -(* case 2 : ty0_sort *) - Inversion H0. -(* case 3 : ty0_abbr *) - Inversion H3. -(* case 4 : ty0_abst *) - Inversion H3. -(* case 5 : ty0_bind *) - Inversion H5. -(* case 6 : ty0_appl *) - Inversion H3; Rewrite H5 in H; Rewrite H6 in H1; XEAuto. -(* case 7 : ty0_cast *) - Inversion H3. - Qed. - -(*#* #start proof *) - -(*#* #caption "generation lemma for type casts" *) -(*#* #cap #cap c #alpha x in T, t2 in V, t1 in U *) - - Theorem ty0_gen_cast: (g:?; c:?; t1,t2,x:?) - (ty0 g c (TTail (Flat Cast) t2 t1) x) -> - (pc3 c t2 x) /\ (ty0 g c t1 t2). - -(*#* #stop proof *) - - Intros until 1; InsertEq H '(TTail (Flat Cast) t2 t1); XElim H; Intros. -(* case 1 : ty0_conv *) - LApply H2; [ Clear H2; Intros H2 | XAuto ]. - XElim H2; XEAuto. -(* case 2 : ty0_sort *) - Inversion H0. -(* case 3 : ty0_abbr *) - Inversion H3. -(* case 4 : ty0_abst *) - Inversion H3. -(* case 5 : ty0_bind *) - Inversion H5. -(* case 6 : ty0_appl *) - Inversion H3. -(* case 7 : ty0_cast *) - Inversion H3; Rewrite H5 in H; Rewrite H5 in H1; Rewrite H6 in H; XAuto. - Qed. - - End ty0_gen_base. - - Tactic Definition Ty0GenBase := - Match Context With - | [ H: (ty0 ?1 ?2 (TSort ?3) ?4) |- ? ] -> - LApply (ty0_gen_sort ?1 ?2 ?4 ?3); [ Clear H; Intros | XAuto ] - | [ H: (ty0 ?1 ?2 (TLRef ?3) ?4) |- ? ] -> - LApply (ty0_gen_lref ?1 ?2 ?4 ?3); [ Clear H; Intros H | XAuto ]; - XElim H; Intros H; XElim H; Intros - | [ H: (ty0 ?1 ?2 (TTail (Bind ?3) ?4 ?5) ?6) |- ? ] -> - LApply (ty0_gen_bind ?1 ?3 ?2 ?4 ?5 ?6); [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (ty0 ?1 ?2 (TTail (Flat Appl) ?3 ?4) ?5) |- ? ] -> - LApply (ty0_gen_appl ?1 ?2 ?3 ?4 ?5); [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (ty0 ?1 ?2 (TTail (Flat Cast) ?3 ?4) ?5) |- ? ] -> - LApply (ty0_gen_cast ?1 ?2 ?4 ?3 ?5); [ Clear H; Intros H | XAuto ]; - XElim H; Intros. - -(*#* #start file *) - -(*#* #single *) diff --git a/helm/coq-contribs/LAMBDA-TYPES/ty0_gen_context.v b/helm/coq-contribs/LAMBDA-TYPES/ty0_gen_context.v deleted file mode 100644 index 3a5b5d9b7..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/ty0_gen_context.v +++ /dev/null @@ -1,227 +0,0 @@ -(*#* #stop file *) - -Require lift_gen. -Require lift_props. -Require subst1_defs. -Require subst1_lift. -Require subst1_confluence. -Require drop_props. -Require csubst1_defs. -Require pc3_gen. -Require pc3_gen_context. -Require ty0_defs. -Require ty0_lift. - -(* NOTE: these break the recursion between ty0_sred_cpr0_pr0 and ty0_gen_lift *) - - Section ty0_gen_cabbr. (**************************************************) - - Tactic Definition IH d a0 a := - Match Context With - [ H: (e:?; u:?; d:?) ? -> (a0:?) ? -> (a:?) ? -> ? -> ? |- ? ] -> - LApply (H e u0 d); [ Clear H; Intros H | XAuto ]; - LApply (H a0); [ Clear H; Intros H | XAuto ]; - LApply (H a); [ Clear H; Intros H | XEAuto ]; - LApply H; [ Clear H; Intros H | XAuto ]; - XElim H; Intros. - -(* NOTE: This can be generalized removing the last three premises *) - Theorem ty0_gen_cabbr: (g:?; c:?; t1,t2:?) (ty0 g c t1 t2) -> - (e:?; u:?; d:?) (drop d (0) c (CTail e (Bind Abbr) u)) -> - (a0:?) (csubst1 d u c a0) -> - (a:?) (wf0 g a) -> (drop (1) d a0 a) -> - (EX y1 y2 | (subst1 d u t1 (lift (1) d y1)) & - (subst1 d u t2 (lift (1) d y2)) & - (ty0 g a y1 y2) - ). - Intros until 1; XElim H; Intros. -(* case 1: ty0_conv *) - Repeat IH d a0 a; EApply ex3_2_intro; - [ XEAuto | XEAuto | EApply ty0_conv; Try EApply pc3_gen_cabbr; XEAuto ]. -(* case 2: ty0_sort *) - EApply ex3_2_intro; Try Rewrite lift_sort; XAuto. -(* case 3: ty0_abbr *) - Apply (lt_eq_gt_e n d0); Intros; Clear c t1 t2. -(* case 3.1: n < d0 *) - Clear H1; DropDis; Rewrite minus_x_Sy in H1; [ DropGenBase | XAuto ]. - CSubst1Drop; Rewrite minus_x_Sy in H0; [ Idtac | XAuto ]. - CSubst1GenBase; Rewrite H0 in H8; Clear H0 x; Simpl in H9. - Rewrite (lt_plus_minus n d0) in H6; [ Idtac | XAuto ]. - DropDis; Rewrite H0 in H9; Clear H0 x0. - IH '(minus d0 (S n)) x1 x3. - Subst1Confluence; Rewrite H0 in H11; Clear H0 x0. - Pattern 3 d0; Rewrite (le_plus_minus_sym (S n) d0); [ Idtac | XAuto ]. - Pattern 4 d0; Rewrite (le_plus_minus (S n) d0); [ Idtac | XAuto ]. - EApply ex3_2_intro; - [ Rewrite lift_lref_lt | Rewrite lift_d | EApply ty0_abbr ]; XEAuto. -(* case 3.2: n = d0 *) - Rewrite H7; Rewrite H7 in H0; Clear H2 H7 n. - DropDis; Inversion H0; Rewrite H8 in H4; Clear H0 H7 H8 e u0. - CSubst1Drop; DropDis. - EApply ex3_2_intro; - [ EApply subst1_single; Rewrite lift_free; Simpl; XEAuto - | Rewrite lift_free; Simpl; XEAuto - | XEAuto ]. -(* case 3.3: n > d0 *) - Clear H2 H3 e; CSubst1Drop; DropDis. - Pattern 1 n; Rewrite (lt_plus_minus (0) n); [ Idtac | XEAuto ]. - Arith4c '(0) '(minus n (1)). - EApply ex3_2_intro; - [ Rewrite lift_lref_ge - | Rewrite lift_free; Simpl - | Pattern 2 n; Rewrite (minus_x_SO n) - ]; XEAuto. -(* case 4: ty0_abst *) - Apply (lt_eq_gt_e n d0); Intros; Clear c t1 t2. -(* case 4.1: n < d0 *) - Clear H1; DropDis; Rewrite minus_x_Sy in H1; [ DropGenBase | XAuto ]. - CSubst1Drop; Rewrite minus_x_Sy in H0; [ Idtac | XAuto ]. - CSubst1GenBase; Rewrite H0 in H8; Clear H0 x; Simpl in H9. - Rewrite (lt_plus_minus n d0) in H6; [ Idtac | XAuto ]. - DropDis; Rewrite H0 in H9; Clear H0 x0. - IH '(minus d0 (S n)) x1 x3. - Subst1Confluence; Rewrite H0 in H11; Clear H0 x0. - Pattern 3 d0; Rewrite (le_plus_minus_sym (S n) d0); [ Idtac | XAuto ]. - Pattern 4 d0; Rewrite (le_plus_minus (S n) d0); [ Idtac | XAuto ]. - EApply ex3_2_intro; - [ Rewrite lift_lref_lt | Rewrite lift_d | EApply ty0_abst ]; XEAuto. -(* case 4.2: n = d0 *) - Rewrite H7; Rewrite H7 in H0; DropDis; Inversion H0. -(* case 4.3: n > d0 *) - Clear H2 H3 e; CSubst1Drop; DropDis. - Pattern 1 n; Rewrite (lt_plus_minus (0) n); [ Idtac | XEAuto ]. - Arith4c '(0) '(minus n (1)). - EApply ex3_2_intro; - [ Rewrite lift_lref_ge - | Rewrite lift_free; Simpl - | Pattern 2 n; Rewrite (minus_x_SO n) - ]; XEAuto. -(* case 5: ty0_bind *) - IH d a0 a; Clear H H1 H3 c t1 t2. - IH '(S d) '(CTail a0 (Bind b) (lift (1) d x0)) '(CTail a (Bind b) x0). - IH '(S d) '(CTail a0 (Bind b) (lift (1) d x0)) '(CTail a (Bind b) x0). - Subst1Confluence; Rewrite H4 in H11; Clear H4 x5. - EApply ex3_2_intro; Try Rewrite lift_bind; XEAuto. -(* case 6: ty0_appl *) - Repeat IH d a0 a; Clear H H1 c t1 t2. - Subst1GenBase; SymEqual; LiftGenBase; Rewrite H in H8; Rewrite H11 in H1; Rewrite H12 in H7; Clear H H11 H12 x1 x4 x5. - Subst1Confluence; Rewrite H in H8; Clear H x6. - EApply ex3_2_intro; Try Rewrite lift_flat; - [ Idtac | EApply subst1_tail; [ Idtac | Rewrite lift_bind ] | Idtac ]; XEAuto. -(* case 7: ty0_cast *) - Rename u into u0; Repeat IH d a0 a; Clear H H1 c t1 t2. - Subst1Confluence; Rewrite H in H10; Clear H x3. - EApply ex3_2_intro; [ Rewrite lift_flat | Idtac | Idtac ]; XEAuto. - Qed. - - End ty0_gen_cabbr. - - Section ty0_gen_cvoid. (**************************************************) - - Tactic Definition IH d a := - Match Context With - [ H: (e:?; u:?; d:?) ? -> (a:?) ? -> ? -> ? |- ? ] -> - LApply (H e u0 d); [ Clear H; Intros H | XAuto ]; - LApply (H a); [ Clear H; Intros H | XEAuto ]; - LApply H; [ Clear H; Intros H | XAuto ]; - XElim H; Intros. - -(* NOTE: This can be generalized removing the last two premises *) - Theorem ty0_gen_cvoid: (g:?; c:?; t1,t2:?) (ty0 g c t1 t2) -> - (e:?; u:?; d:?) (drop d (0) c (CTail e (Bind Void) u)) -> - (a:?) (wf0 g a) -> (drop (1) d c a) -> - (EX y1 y2 | t1 = (lift (1) d y1) & - t2 = (lift (1) d y2) & - (ty0 g a y1 y2) - ). - Intros until 1; XElim H; Intros. -(* case 1: ty0_conv *) - Repeat IH d a; Rewrite H0 in H3; Rewrite H7 in H3; Pc3Gen; XEAuto. -(* case 2: ty0_sort *) - EApply ex3_2_intro; Try Rewrite lift_sort; XEAuto. -(* case 3: ty0_abbr *) - Apply (lt_eq_gt_e n d0); Intros. -(* case 3.1: n < d0 *) - DropDis; Rewrite minus_x_Sy in H7; [ DropGenBase | XAuto ]. - Rewrite (lt_plus_minus n d0) in H5; [ Idtac | XAuto ]. - DropDis; Rewrite H0 in H2; Clear H0 H1 u. - IH '(minus d0 (S n)) x1; Rewrite H1; Clear H1 t. - LiftGen; Rewrite <- H0 in H2; Clear H0 x2. - Rewrite <- lift_d; [ Idtac | XAuto ]. - Rewrite <- le_plus_minus; [ Idtac | XAuto ]. - EApply ex3_2_intro; [ Rewrite lift_lref_lt | Idtac | EApply ty0_abbr ]; XEAuto. -(* case 3.2: n = d0 *) - Rewrite H6 in H0; DropDis; Inversion H0. -(* case 3.3: n > d0 *) - Clear H2 H3 c e t1 t2 u0; DropDis. - Pattern 1 n; Rewrite (lt_plus_minus (0) n); [ Idtac | XEAuto ]. - Arith4c '(0) '(minus n (1)). - EApply ex3_2_intro; - [ Rewrite lift_lref_ge - | Rewrite lift_free; Simpl - | Pattern 2 n; Rewrite (minus_x_SO n) - ]; XEAuto. -(* case 4: ty0_abst *) - Apply (lt_eq_gt_e n d0); Intros. -(* case 4.1: n < d0 *) - DropDis; Rewrite minus_x_Sy in H7; [ DropGenBase | XAuto ]. - Rewrite (lt_plus_minus n d0) in H5; [ Idtac | XAuto ]. - DropDis; Rewrite H0; Rewrite H0 in H2; Clear H0 H1 u. - IH '(minus d0 (S n)) x1; Clear H1 t. - LiftGen; Rewrite <- H0 in H2; Clear H0 x2. - Rewrite <- lift_d; [ Idtac | XAuto ]. - Rewrite <- le_plus_minus; [ Idtac | XAuto ]. - EApply ex3_2_intro; [ Rewrite lift_lref_lt | Idtac | EApply ty0_abst ]; XEAuto. -(* case 4.2: n = d0 *) - Rewrite H6 in H0; DropDis; Inversion H0. -(* case 4.3: n > d0 *) - Clear H2 H3 c e t1 t2 u0; DropDis. - Pattern 1 n; Rewrite (lt_plus_minus (0) n); [ Idtac | XEAuto ]. - Arith4c '(0) '(minus n (1)). - EApply ex3_2_intro; - [ Rewrite lift_lref_ge - | Rewrite lift_free; [ Simpl | Simpl | Idtac ] - | Pattern 2 n; Rewrite (minus_x_SO n) - ]; XEAuto. -(* case 5: ty0_bind *) - IH d a; Rewrite H0; Rewrite H0 in H2; Rewrite H0 in H4; Clear H H0 H1 H3 H8 u t. - IH '(S d) '(CTail a (Bind b) x0); Rewrite H; Rewrite H in H2; Clear H H0 t3 t4. - IH '(S d) '(CTail a (Bind b) x0); Rewrite H; Clear H t0. - LiftGen; Rewrite <- H in H2; Clear H x5. - LiftTailRwBack; XEAuto. -(* case 6: ty0_appl *) - IH d a; Rewrite H2; Clear H H1 H2 v. - LiftGenBase; Rewrite H in H7; Rewrite H1; Rewrite H1 in H0; Rewrite H2; Clear H H1 H2 u t x1. - IH d a; Rewrite H; Clear H w. - LiftGen; Rewrite <- H in H1; Clear H x4. - LiftTailRwBack; XEAuto. -(* case 7: ty0_cast *) - Rename u into u0. - IH d a; Rewrite H2 in H0; Rewrite H2; Clear H H1 H2 H6 t3 t4. - IH d a; Rewrite H; Clear H t0. - LiftGen; Rewrite <- H in H1; Clear H x3. - LiftTailRwBack; XEAuto. - Qed. - - End ty0_gen_cvoid. - - Tactic Definition Ty0GenContext := - Match Context With - | [ H: (ty0 ?1 (CTail ?2 (Bind Abbr) ?3) ?4 ?5) |- ? ] -> - LApply (ty0_gen_cabbr ?1 (CTail ?2 (Bind Abbr) ?3) ?4 ?5); [ Clear H; Intros H | XAuto ]; - LApply (H ?2 ?3 (0)); [ Clear H; Intros H | XAuto ]; - LApply (H (CTail ?2 (Bind Abbr) ?3)); [ Clear H; Intros H | XAuto ]; - LApply (H ?2); [ Clear H; Intros H | XAuto ]; - LApply H; [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | [ H: (ty0 ?1 (CTail ?2 (Bind Void) ?3) ?4 ?5) |- ? ] -> - LApply (ty0_gen_cvoid ?1 (CTail ?2 (Bind Void) ?3) ?4 ?5); [ Clear H; Intros H | XAuto ]; - LApply (H ?2 ?3 (0)); [ Clear H; Intros H | XAuto ]; - LApply (H ?2); [ Clear H; Intros H | XAuto ]; - LApply H; [ Clear H; Intros H | XAuto ]; - XElim H; Intros - | _ -> Ty0GenBase. - -(*#* #start file *) - -(*#* #single *) diff --git a/helm/coq-contribs/LAMBDA-TYPES/ty0_lift.v b/helm/coq-contribs/LAMBDA-TYPES/ty0_lift.v deleted file mode 100644 index ebe6bfcc7..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/ty0_lift.v +++ /dev/null @@ -1,65 +0,0 @@ -Require lift_props. -Require drop_props. -Require pc3_props. -Require ty0_defs. - -(*#* #caption "main properties of typing" #clauses ty0_props *) - - Section ty0_lift. (*******************************************************) - -(*#* #caption "lift preserves types" *) -(*#* #cap #cap t1, t2 #alpha c in C1, e in C2, d in i *) - - Theorem ty0_lift : (g:?; e:?; t1,t2:?) (ty0 g e t1 t2) -> - (c:?) (wf0 g c) -> (d,h:?) (drop h d c e) -> - (ty0 g c (lift h d t1) (lift h d t2)). - -(*#* #stop file *) - - Intros until 1; XElim H; Intros. -(* case 1 : ty0_conv *) - XEAuto. -(* case 2 : ty0_sort *) - Repeat Rewrite lift_sort; XAuto. -(* case 3 : ty0_abbr *) - Apply (lt_le_e n d0); Intros; DropDis. -(* case 3.1 : n < d0 *) - Rewrite minus_x_Sy in H4; [ Idtac | XAuto ]. - DropGenBase; Rewrite H4 in H0; Clear H4 x. - Rewrite lift_lref_lt; [ Idtac | XAuto ]. - Arith8 d0 '(S n); Rewrite lift_d; [ Arith8' d0 '(S n) | XAuto ]. - EApply ty0_abbr; XEAuto. -(* case 3.2 : n >= d0 *) - Rewrite lift_lref_ge; [ Idtac | XAuto ]. - Arith7' n; Rewrite lift_free; [ Idtac | Simpl; XAuto | XAuto ]. - Rewrite (plus_sym h (S n)); Simpl; XEAuto. -(* case 4: ty0_abst *) - Apply (lt_le_e n d0); Intros; DropDis. -(* case 4.1 : n < d0 *) - Rewrite minus_x_Sy in H4; [ Idtac | XAuto ]. - DropGenBase; Rewrite H4 in H0; Clear H4 x. - Rewrite lift_lref_lt; [ Idtac | XAuto ]. - Arith8 d0 '(S n); Rewrite lift_d; [ Arith8' d0 '(S n) | XAuto ]. - EApply ty0_abst; XEAuto. -(* case 4.2 : n >= d0 *) - Rewrite lift_lref_ge; [ Idtac | XAuto ]. - Arith7' n; Rewrite lift_free; [ Idtac | Simpl; XAuto | XAuto ]. - Rewrite (plus_sym h (S n)); Simpl; XEAuto. -(* case 5: ty0_bind *) - LiftTailRw; Simpl; EApply ty0_bind; XEAuto. -(* case 6: ty0_appl *) - LiftTailRw; Simpl; EApply ty0_appl; [ Idtac | Rewrite <- lift_bind ]; XEAuto. -(* case 7: ty0_cast *) - LiftTailRw; XEAuto. - Qed. - - End ty0_lift. - - Hints Resolve ty0_lift : ltlc. - - Tactic Definition Ty0Lift b u := - Match Context With - [ H: (ty0 ?1 ?2 ?3 ?4) |- ? ] -> - LApply (ty0_lift ?1 ?2 ?3 ?4); [ Intros H_x | XAuto ]; - LApply (H_x (CTail ?2 (Bind b) u)); [ Clear H_x; Intros H_x | XEAuto ]; - LApply (H_x (0) (1)); [ Clear H_x; Intros | XAuto ]. diff --git a/helm/coq-contribs/LAMBDA-TYPES/ty0_props.v b/helm/coq-contribs/LAMBDA-TYPES/ty0_props.v deleted file mode 100644 index ab4b00687..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/ty0_props.v +++ /dev/null @@ -1,110 +0,0 @@ -Require drop_props. -Require pc3_props. -Require ty0_defs. -Require ty0_gen. -Require ty0_lift. - - Section ty0_correct. (****************************************************) - -(*#* #caption "correctness of types" *) -(*#* #cap #cap c, t1, t2 #alpha t in T3 *) - - Theorem ty0_correct : (g:?; c:?; t1,t2:?) - (ty0 g c t1 t2) -> (EX t | (ty0 g c t2 t)). - -(*#* #stop file *) - - Intros; XElim H; Intros. -(* case 1 : ty0_conv *) - XEAuto. -(* case 2 : ty0_sort *) - XEAuto. -(* case 3 : ty0_abbr *) - XElim H2; XEAuto. -(* case 4 : ty0_abst *) - XEAuto. -(* case 5 : ty0_bind *) - XElim H4; XEAuto. -(* case 6 : ty0_appl *) - XElim H0; XElim H2; Intros. - Ty0GenBase; XEAuto. -(* case 7 : ty0_cast *) - XAuto. - Qed. - - End ty0_correct. - - Tactic Definition Ty0Correct := - Match Context With - [ _: (ty0 ?1 ?2 ?3 ?4) |- ? ] -> - LApply (ty0_correct ?1 ?2 ?3 ?4); [ Intros H_x | XAuto ]; - XElim H_x; Intros. - -(*#* #start file *) - - Section ty0_shift. (******************************************************) - -(*#* #caption "shift lemma for types" *) -(*#* #cap #cap t1, t2 #alpha c in C1, e in C2 *) - - Theorem ty0_shift : (h:?; c,e:?) (drop h (0) c e) -> - (g:?; t1,t2:?) (ty0 g c t1 t2) -> (wf0 g e) -> - (ty0 g e (app c h t1) (app c h t2)). - -(*#* #stop file *) - - XElim h. -(* case 1 : h = 0 *) - Intros; DropGenBase; Rewrite <- H. - Repeat Rewrite app_O; XAuto. -(* case 2 : h > 0 *) - Intros h IHh; XElim c. -(* case 2.1 : CSort *) - Intros; DropGenBase; Rewrite H. - Simpl; XAuto. -(* case 2.2 : CTail k *) - Intros c IHc; Clear IHc; XElim k; Intros; Wf0Ty0. - DropGenBase; Move H0 after H2; Ty0Correct. - Simpl; Apply IHh; [ Idtac | EApply ty0_bind | Idtac ]; XEAuto. - Qed. - - End ty0_shift. - - Hints Resolve ty0_shift : ltlc. - - Section ty0_unique. (*****************************************************) - - Opaque pc3. - -(*#* #start file *) - -(*#* #caption "uniqueness of types" *) -(*#* #cap #cap c, t1, t2 #alpha u in T *) - - Theorem ty0_unique : (g:?; c:?; u,t1:?) (ty0 g c u t1) -> - (t2:?) (ty0 g c u t2) -> (pc3 c t1 t2). - -(*#* #stop file *) - - Intros until 1; XElim H; Intros. -(* case 1 : ty0_conv *) - XEAuto. -(* case 2 : ty0_sort *) - Ty0GenBase; XAuto. -(* case 3 : ty0_abbr *) - Ty0GenBase; DropDis; Inversion H4. - Rewrite H7 in H2; Rewrite H8 in H2; XEAuto. -(* case 4 : ty0_abst *) - Ty0GenBase; DropDis; Inversion H4. - Rewrite H7 in H2; Rewrite H8 in H2; XEAuto. -(* case 5 : ty0_bind *) - Ty0GenBase; XEAuto. -(* case 6 : ty0_appl *) - Ty0GenBase; EApply pc3_t; [ Idtac | EApply H3 ]; XEAuto. -(* case 7 : ty0_cast *) - Ty0GenBase; XEAuto. - Qed. - - End ty0_unique. - - Hints Resolve ty0_unique : ltlc. diff --git a/helm/coq-contribs/LAMBDA-TYPES/ty0_sred.v b/helm/coq-contribs/LAMBDA-TYPES/ty0_sred.v deleted file mode 100644 index 99548beb5..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/ty0_sred.v +++ /dev/null @@ -1,252 +0,0 @@ -Require lift_gen. -Require subst1_gen. -Require csubst1_defs. -Require pr0_lift. -Require pr0_subst1. -Require cpr0_defs. -Require pc1_props. -Require pc3_props. -Require pc3_gen. -Require ty0_defs. -Require ty0_gen. -Require ty0_lift. -Require ty0_props. -Require ty0_subst0. -Require ty0_gen_context. -Require csub0_defs. -Require csub0_props. - -(*#* #caption "subject reduction" #clauses *) - -(*#* #stop file *) - - Section ty0_sred_cpr0_pr0. (**********************************************) - - Tactic Definition IH H c2 t2 := - LApply (H c2); [ Intros H_x | XEAuto ]; - LApply H_x; [ Clear H_x; Intros H_x | XAuto ]; - LApply (H_x t2); [ Clear H_x; Intros | XEAuto ]. - - Tactic Definition IH0 := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 ?2 c2)->(t2:T)(pr0 ?3 t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (ty0 ?1 ?2 ?3 ?4) |- ? ] -> - IH H1 ?5 ?3. - - Tactic Definition IH0c := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 ?2 c2)->(t2:T)(pr0 ?3 t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (ty0 ?1 ?2 ?3 ?4) |- ? ] -> - IH H1 ?5 ?3; Clear H1. - - Tactic Definition IH0B := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 (CTail ?2 (Bind ?6) ?7) c2)->(t2:T)(pr0 ?3 t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (ty0 ?1 (CTail ?2 (Bind ?6) ?7) ?3 ?4) |- ? ] -> - IH H1 '(CTail ?5 (Bind ?6) ?7) ?3. - - Tactic Definition IH0Bc := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 (CTail ?2 (Bind ?6) ?7) c2)->(t2:T)(pr0 ?3 t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (ty0 ?1 (CTail ?2 (Bind ?6) ?7) ?3 ?4) |- ? ] -> - IH H1 '(CTail ?5 (Bind ?6) ?7) ?3; Clear H1. - - Tactic Definition IH1 := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 ?2 c2)->(t2:T)(pr0 ?3 t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (pr0 ?3 ?6) |- ? ] -> - IH H1 ?5 ?6. - - Tactic Definition IH1c := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 ?2 c2)->(t2:T)(pr0 ?3 t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (pr0 ?3 ?6) |- ? ] -> - IH H1 ?5 ?6; Clear H1. - - Tactic Definition IH1Bc := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 (CTail ?2 (Bind ?7) ?8) c2)->(t2:T)(pr0 ?3 t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (pr0 ?3 ?6) |- ? ] -> - IH H1 '(CTail ?5 (Bind ?7) ?8) ?6; Clear H1. - - Tactic Definition IH1BLc := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 (CTail ?2 (Bind ?7) ?8) c2)->(t2:T)(pr0 (lift ?10 ?11 ?3) t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (pr0 ?3 ?6) |- ? ] -> - IH H1 '(CTail ?5 (Bind ?7) ?8) '(lift ?10 ?11 ?6); Clear H1. - - Tactic Definition IH1T := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 ?2 c2)->(t2:T)(pr0 (TTail ?7 ?8 ?3) t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (pr0 ?3 ?6) |- ? ] -> - IH H1 ?5 '(TTail ?7 ?8 ?6). - - Tactic Definition IH1T2c := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 ?2 c2)->(t2:T)(pr0 (TTail ?7 ?8 ?3) t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (pr0 ?3 ?6); H4: (pr0 ?8 ?9) |- ? ] -> - IH H1 ?5 '(TTail ?7 ?9 ?6); Clear H1. - - Tactic Definition IH3B := - Match Context With - [ H1: (c2:C) (wf0 ?1 c2)->(cpr0 (CTail ?2 (Bind ?7) ?8) c2)->(t2:T)(pr0 ?3 t2)->(ty0 ?1 c2 t2 ?4); - H2: (cpr0 ?2 ?5); H3: (pr0 ?3 ?6); H4: (pr0 ?8 ?9) |- ? ] -> - IH H1 '(CTail ?5 (Bind ?7) ?9) ?6. - -(*#* #start file *) - -(*#* #caption "base case" *) -(*#* #cap #cap c1, c2 #alpha t1 in T, t2 in T1, t in T2 *) - - Theorem ty0_sred_cpr0_pr0: (g:?; c1:?; t1,t:?) (ty0 g c1 t1 t) -> - (c2:?) (wf0 g c2) -> (cpr0 c1 c2) -> - (t2:?) (pr0 t1 t2) -> (ty0 g c2 t2 t). - -(*#* #stop file *) - - Intros until 1; XElim H; Intros. -(* case 1: ty0_conv *) - IH1c; IH0c; EApply ty0_conv; XEAuto. -(* case 2: ty0_sort *) - Inversion H2; XAuto. -(* case 3: ty0_abbr *) - Inversion H5; Cpr0Drop; IH1c; XEAuto. -(* case 4: ty0_abst *) - Intros; Inversion H5; Cpr0Drop; IH0; IH1. - EApply ty0_conv; - [ EApply ty0_lift; [ Idtac | XAuto | XEAuto ] - | EApply ty0_abst - | EApply pc3_lift ]; XEAuto. -(* case 5: ty0_bind *) - Intros; Inversion H7; Clear H7. -(* case 5.1: pr0_refl *) - IH0c; IH0Bc; IH0Bc. - EApply ty0_bind; XEAuto. -(* case 5.2: pr0_cont *) - IH0; IH0B; Ty0Correct; IH3B; Ty0Correct. - EApply ty0_conv; [ EApply ty0_bind | EApply ty0_bind | Idtac ]; XEAuto. -(* case 5.3: pr0_delta *) - Rewrite <- H8 in H1; Rewrite <- H8 in H2; - Rewrite <- H8 in H3; Rewrite <- H8 in H4; Clear H8 b. - IH0; IH0B; Ty0Correct; IH3B; Ty0Correct. - EApply ty0_conv; [ EApply ty0_bind | EApply ty0_bind | Idtac ]; XEAuto. -(* case 5.4: pr0_zeta *) - Rewrite <- H11 in H1; Rewrite <- H11 in H2; Clear H8 H9 H10 H11 b0 t2 t7 u0. - IH0; IH1BLc; Move H3 after H8; IH0Bc; Ty0Correct; Move H8 after H4; Clear H H0 H1 H3 H6 c c1 t t1; - NewInduction b. -(* case 5.4.1: Abbr *) - Ty0GenContext; Subst1Gen; LiftGen; Rewrite H in H1; Clear H x0. - EApply ty0_conv; - [ EApply ty0_bind; XEAuto | XEAuto - | EApply pc3_pr3_x; - EApply (pr3_t (TTail (Bind Abbr) u (lift (1) (0) x1))); XEAuto ]. -(* case 5.4.2: Abst *) - EqFalse. -(* case 5.4.3: Void *) - Ty0GenContext; Rewrite H0; Rewrite H0 in H2; Clear H0 t3. - LiftGen; Rewrite <- H in H1; Clear H x0. - EApply ty0_conv; [ EApply ty0_bind; XEAuto | XEAuto | XAuto ]. -(* case 6: ty0_appl *) - Intros; Inversion H5; Clear H5. -(* case 6.1: pr0_refl *) - IH0c; IH0c; EApply ty0_appl; XEAuto. -(* case 6.2: pr0_cont *) - Clear H6 H7 H8 H9 c1 k t t1 t2 t3 u1. - IH0; Ty0Correct; Ty0GenBase; IH1c; IH0; IH1c. - EApply ty0_conv; - [ EApply ty0_appl; [ XEAuto | EApply ty0_bind; XEAuto ] - | EApply ty0_appl; XEAuto - | XEAuto ]. -(* case 6.3: pr0_beta *) - Rewrite <- H7 in H1; Rewrite <- H7 in H2; Clear H6 H7 H9 c1 t t1 t2 v v1. - IH1T; IH0c; Ty0Correct; Ty0GenBase; IH0; IH1c. - Move H5 after H13; Ty0GenBase; Pc3Gen; Repeat CSub0Ty0. - EApply ty0_conv; - [ Apply ty0_appl; [ Idtac | EApply ty0_bind ] - | EApply ty0_bind - | Apply (pc3_t (TTail (Bind Abbr) v2 t0)) - ]; XEAuto. -(* case 6.4: pr0_delta *) - Rewrite <- H7 in H1; Rewrite <- H7 in H2; Clear H6 H7 H11 c1 t t1 t2 v v1. - IH1T2c; Clear H1; Ty0Correct; NonLinear; Ty0GenBase; IH1; IH0c. - Move H5 after H1; Ty0GenBase; Pc3Gen; Rewrite lift_bind in H0. - Move H1 after H0; Ty0Lift b u2; Rewrite lift_bind in H17. - Ty0GenBase. - EApply ty0_conv; - [ Apply ty0_appl; [ Idtac | EApply ty0_bind ]; XEAuto - | EApply ty0_bind; - [ Idtac - | EApply ty0_appl; [ EApply ty0_lift | EApply ty0_conv ] - | EApply ty0_appl; [ EApply ty0_lift | EApply ty0_bind ] - ]; XEAuto - | Idtac ]. - Rewrite <- lift_bind; Apply pc3_pc1; - Apply (pc1_pr0_u2 (TTail (Flat Appl) v2 (TTail (Bind b) u2 (lift (1) (0) (TTail (Bind Abst) u t0))))); XAuto. -(* case 7: ty0_cast *) - Intros; Inversion H5; Clear H5. -(* case 7.1: pr0_refl *) - IH0c; IH0c; EApply ty0_cast; XEAuto. -(* case 7.2: pr0_cont *) - Clear H6 H7 H8 H9 c1 k u1 t t1 t4 t5. - IH0; IH1c; IH1c. - EApply ty0_conv; - [ XEAuto - | EApply ty0_cast; [ EApply ty0_conv; XEAuto | XEAuto ] - | XAuto ]. -(* case 7.3: pr0_epsilon *) - XAuto. - Qed. - - End ty0_sred_cpr0_pr0. - - Section ty0_sred_pr3. (**********************************************) - - Theorem ty0_sred_pr1: (c:?; t1,t2:?) (pr1 t1 t2) -> - (g:?; t:?) (ty0 g c t1 t) -> - (ty0 g c t2 t). - Intros until 1; XElim H; Intros. -(* case 1: pr1_r *) - XAuto. -(* case 2: pr1_u *) - EApply H1; EApply ty0_sred_cpr0_pr0; XEAuto. - Qed. - - Theorem ty0_sred_pr2: (c:?; t1,t2:?) (pr2 c t1 t2) -> - (g:?; t:?) (ty0 g c t1 t) -> - (ty0 g c t2 t). - Intros until 1; XElim H; Intros. -(* case 1: pr2_free *) - EApply ty0_sred_cpr0_pr0; XEAuto. -(* case 2: pr2_u *) - EApply ty0_subst0; Try EApply ty0_sred_cpr0_pr0; XEAuto. - Qed. - -(*#* #start file *) - -(*#* #caption "general case without the reduction in the context" *) -(*#* #cap #cap c #alpha t1 in T, t2 in T1, t in T2 *) - - Theorem ty0_sred_pr3: (c:?; t1,t2:?) (pr3 c t1 t2) -> - (g:?; t:?) (ty0 g c t1 t) -> - (ty0 g c t2 t). - -(*#* #stop file *) - - Intros until 1; XElim H; Intros. -(* case 1: pr3_refl *) - XAuto. -(* case 2: pr3_sing *) - EApply H1; EApply ty0_sred_pr2; XEAuto. - Qed. - - End ty0_sred_pr3. - - Tactic Definition Ty0SRed := - Match Context With - | [ H1: (pr3 ?1 ?2 ?3); H2: (ty0 ?4 ?1 ?2 ?5) |- ? ] -> - LApply (ty0_sred_pr3 ?1 ?2 ?3); [ Intros H_x | XAuto ]; - LApply (H_x ?4 ?5); [ Clear H2 H_x; Intros | XAuto ]. - -(*#* #start file *) - -(*#* #single *) diff --git a/helm/coq-contribs/LAMBDA-TYPES/ty0_sred_props.v b/helm/coq-contribs/LAMBDA-TYPES/ty0_sred_props.v deleted file mode 100644 index 1606efc5c..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/ty0_sred_props.v +++ /dev/null @@ -1,176 +0,0 @@ -Require lift_props. -Require drop_props. -Require pc3_props. -Require pc3_gen. -Require ty0_defs. -Require ty0_gen. -Require ty0_props. -Require ty0_sred. - -(*#* #caption "corollaries of subject reduction" #clauses *) - -(*#* #stop file *) - - Section ty0_gen. (********************************************************) - - Tactic Definition IH e := - Match Context With - [ H0: (t:?; d:?) ?1 = (lift ?2 d t) -> ?; H1: ?1 = (lift ?2 ?3 ?4) |- ? ] -> - LApply (H0 ?4 ?3); [ Clear H0 H1; Intros H0 | XAuto ]; - LApply (H0 e); [ Clear H0; Intros H0 | XEAuto ]; - LApply H0; [ Clear H0; Intros H0 | XAuto ]; - XElim H0; Intros. - -(*#* #start file *) - -(*#* #caption "generation lemma for lift" *) -(*#* #cap #cap t2 #alpha c in C1, e in C2, t1 in T, x in T1, d in i *) - - Theorem ty0_gen_lift: (g:?; c:?; t1,x:?; h,d:?) - (ty0 g c (lift h d t1) x) -> - (e:?) (wf0 g e) -> (drop h d c e) -> - (EX t2 | (pc3 c (lift h d t2) x) & (ty0 g e t1 t2)). - -(*#* #stop file *) - - Intros until 1; InsertEq H '(lift h d t1); - UnIntro H d; UnIntro H t1; XElim H; Intros; - Rename x0 into t3; Rename x1 into d0. -(* case 1: ty0_conv *) - IH e; XEAuto. -(* case 2: ty0_sort *) - LiftGenBase; Rewrite H0; Clear H0 t. - EApply ex2_intro; [ Rewrite lift_sort; XAuto | XAuto ]. -(* case 3: ty0_abbr *) - Apply (lt_le_e n d0); Intros. -(* case 3.1: n < d0 *) - LiftGenBase; DropS; Rewrite H3; Clear H3 t3. - Rewrite (le_plus_minus (S n) d0); [ Idtac | XAuto ]. - Rewrite (lt_plus_minus n d0) in H5; [ DropDis; IH x1 | XAuto ]. - EApply ex2_intro; - [ Rewrite lift_d; [ EApply pc3_lift; XEAuto | XEAuto ] - | EApply ty0_abbr; XEAuto ]. -(* case 3.2: n >= d0 *) - Apply (lt_le_e n (plus d0 h)); Intros. -(* case 3.2.1: n < d0 + h *) - LiftGenBase. -(* case 3.2.2: n >= d0 + h *) - Rewrite (le_plus_minus_sym h n) in H3; [ Idtac | XEAuto ]. - LiftGenBase; DropDis; Rewrite H3; Clear H3 t3. - EApply ex2_intro; [ Idtac | EApply ty0_abbr; XEAuto ]. - Rewrite lift_free; [ Idtac | XEAuto | XAuto ]. - Rewrite <- plus_n_Sm; Rewrite <- le_plus_minus; XEAuto. -(* case 4: ty0_abst *) - Apply (lt_le_e n d0); Intros. -(* case 4.1: n < d0 *) - LiftGenBase; Rewrite H3; Clear H3 t3. - Rewrite (le_plus_minus (S n) d0); [ Idtac | XAuto ]. - Rewrite (lt_plus_minus n d0) in H5; [ DropDis; Rewrite H0; IH x1 | XAuto ]. - EApply ex2_intro; [ Rewrite lift_d | EApply ty0_abst ]; XEAuto. -(* case 4.2: n >= d0 *) - Apply (lt_le_e n (plus d0 h)); Intros. -(* case 4.2.1: n < d0 + h *) - LiftGenBase. -(* case 4.2.2: n >= d0 + h *) - Rewrite (le_plus_minus_sym h n) in H3; [ Idtac | XEAuto ]. - LiftGenBase; DropDis; Rewrite H3; Clear H3 t3. - EApply ex2_intro; [ Idtac | EApply ty0_abst; XEAuto ]. - Rewrite lift_free; [ Idtac | XEAuto | XAuto ]. - Rewrite <- plus_n_Sm; Rewrite <- le_plus_minus; XEAuto. -(* case 5: ty0_bind *) - LiftGenBase; Rewrite H5; Rewrite H8; Rewrite H8 in H2; Clear H5 t3. - Move H0 after H2; IH e; IH '(CTail e (Bind b) x0); Ty0Correct. - EApply ex2_intro; [ Rewrite lift_bind; XEAuto | XEAuto ]. -(* case 6: ty0_appl *) - LiftGenBase; Rewrite H3; Rewrite H6; Clear H3 c t3 x y. - IH e; IH e; Pc3Gen; Pc3T; Pc3Gen; Pc3T. - Move H3 after H12; Ty0Correct; Ty0SRed; Ty0GenBase; Wf0Ty0. - EApply ex2_intro; - [ Rewrite lift_flat; Apply pc3_thin_dx; - Rewrite lift_bind; Apply pc3_tail_21; [ EApply pc3_pr3_x | Idtac ] - | EApply ty0_appl; - [ EApply ty0_conv - | EApply ty0_conv; [ EApply ty0_bind | Idtac | Idtac ] ] - ]; XEAuto. -(* case 7: ty0_cast *) - LiftGenBase; Rewrite H3; Rewrite H6; Rewrite H6 in H0. - IH e; IH e; Pc3Gen; XEAuto. - Qed. - - End ty0_gen. - - Tactic Definition Ty0Gen := - Match Context With - | [ H0: (ty0 ?1 ?2 (lift ?3 ?4 ?5) ?6); - H1: (drop ?3 ?4 ?2 ?7) |- ? ] -> - LApply (ty0_gen_lift ?1 ?2 ?5 ?6 ?3 ?4); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?7); [ Clear H0; Intros H0 | XEAuto ]; - LApply H0; [ Clear H0 H1; Intros H0 | XAuto ]; - XElim H0; Intros - | [ H0: (ty0 ?1 ?2 (lift ?3 ?4 ?5) ?6); - _: (wf0 ?1 ?7) |- ? ] -> - LApply (ty0_gen_lift ?1 ?2 ?5 ?6 ?3 ?4); [ Clear H0; Intros H0 | XAuto ]; - LApply (H0 ?7); [ Clear H0; Intros H0 | XAuto ]; - LApply H0; [ Clear H0; Intros H0 | XAuto ]; - XElim H0; Intros - | _ -> Ty0GenContext. - - Section ty0_sred_props. (*************************************************) - -(*#* #start file *) - -(*#* #caption "drop preserves well-formedness" *) -(*#* #cap #alpha c in C1, e in C2, d in i *) - - Theorem wf0_drop: (c,e:?; d,h:?) (drop h d c e) -> - (g:?) (wf0 g c) -> (wf0 g e). - -(*#* #stop proof *) - - XElim c. -(* case 1: CSort *) - Intros; DropGenBase; Rewrite H; XAuto. -(* case 2: CTail k *) - Intros c IHc; XElim k; ( - XElim d; - [ XEAuto - | Intros d IHd; Intros; - DropGenBase; Rewrite H; Rewrite H1 in H0; Clear IHd H H1 e t; - Inversion H0; Clear H3 H4 b0 u ]). -(* case 2.1: Bind, d > 0 *) - Ty0Gen; XEAuto. - Qed. - -(*#* #start proof *) - -(*#* #caption "type reduction" *) -(*#* #cap #cap c, t1, t2 #alpha u in T *) - - Theorem ty0_tred: (g:?; c:?; u,t1:?) (ty0 g c u t1) -> - (t2:?) (pr3 c t1 t2) -> (ty0 g c u t2). - -(*#* #stop proof *) - - Intros; Ty0Correct; Ty0SRed; EApply ty0_conv; XEAuto. - Qed. - -(*#* #start proof *) - -(*#* #caption "subject conversion" *) -(*#* #cap #cap c, u1, u2, t1, t2 *) - - Theorem ty0_sconv: (g:?; c:?; u1,t1:?) (ty0 g c u1 t1) -> - (u2,t2:?) (ty0 g c u2 t2) -> - (pc3 c u1 u2) -> (pc3 c t1 t2). - -(*#* #stop file *) - - Intros; Pc3Unfold; Repeat Ty0SRed; XEAuto. - Qed. - - - End ty0_sred_props. - -(*#* #start file *) - -(*#* #single *) diff --git a/helm/coq-contribs/LAMBDA-TYPES/ty0_subst0.v b/helm/coq-contribs/LAMBDA-TYPES/ty0_subst0.v deleted file mode 100644 index ffd80110b..000000000 --- a/helm/coq-contribs/LAMBDA-TYPES/ty0_subst0.v +++ /dev/null @@ -1,334 +0,0 @@ -Require drop_props. -Require csubst0_defs. -Require fsubst0_defs. -Require pc3_props. -Require pc3_subst0. -Require ty0_defs. -Require ty0_gen. -Require ty0_lift. -Require ty0_props. - - Section ty0_fsubst0. (****************************************************) - -(*#* #stop macro *) - - Tactic Definition IH H0 v1 v2 v3 v4 v5 := - LApply (H0 v1 v2 v3 v4); [ Intros H_x | XEAuto ]; - LApply H_x; [ Clear H_x; Intros H_x | XEAuto ]; - LApply (H_x v5); [ Clear H_x; Intros | XEAuto ]. - - Tactic Definition IHT := - Match Context With - [ H: (i:nat; u0:T; c2:C; t2:T) (fsubst0 i u0 ?1 ?2 c2 t2) -> - (wf0 ?3 c2) -> - (e:C) (drop i (0) ?1 (CTail e (Bind Abbr) u0)) -> ?; - _: (subst0 ?4 ?5 ?2 ?6); - _: (drop ?4 (0) ?1 (CTail ?9 (Bind Abbr) ?5)) |- ? ] -> - IH H ?4 ?5 ?1 ?6 ?9. - - Tactic Definition IHTb1 := - Match Context With - [ H: (i:nat; u0:T; c2:C; t2:T) (fsubst0 i u0 (CTail ?1 (Bind ?11) ?10) ?2 c2 t2) -> - (wf0 ?3 c2) -> - (e:C) (drop i (0) (CTail ?1 (Bind ?11) ?10) (CTail e (Bind Abbr) u0)) -> ?; - _: (subst0 ?4 ?5 ?10 ?6); - _: (drop ?4 (0) ?1 (CTail ?9 (Bind Abbr) ?5)) |- ? ] -> - IH H '(S ?4) ?5 '(CTail ?1 (Bind ?11) ?6) ?2 ?9. - - Tactic Definition IHTb2 := - Match Context With - [ H: (i:nat; u0:T; c2:C; t2:T) (fsubst0 i u0 (CTail ?1 (Bind ?11) ?10) ?2 c2 t2) -> - (wf0 ?3 c2) -> - (e:C) (drop i (0) (CTail ?1 (Bind ?11) ?10) (CTail e (Bind Abbr) u0)) -> ?; - _: (subst0 (s (Bind ?11) ?4) ?5 ?2 ?6); - _: (drop ?4 (0) ?1 (CTail ?9 (Bind Abbr) ?5)) |- ? ] -> - IH H '(S ?4) ?5 '(CTail ?1 (Bind ?11) ?10) ?6 ?9. - - Tactic Definition IHC := - Match Context With - [ H: (i:nat; u0:T; c2:C; t2:T) (fsubst0 i u0 ?1 ?2 c2 t2) -> - (wf0 ?3 c2) -> - (e:C) (drop i (0) ?1 (CTail e (Bind Abbr) u0)) -> ?; - _: (csubst0 ?4 ?5 ?1 ?6); - _: (drop ?4 (0) ?1 (CTail ?9 (Bind Abbr) ?5)) |- ? ] -> - IH H ?4 ?5 ?6 ?2 ?9. - - Tactic Definition IHCb := - Match Context With - [ H: (i:nat; u0:T; c2:C; t2:T) (fsubst0 i u0 (CTail ?1 (Bind ?11) ?10) ?2 c2 t2) -> - (wf0 ?3 c2) -> - (e:C) (drop i (0) (CTail ?1 (Bind ?11) ?10) (CTail e (Bind Abbr) u0)) -> ?; - _: (csubst0 ?4 ?5 ?1 ?6); - _: (drop ?4 (0) ?1 (CTail ?9 (Bind Abbr) ?5)) |- ? ] -> - IH H '(S ?4) ?5 '(CTail ?6 (Bind ?11) ?10) ?2 ?9. - - Tactic Definition IHTTb := - Match Context With - [ H: (i:nat; u0:T; c2:C; t2:T) (fsubst0 i u0 (CTail ?1 (Bind ?11) ?10) ?2 c2 t2) -> - (wf0 ?3 c2) -> - (e:C) (drop i (0) (CTail ?1 (Bind ?11) ?10) (CTail e (Bind Abbr) u0)) -> ?; - _: (subst0 ?4 ?5 ?10 ?6); - _: (subst0 (s (Bind ?11) ?4) ?5 ?2 ?7); - _: (drop ?4 (0) ?1 (CTail ?9 (Bind Abbr) ?5)) |- ? ] -> - IH H '(S ?4) ?5 '(CTail ?1 (Bind ?11) ?6) ?7 ?9. - - Tactic Definition IHCT := - Match Context With - [ H: (i:nat; u0:T; c2:C; t2:T) (fsubst0 i u0 ?1 ?2 c2 t2) -> - (wf0 ?3 c2) -> - (e:C) (drop i (0) ?1 (CTail e (Bind Abbr) u0)) -> ?; - _: (csubst0 ?4 ?5 ?1 ?6); - _: (subst0 ?4 ?5 ?2 ?7); - _: (drop ?4 (0) ?1 (CTail ?9 (Bind Abbr) ?5)) |- ? ] -> - IH H ?4 ?5 ?6 ?7 ?9. - - Tactic Definition IHCTb1 := - Match Context With - [ H: (i:nat; u0:T; c2:C; t2:T) (fsubst0 i u0 (CTail ?1 (Bind ?11) ?10) ?2 c2 t2) -> - (wf0 ?3 c2) -> - (e:C) (drop i (0) (CTail ?1 (Bind ?11) ?10) (CTail e (Bind Abbr) u0)) -> ?; - _: (csubst0 ?4 ?5 ?1 ?6); - _: (subst0 ?4 ?5 ?10 ?7); - _: (drop ?4 (0) ?1 (CTail ?9 (Bind Abbr) ?5)) |- ? ] -> - IH H '(S ?4) ?5 '(CTail ?6 (Bind ?11) ?7) ?2 ?9. - - Tactic Definition IHCTb2 := - Match Context With - [ H: (i:nat; u0:T; c2:C; t2:T) (fsubst0 i u0 (CTail ?1 (Bind ?11) ?10) ?2 c2 t2) -> - (wf0 ?3 c2) -> - (e:C) (drop i (0) (CTail ?1 (Bind ?11) ?10) (CTail e (Bind Abbr) u0)) -> ?; - _: (csubst0 ?4 ?5 ?1 ?6); - _: (subst0 (s (Bind ?11) ?4) ?5 ?2 ?7); - _: (drop ?4 (0) ?1 (CTail ?9 (Bind Abbr) ?5)) |- ? ] -> - IH H '(S ?4) ?5 '(CTail ?6 (Bind ?11) ?10) ?7 ?9. - - Tactic Definition IHCTTb := - Match Context With - [ H: (i:nat; u0:T; c2:C; t2:T) (fsubst0 i u0 (CTail ?1 (Bind ?11) ?10) ?2 c2 t2) -> - (wf0 ?3 c2) -> - (e:C) (drop i (0) (CTail ?1 (Bind ?11) ?10) (CTail e (Bind Abbr) u0)) -> ?; - _: (csubst0 ?4 ?5 ?1 ?6); - _: (subst0 ?4 ?5 ?10 ?7); - _: (subst0 (s (Bind ?11) ?4) ?5 ?2 ?8); - _: (drop ?4 (0) ?1 (CTail ?9 (Bind Abbr) ?5)) |- ? ] -> - IH H '(S ?4) ?5 '(CTail ?6 (Bind ?11) ?7) ?8 ?9. - -(*#* #start macro *) - -(*#* #caption "substitution preserves types" *) -(*#* #cap #cap c1, c2, e, t1, t2, t #alpha u in V *) - -(* NOTE: This breaks the mutual recursion between ty0_subst0 and ty0_csubst0 *) - Theorem ty0_fsubst0: (g:?; c1:?; t1,t:?) (ty0 g c1 t1 t) -> - (i:?; u,c2,t2:?) (fsubst0 i u c1 t1 c2 t2) -> - (wf0 g c2) -> - (e:?) (drop i (0) c1 (CTail e (Bind Abbr) u)) -> - (ty0 g c2 t2 t). - -(*#* #stop file *) - - Intros until 1; XElim H. -(* case 1: ty0_conv *) - Intros until 6; XElim H4; Intros. -(* case 1.1: fsubst0_snd *) - IHT; EApply ty0_conv; XEAuto. -(* case 1.2: fsubst0_fst *) - IHC; EApply ty0_conv; Try EApply pc3_fsubst0; XEAuto. -(* case 1.3: fsubst0_both *) - IHCT; IHCT; EApply ty0_conv; Try EApply pc3_fsubst0; XEAuto. -(* case 2: ty0_sort *) - Intros until 2; XElim H0; Intros. -(* case 2.1: fsubst0_snd *) - Subst0GenBase. -(* case 2.2: fsubst0_fst *) - XAuto. -(* case 2.3: fsubst0_both *) - Subst0GenBase. -(* case 3: ty0_abbr *) - Intros until 5; XElim H3; Intros; Clear c1 c2 t t1 t2. -(* case 3.1: fsubst0_snd *) - Subst0GenBase; Rewrite H6; Rewrite <- H3 in H5; Clear H3 H6 i t3. - DropDis; Inversion H5; Rewrite <- H6 in H0; Rewrite H7 in H1; XEAuto. -(* case 3.2: fsubst0_fst *) - Apply (lt_le_e n i); Intros; CSubst0Drop. -(* case 3.2.1: n < i, none *) - EApply ty0_abbr; XEAuto. -(* case 3.2.2: n < i, csubst0_snd *) - Inversion H0; CSubst0Drop. - Rewrite <- H10 in H7; Rewrite <- H11 in H7; Rewrite <- H11 in H8; Rewrite <- H12 in H8; - Clear H0 H10 H11 H12 x0 x1 x2. - DropDis; Rewrite minus_x_Sy in H0; [ DropGenBase | XAuto ]. - IHT; EApply ty0_abbr; XEAuto. -(* case 3.2.3: n < i, csubst0_fst *) - Inversion H0; CSubst0Drop. - Rewrite <- H10 in H8; Rewrite <- H11 in H7; Rewrite <- H11 in H8; Rewrite <- H12 in H7; - Clear H0 H10 H11 H12 x0 x1 x3. - DropDis; Rewrite minus_x_Sy in H0; [ DropGenBase; CSubst0Drop | XAuto ]. - IHC; EApply ty0_abbr; XEAuto. -(* case 3.2.4: n < i, csubst0_both *) - Inversion H0; CSubst0Drop. - Rewrite <- H11 in H9; Rewrite <- H12 in H7; Rewrite <- H12 in H8; Rewrite <- H12 in H9; Rewrite <- H13 in H8; - Clear H0 H11 H12 H13 x0 x1 x3. - DropDis; Rewrite minus_x_Sy in H0; [ DropGenBase; CSubst0Drop | XAuto ]. - IHCT; EApply ty0_abbr; XEAuto. -(* case 3.2.5: n >= i *) - EApply ty0_abbr; XEAuto. -(* case 3.3: fsubst0_both *) - Subst0GenBase; Rewrite H7; Rewrite <- H3 in H4; Rewrite <- H3 in H6; Clear H3 H7 i t3. - DropDis; Inversion H6; Rewrite <- H7 in H0; Rewrite H8 in H1. - CSubst0Drop; XEAuto. -(* case 4: ty0_abst *) - Intros until 5; XElim H3; Intros; Clear c1 c2 t t1 t2. -(* case 4.1: fsubst0_snd *) - Subst0GenBase; Rewrite H3 in H0; DropDis; Inversion H0. -(* case 4.2: fsubst0_fst *) - Apply (lt_le_e n i); Intros; CSubst0Drop. -(* case 4.2.1: n < i, none *) - EApply ty0_abst; XEAuto. -(* case 4.2.2: n < i, csubst0_snd *) - Inversion H0; CSubst0Drop. - Rewrite <- H10 in H7; Rewrite <- H11 in H7; Rewrite <- H11 in H8; Rewrite <- H12 in H8; Rewrite <- H12; - Clear H0 H10 H11 H12 x0 x1 x2. - DropDis; Rewrite minus_x_Sy in H0; [ DropGenBase | XAuto ]. - IHT; EApply ty0_conv; - [ EApply ty0_lift | EApply ty0_abst | EApply pc3_lift ]; XEAuto. -(* case 4.2.3: n < i, csubst0_fst *) - Inversion H0; CSubst0Drop. - Rewrite <- H10 in H8; Rewrite <- H11 in H7; Rewrite <- H11 in H8; Rewrite <- H12 in H7; Rewrite <- H12; - Clear H0 H10 H11 H12 x0 x1 x3. - DropDis; Rewrite minus_x_Sy in H0; [ DropGenBase; CSubst0Drop | XAuto ]. - IHC; EApply ty0_abst; XEAuto. -(* case 4.2.4: n < i, csubst0_both *) - Inversion H0; CSubst0Drop. - Rewrite <- H11 in H9; Rewrite <- H12 in H7; Rewrite <- H12 in H8; Rewrite <- H12 in H9; Rewrite <- H13 in H8; Rewrite <- H13; - Clear H0 H11 H12 H13 x0 x1 x3. - DropDis; Rewrite minus_x_Sy in H0; [ DropGenBase; CSubst0Drop | XAuto ]. - IHCT; IHC; EApply ty0_conv; - [ EApply ty0_lift | EApply ty0_abst - | EApply pc3_lift; Try EApply pc3_fsubst0; Try Apply H0 - ]; XEAuto. -(* case 4.2.4: n >= i *) - EApply ty0_abst; XEAuto. -(* case 4.3: fsubst0_both *) - Subst0GenBase; Rewrite H3 in H0; DropDis; Inversion H0. -(* case 5: ty0_bind *) - Intros until 7; XElim H5; Intros; Clear H4. -(* case 5.1: fsubst0_snd *) - Subst0GenBase; Rewrite H4; Clear H4 t6. -(* case 5.1.1: subst0 on left argument *) - Ty0Correct; IHT; IHTb1; Ty0Correct. - EApply ty0_conv; - [ EApply ty0_bind | EApply ty0_bind | EApply pc3_fsubst0 ]; XEAuto. -(* case 5.1.2: subst0 on right argument *) - IHTb2; Ty0Correct; EApply ty0_bind; XEAuto. -(* case 5.1.3: subst0 on both arguments *) - Ty0Correct; IHT; IHTb1; IHTTb; Ty0Correct. - EApply ty0_conv; - [ EApply ty0_bind | EApply ty0_bind | EApply pc3_fsubst0 ]; XEAuto. -(* case 5.2: fsubst0_fst *) - IHC; IHCb; Ty0Correct; EApply ty0_bind; XEAuto. -(* case 5.3: fsubst0_both *) - Subst0GenBase; Rewrite H4; Clear H4 t6. -(* case 5.3.1: subst0 on left argument *) - IHC; IHCb; Ty0Correct; Ty0Correct; IHCT; IHCTb1; Ty0Correct. - EApply ty0_conv; - [ EApply ty0_bind | EApply ty0_bind - | EApply pc3_fsubst0; [ Idtac | Idtac | XEAuto ] ]; XEAuto. -(* case 5.3.2: subst0 on right argument *) - IHC; IHCTb2; Ty0Correct; EApply ty0_bind; XEAuto. -(* case 5.3.3: subst0 on both arguments *) - IHC; IHCb; Ty0Correct; Ty0Correct; IHCT; IHCTTb; Ty0Correct. - EApply ty0_conv; - [ EApply ty0_bind | EApply ty0_bind - | EApply pc3_fsubst0; [ Idtac | Idtac | XEAuto ] ]; XEAuto. -(* case 6: ty0_appl *) - Intros until 5; XElim H3; Intros. -(* case 6.1: fsubst0_snd *) - Subst0GenBase; Rewrite H3; Clear H3 c1 c2 t t1 t2 t3. -(* case 6.1.1: subst0 on left argument *) - Ty0Correct; Ty0GenBase; IHT; Ty0Correct. - EApply ty0_conv; - [ EApply ty0_appl | EApply ty0_appl | EApply pc3_fsubst0 ]; XEAuto. -(* case 6.1.2: subst0 on right argument *) - IHT; EApply ty0_appl; XEAuto. -(* case 6.1.3: subst0 on both arguments *) - Ty0Correct; Ty0GenBase; Move H after H10; Ty0Correct; IHT; Clear H2; IHT. - EApply ty0_conv; - [ EApply ty0_appl | EApply ty0_appl | EApply pc3_fsubst0 ]; XEAuto. -(* case 6.2: fsubst0_fst *) - IHC; Clear H2; IHC; EApply ty0_appl; XEAuto. -(* case 6.3: fsubst0_both *) - Subst0GenBase; Rewrite H3; Clear H3 c1 c2 t t1 t2 t3. -(* case 6.3.1: subst0 on left argument *) - IHC; Ty0Correct; Ty0GenBase; Clear H2; IHC; IHCT. - EApply ty0_conv; - [ EApply ty0_appl | EApply ty0_appl - | EApply pc3_fsubst0; [ Idtac | Idtac | XEAuto ] ]; XEAuto. -(* case 6.3.2: subst0 on right argument *) - IHCT; Clear H2; IHC; EApply ty0_appl; XEAuto. -(* case 6.3.3: subst0 on both arguments *) - IHC; Ty0Correct; Ty0GenBase; IHCT; Clear H2; IHC; Ty0Correct; IHCT. - EApply ty0_conv; - [ EApply ty0_appl | EApply ty0_appl - | EApply pc3_fsubst0; [ Idtac | Idtac | XEAuto ] ]; XEAuto. -(* case 7: ty0_cast *) - Clear c1 t t1; Intros until 5; XElim H3; Intros; Clear c2 t3. -(* case 7.1: fsubst0_snd *) - Subst0GenBase; Rewrite H3; Clear H3 t4. -(* case 7.1.1: subst0 on left argument *) - IHT; EApply ty0_conv; - [ Idtac - | EApply ty0_cast; - [ EApply ty0_conv; [ Idtac | Idtac | Apply pc3_s; EApply pc3_fsubst0 ] - | Idtac ] - | EApply pc3_fsubst0 ]; XEAuto. -(* case 7.1.2: subst0 on right argument *) - IHT; EApply ty0_cast; XEAuto. -(* case 7.1.3: subst0 on both arguments *) - IHT; Clear H2; IHT. - EApply ty0_conv; - [ Idtac - | EApply ty0_cast; - [ EApply ty0_conv; [ Idtac | Idtac | Apply pc3_s; EApply pc3_fsubst0 ] - | Idtac ] - | EApply pc3_fsubst0 ]; XEAuto. -(* case 7.2: fsubst0_fst *) - IHC; Clear H2; IHC; EApply ty0_cast; XEAuto. -(* case 6.3: fsubst0_both *) - Subst0GenBase; Rewrite H3; Clear H3 t4. -(* case 7.3.1: subst0 on left argument *) - IHC; IHCT; Clear H2; IHC. - EApply ty0_conv; - [ Idtac - | EApply ty0_cast; - [ EApply ty0_conv; [ Idtac | Idtac | Apply pc3_s; EApply pc3_fsubst0; [ Idtac | Idtac | XEAuto ] ] - | Idtac ] - | EApply pc3_fsubst0; [ Idtac | Idtac | XEAuto ] ]; XEAuto. -(* case 7.3.2: subst0 on right argument *) - IHCT; IHC; EApply ty0_cast; XEAuto. -(* case 7.3.3: subst0 on both arguments *) - IHC; IHCT; Clear H2; IHCT. - EApply ty0_conv; - [ Idtac - | EApply ty0_cast; - [ EApply ty0_conv; [ Idtac | Idtac | Apply pc3_s; EApply pc3_fsubst0; [ Idtac | Idtac | XEAuto ] ] - | Idtac ] - | EApply pc3_fsubst0; [ Idtac | Idtac | XEAuto ] ]; XEAuto. - Qed. - - Theorem ty0_csubst0: (g:?; c1:?; t1,t2:?) (ty0 g c1 t1 t2) -> - (e:?; u:?; i:?) (drop i (0) c1 (CTail e (Bind Abbr) u)) -> - (c2:?) (wf0 g c2) -> (csubst0 i u c1 c2) -> - (ty0 g c2 t1 t2). - Intros; EApply ty0_fsubst0; XEAuto. - Qed. - - Theorem ty0_subst0: (g:?; c:?; t1,t:?) (ty0 g c t1 t) -> - (e:?; u:?; i:?) (drop i (0) c (CTail e (Bind Abbr) u)) -> - (t2:?) (subst0 i u t1 t2) -> (ty0 g c t2 t). - Intros; EApply ty0_fsubst0; XEAuto. - Qed. - - End ty0_fsubst0. - - Hints Resolve ty0_subst0 : ltlc. diff --git a/helm/www/lambdadelta/download/lambdadelta_1.tar.gz b/helm/www/lambdadelta/download/lambdadelta_1.tar.gz index 89e3231ec10d5f6104e50b6209a95ed4fa499a55..17df0b09ccbd65bbd22fdaf7210f551f27713277 100644 GIT binary patch literal 101088 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
3<`Y*hCx*r*8V$%0`X1^zqDN_oCkV^}l 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
+a*a8NbrLg3pbOd| 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 literal 95172 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

yE3lC3)~US{IN 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 UVJ)i6lnVz_=G!u2 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

lambdadelta_1 for Coq 7.3.1 - (revised 2012-10). + (revised 2015-01). Source scripts.
@@ -303,6 +303,6 @@

-
Last update: Mon, 05 Jan 2015 00:32:03 +0100
+
Last update: Sun, 11 Jan 2015 18:32:40 +0100
diff --git a/helm/www/lambdadelta/web/home/specification.ldw.xml b/helm/www/lambdadelta/web/home/specification.ldw.xml index 2bab97a07..2206980bb 100644 --- a/helm/www/lambdadelta/web/home/specification.ldw.xml +++ b/helm/www/lambdadelta/web/home/specification.ldw.xml @@ -84,7 +84,7 @@ lambdadelta_1 for Coq 7.3.1 - (revised ). + (revised ). Source scripts. -- 2.39.2

6&PpO{KHj%2wnMaP;TQiyB#fv6?lqm(l^6e&2 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