1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| The HELM team. *)
8 (* ||A|| http://helm.cs.unibo.it *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU General Public License Version 2 *)
13 (**************************************************************************)
15 include "apps_2/models/model_vpush.ma".
17 (* MODEL ********************************************************************)
19 record is_model (M): Prop ≝ {
20 (* Note: equivalence: reflexivity *)
21 mr: reflexive … (sq M);
22 (* Note: equivalence: compatibility *)
23 mq: replace_2 … (sq M) (sq M) (sq M);
24 (* Note: application: compatibility *)
25 mp: compatible_3 … (ap M) (sq M) (sq M) (sq M);
26 (* Note: interpretation: sort *)
27 ms: ∀gv,lv,s. ⟦⋆s⟧{M}[gv, lv] ≗ sv M s;
28 (* Note: interpretation: local reference *)
29 ml: ∀gv,lv,i. ⟦#i⟧{M}[gv, lv] ≗ lv i;
30 (* Note: interpretation: global reference *)
31 mg: ∀gv,lv,l. ⟦§l⟧{M}[gv, lv] ≗ gv l;
32 (* Note: interpretation: local δ-equivalence *)
33 md: ∀gv,lv,p,V,T. ⟦ⓓ{p}V.T⟧{M}[gv, lv] ≗ ⟦T⟧[gv, ⫯[0←⟦V⟧[gv, lv]]lv];
34 (* Note: interpretation: intensional abstraction *)
35 mi: ∀gv1,gv2,lv1,lv2,p,W,T. ⟦W⟧{M}[gv1, lv1] ≗ ⟦W⟧{M}[gv2, lv2] →
36 (∀d. ⟦T⟧{M}[gv1, ⫯[0←d]lv1] ≗ ⟦T⟧{M}[gv2, ⫯[0←d]lv2]) →
37 ⟦ⓛ{p}W.T⟧[gv1, lv1] ≗ ⟦ⓛ{p}W.T⟧[gv2, lv2];
38 (* Note: interpretation: application *)
39 ma: ∀gv,lv,V,T. ⟦ⓐV.T⟧{M}[gv, lv] ≗ ⟦V⟧[gv, lv] @ ⟦T⟧[gv, lv];
40 (* Note: interpretation: ϵ-equivalence *)
41 me: ∀gv,lv,W,T. ⟦ⓝW.T⟧{M}[gv, lv] ≗ ⟦T⟧[gv, lv];
42 (* Note: interpretation: β-requivalence *)
43 mb: ∀gv,lv,d,p,W,T. d @ ⟦ⓛ{p}W.T⟧{M}[gv, lv] ≗ ⟦T⟧[gv, ⫯[0←d]lv]
46 record is_extensional (M): Prop ≝ {
47 (* Note: interpretation: extensional abstraction *)
48 mx: ∀gv1,gv2,lv1,lv2,p,W1,W2,T1,T2. ⟦W1⟧{M}[gv1, lv1] ≗ ⟦W2⟧{M}[gv2, lv2] →
49 (∀d. ⟦T1⟧{M}[gv1, ⫯[0←d]lv1] ≗ ⟦T2⟧{M}[gv2, ⫯[0←d]lv2]) →
50 ⟦ⓛ{p}W1.T1⟧[gv1, lv1] ≗ ⟦ⓛ{p}W2.T2⟧[gv2, lv2]
53 (* Basic properties *********************************************************)
55 lemma seq_sym (M): is_model M → symmetric … (sq M).
56 /3 width=5 by mq, mr/ qed-.
58 lemma seq_trans (M): is_model M → Transitive … (sq M).
59 /3 width=5 by mq, mr/ qed-.
61 lemma seq_canc_sn (M): is_model M → left_cancellable … (sq M).
62 /3 width=3 by seq_trans, seq_sym/ qed-.
64 lemma seq_canc_dx (M): is_model M → right_cancellable … (sq M).
65 /3 width=3 by seq_trans, seq_sym/ qed-.
67 lemma ti_lref_vpush_eq (M): is_model M →
68 ∀gv,lv,d,i. ⟦#i⟧[gv,⫯[i←d]lv] ≗{M} d.
70 @(seq_trans … HM) [2: @ml // | skip ]
71 >vpush_eq /2 width=1 by mr/
74 lemma ti_lref_vpush_gt (M): is_model M →
75 ∀gv,lv,d,i. ⟦#(↑i)⟧[gv,⫯[0←d]lv] ≗{M} ⟦#i⟧[gv,lv].
77 @(mq … HM) [4,5: @(seq_sym … HM) /2 width=2 by ml/ |1,2: skip ]
78 >vpush_gt /2 width=1 by mr/
81 (* Basic Forward lemmas *****************************************************)
83 lemma ti_fwd_mx_dx (M): is_model M →
84 ∀gv1,gv2,lv1,lv2,p,W1,W2,T1,T2.
85 ⟦ⓛ{p}W1.T1⟧[gv1, lv1] ≗ ⟦ⓛ{p}W2.T2⟧[gv2, lv2] →
86 ∀d. ⟦T1⟧{M}[gv1, ⫯[0←d]lv1] ≗ ⟦T2⟧{M}[gv2, ⫯[0←d]lv2].
87 #M #HM #gv1 #gv2 #lv1 #lv2 #p #W1 #W2 #T1 #T2 #H12 #d
88 @(mq … HM) /3 width=5 by mb, mp, mr/