Welcome to Abella 2.0.5-dev
Abella < Specification "trans".
Reading specification "/home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/./trans" (from "/home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/.")
Abella < Set types on.
Abella < Import "eval".
Importing from /home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/./eval
Abella < Import "cc_typ_pres".
Importing from /home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/./cc_typ_pres
Abella < Import "subst".
Importing from /home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/./subst
Abella < Define sim_cc : ty -> nat -> tm -> tm' -> prop,
equiv_cc : ty -> nat -> tm -> tm' -> prop by
sim_cc T K M M' := forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V');
equiv_cc tnat K (nat N) (nat' N);
equiv_cc tunit K unit unit';
equiv_cc (prod T1 T2) K (pair V1 V2) (pair' V1' V2') := equiv_cc T1 K V1 V1' /\ equiv_cc T2 K V2 V2';
equiv_cc (arr T1 T2) z (fix R) (clos' (abs' R') VE) := {val' VE} /\ {tm (fix R)} /\ {tm' (clos' (abs' R') VE)};
equiv_cc (arr T1 T2) (s K) (fix R) (clos' (abs' R') VE) := equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) /\
(forall V1 V1' V2 V2', equiv_cc T1 K V1 V1' ->
equiv_cc (arr T1 T2) K V2 V2' ->
sim_cc T2 K (R V2 V1) (R' (pair' V2' (pair' V1' VE)))).
Warning: Definition might not be stratified
("equiv_cc" occurs to the left of ->)
Abella < Theorem equiv_cc_val :
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {val V}.
============================
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {val V}
equiv_cc_val < induction on 1.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
============================
forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv_cc T K V V' -> {val V}
equiv_cc_val < induction on 2.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
============================
forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv_cc T K V V' -> {val V}
equiv_cc_val < intros.
Variables:
K : nat
V : tm
V' : tm'
T : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv_cc T K V V'
============================
{val V}
equiv_cc_val < case H1 (keep).
Subgoal 1:
Variables:
K : nat
V : tm
V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv_cc tnat K V V'
============================
{val V}
Subgoal 2 is:
{val V}
Subgoal 3 is:
{val V}
Subgoal 4 is:
{val V}
equiv_cc_val < case H3.
Subgoal 1:
Variables:
K,N : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
============================
{val (nat N)}
Subgoal 2 is:
{val V}
Subgoal 3 is:
{val V}
Subgoal 4 is:
{val V}
equiv_cc_val < search.
Subgoal 2:
Variables:
K : nat
V : tm
V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv_cc tunit K V V'
============================
{val V}
Subgoal 3 is:
{val V}
Subgoal 4 is:
{val V}
equiv_cc_val < case H3.
Subgoal 2:
Variables:
K : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
============================
{val unit}
Subgoal 3 is:
{val V}
Subgoal 4 is:
{val V}
equiv_cc_val < search.
Subgoal 3:
Variables:
K : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val V}
Subgoal 4 is:
{val V}
equiv_cc_val < case H3.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
============================
{val (pair V1 V2)}
Subgoal 4 is:
{val V}
equiv_cc_val < apply IH to H4 H2 _.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {val V1}
============================
{val (pair V1 V2)}
Subgoal 4 is:
{val V}
equiv_cc_val < apply IH to H5 H2 _.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {val V1}
H9 : {val V2}
============================
{val (pair V1 V2)}
Subgoal 4 is:
{val V}
equiv_cc_val < search.
Subgoal 4:
Variables:
K : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val V}
equiv_cc_val < case H2.
Subgoal 4.1:
Variables:
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val V}
Subgoal 4.2 is:
{val V}
equiv_cc_val < case H3.
Subgoal 4.1:
Variables:
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {val' VE}
H7 : {tm (fix R)}
H8 : {tm' (clos' (abs' R') VE)}
============================
{val (fix R)}
Subgoal 4.2 is:
{val V}
equiv_cc_val < search.
Subgoal 4.2:
Variables:
N : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
{val V}
equiv_cc_val < case H3.
Subgoal 4.2:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{val (fix R)}
equiv_cc_val < apply IH1 to H1 H6 H7.
Subgoal 4.2:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {val (fix R)}
============================
{val (fix R)}
equiv_cc_val < search.
Proof completed.
Abella < Theorem equiv_cc_val' :
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {val' V'}.
============================
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {val' V'}
equiv_cc_val' < induction on 1.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
============================
forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv_cc T K V V' -> {val' V'}
equiv_cc_val' < induction on 2.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
============================
forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv_cc T K V V' ->
{val' V'}
equiv_cc_val' < intros.
Variables:
K : nat
V : tm
V' : tm'
T : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv_cc T K V V'
============================
{val' V'}
equiv_cc_val' < case H1 (keep).
Subgoal 1:
Variables:
K : nat
V : tm
V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv_cc tnat K V V'
============================
{val' V'}
Subgoal 2 is:
{val' V'}
Subgoal 3 is:
{val' V'}
Subgoal 4 is:
{val' V'}
equiv_cc_val' < case H3.
Subgoal 1:
Variables:
K,N : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
============================
{val' (nat' N)}
Subgoal 2 is:
{val' V'}
Subgoal 3 is:
{val' V'}
Subgoal 4 is:
{val' V'}
equiv_cc_val' < search.
Subgoal 2:
Variables:
K : nat
V : tm
V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv_cc tunit K V V'
============================
{val' V'}
Subgoal 3 is:
{val' V'}
Subgoal 4 is:
{val' V'}
equiv_cc_val' < case H3.
Subgoal 2:
Variables:
K : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
============================
{val' unit'}
Subgoal 3 is:
{val' V'}
Subgoal 4 is:
{val' V'}
equiv_cc_val' < search.
Subgoal 3:
Variables:
K : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val' V'}
Subgoal 4 is:
{val' V'}
equiv_cc_val' < case H3.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
============================
{val' (pair' V1' V2')}
Subgoal 4 is:
{val' V'}
equiv_cc_val' < apply IH to H4 H2 _.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {val' V1'}
============================
{val' (pair' V1' V2')}
Subgoal 4 is:
{val' V'}
equiv_cc_val' < apply IH to H5 H2 _.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {val' V1'}
H9 : {val' V2'}
============================
{val' (pair' V1' V2')}
Subgoal 4 is:
{val' V'}
equiv_cc_val' < search.
Subgoal 4:
Variables:
K : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val' V'}
equiv_cc_val' < case H2.
Subgoal 4.1:
Variables:
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val' V'}
Subgoal 4.2 is:
{val' V'}
equiv_cc_val' < case H3.
Subgoal 4.1:
Variables:
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {val' VE}
H7 : {tm (fix R)}
H8 : {tm' (clos' (abs' R') VE)}
============================
{val' (clos' (abs' R') VE)}
Subgoal 4.2 is:
{val' V'}
equiv_cc_val' < search.
Subgoal 4.2:
Variables:
N : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
{val' V'}
equiv_cc_val' < case H3.
Subgoal 4.2:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{val' (clos' (abs' R') VE)}
equiv_cc_val' < apply IH1 to H1 H6 H7.
Subgoal 4.2:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{val' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {val' (clos' (abs' R') VE)}
============================
{val' (clos' (abs' R') VE)}
equiv_cc_val' < search.
Proof completed.
Abella < Theorem equiv_cc_tm :
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {tm V}.
============================
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {tm V}
equiv_cc_tm < induction on 1.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
============================
forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv_cc T K V V' -> {tm V}
equiv_cc_tm < induction on 2.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
============================
forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv_cc T K V V' -> {tm V}
equiv_cc_tm < intros.
Variables:
K : nat
V : tm
V' : tm'
T : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv_cc T K V V'
============================
{tm V}
equiv_cc_tm < case H1 (keep).
Subgoal 1:
Variables:
K : nat
V : tm
V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv_cc tnat K V V'
============================
{tm V}
Subgoal 2 is:
{tm V}
Subgoal 3 is:
{tm V}
Subgoal 4 is:
{tm V}
equiv_cc_tm < case H3.
Subgoal 1:
Variables:
K,N : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
============================
{tm (nat N)}
Subgoal 2 is:
{tm V}
Subgoal 3 is:
{tm V}
Subgoal 4 is:
{tm V}
equiv_cc_tm < search.
Subgoal 2:
Variables:
K : nat
V : tm
V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv_cc tunit K V V'
============================
{tm V}
Subgoal 3 is:
{tm V}
Subgoal 4 is:
{tm V}
equiv_cc_tm < case H3.
Subgoal 2:
Variables:
K : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
============================
{tm unit}
Subgoal 3 is:
{tm V}
Subgoal 4 is:
{tm V}
equiv_cc_tm < search.
Subgoal 3:
Variables:
K : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm V}
Subgoal 4 is:
{tm V}
equiv_cc_tm < case H3.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
============================
{tm (pair V1 V2)}
Subgoal 4 is:
{tm V}
equiv_cc_tm < apply IH to H4 H2 _.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {tm V1}
============================
{tm (pair V1 V2)}
Subgoal 4 is:
{tm V}
equiv_cc_tm < apply IH to H5 H2 _.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {tm V1}
H9 : {tm V2}
============================
{tm (pair V1 V2)}
Subgoal 4 is:
{tm V}
equiv_cc_tm < search.
Subgoal 4:
Variables:
K : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm V}
equiv_cc_tm < case H2.
Subgoal 4.1:
Variables:
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm V}
Subgoal 4.2 is:
{tm V}
equiv_cc_tm < case H3.
Subgoal 4.1:
Variables:
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {val' VE}
H7 : {tm (fix R)}
H8 : {tm' (clos' (abs' R') VE)}
============================
{tm (fix R)}
Subgoal 4.2 is:
{tm V}
equiv_cc_tm < search.
Subgoal 4.2:
Variables:
N : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
{tm V}
equiv_cc_tm < case H3.
Subgoal 4.2:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{tm (fix R)}
equiv_cc_tm < apply IH1 to H1 H6 H7.
Subgoal 4.2:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {tm (fix R)}
============================
{tm (fix R)}
equiv_cc_tm < search.
Proof completed.
Abella < Theorem equiv_cc_tm' :
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {tm' V'}.
============================
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {tm' V'}
equiv_cc_tm' < induction on 1.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
============================
forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv_cc T K V V' -> {tm' V'}
equiv_cc_tm' < induction on 2.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
============================
forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv_cc T K V V' ->
{tm' V'}
equiv_cc_tm' < intros.
Variables:
K : nat
V : tm
V' : tm'
T : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv_cc T K V V'
============================
{tm' V'}
equiv_cc_tm' < case H1 (keep).
Subgoal 1:
Variables:
K : nat
V : tm
V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv_cc tnat K V V'
============================
{tm' V'}
Subgoal 2 is:
{tm' V'}
Subgoal 3 is:
{tm' V'}
Subgoal 4 is:
{tm' V'}
equiv_cc_tm' < case H3.
Subgoal 1:
Variables:
K,N : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
============================
{tm' (nat' N)}
Subgoal 2 is:
{tm' V'}
Subgoal 3 is:
{tm' V'}
Subgoal 4 is:
{tm' V'}
equiv_cc_tm' < search.
Subgoal 2:
Variables:
K : nat
V : tm
V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv_cc tunit K V V'
============================
{tm' V'}
Subgoal 3 is:
{tm' V'}
Subgoal 4 is:
{tm' V'}
equiv_cc_tm' < case H3.
Subgoal 2:
Variables:
K : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
============================
{tm' unit'}
Subgoal 3 is:
{tm' V'}
Subgoal 4 is:
{tm' V'}
equiv_cc_tm' < search.
Subgoal 3:
Variables:
K : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm' V'}
Subgoal 4 is:
{tm' V'}
equiv_cc_tm' < case H3.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
============================
{tm' (pair' V1' V2')}
Subgoal 4 is:
{tm' V'}
equiv_cc_tm' < apply IH to H4 H2 _.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {tm' V1'}
============================
{tm' (pair' V1' V2')}
Subgoal 4 is:
{tm' V'}
equiv_cc_tm' < apply IH to H5 H2 _.
Subgoal 3:
Variables:
K : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {tm' V1'}
H9 : {tm' V2'}
============================
{tm' (pair' V1' V2')}
Subgoal 4 is:
{tm' V'}
equiv_cc_tm' < search.
Subgoal 4:
Variables:
K : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm' V'}
equiv_cc_tm' < case H2.
Subgoal 4.1:
Variables:
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm' V'}
Subgoal 4.2 is:
{tm' V'}
equiv_cc_tm' < case H3.
Subgoal 4.1:
Variables:
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {val' VE}
H7 : {tm (fix R)}
H8 : {tm' (clos' (abs' R') VE)}
============================
{tm' (clos' (abs' R') VE)}
Subgoal 4.2 is:
{tm' V'}
equiv_cc_tm' < search.
Subgoal 4.2:
Variables:
N : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
{tm' V'}
equiv_cc_tm' < case H3.
Subgoal 4.2:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{tm' (clos' (abs' R') VE)}
equiv_cc_tm' < apply IH1 to H1 H6 H7.
Subgoal 4.2:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
{tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
{tm' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {tm' (clos' (abs' R') VE)}
============================
{tm' (clos' (abs' R') VE)}
equiv_cc_tm' < search.
Proof completed.
Abella < Theorem equiv_cc_arr_val' :
forall T1 T K R V, {is_nat K} -> equiv_cc (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE}).
============================
forall T1 T K R V, {is_nat K} -> equiv_cc (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
equiv_cc_arr_val' < induction on 1.
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
============================
forall T1 T K R V, {is_nat K}@ -> equiv_cc (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
equiv_cc_arr_val' < intros.
Variables:
K : nat
V : tm'
T1,T : ty
R : tm -> tm -> tm
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H1 : {is_nat K}@
H2 : equiv_cc (arr T1 T) K (fix R) V
============================
exists R' VE, V = clos' (abs' R') VE /\ {val' VE}
equiv_cc_arr_val' < case H1.
Subgoal 1:
Variables:
V : tm'
T1,T : ty
R : tm -> tm -> tm
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H2 : equiv_cc (arr T1 T) z (fix R) V
============================
exists R' VE, V = clos' (abs' R') VE /\ {val' VE}
Subgoal 2 is:
exists R' VE, V = clos' (abs' R') VE /\ {val' VE}
equiv_cc_arr_val' < case H2.
Subgoal 1:
Variables:
VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H3 : {val' VE}
H4 : {tm (fix R)}
H5 : {tm' (clos' (abs' R') VE)}
============================
exists R'1 VE1, clos' (abs' R') VE = clos' (abs' R'1) VE1 /\ {val' VE1}
Subgoal 2 is:
exists R' VE, V = clos' (abs' R') VE /\ {val' VE}
equiv_cc_arr_val' < search.
Subgoal 2:
Variables:
N : nat
V : tm'
T1,T : ty
R : tm -> tm -> tm
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H2 : equiv_cc (arr T1 T) (s N) (fix R) V
H3 : {is_nat N}*
============================
exists R' VE, V = clos' (abs' R') VE /\ {val' VE}
equiv_cc_arr_val' < case H2.
Subgoal 2:
Variables:
N : nat
VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H3 : {is_nat N}*
H4 : equiv_cc (arr T1 T) N (fix R) (clos' (abs' R') VE)
H5 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T) N V2 V2' ->
sim_cc T N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
exists R'1 VE1, clos' (abs' R') VE = clos' (abs' R'1) VE1 /\ {val' VE1}
equiv_cc_arr_val' < backchain IH.
Proof completed.
Abella < Theorem equiv_cc_closed :
forall T K J V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> le J K ->
equiv_cc T J V V'.
============================
forall T K J V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
equiv_cc_closed < induction on 1.
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
============================
forall T K J V V', {is_sty T}@ -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
equiv_cc_closed < induction on 2.
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
============================
forall T K J V V', {is_sty T}@ -> {is_nat K}@@ -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
equiv_cc_closed < intros.
Variables:
K,J : nat
V : tm
V' : tm'
T : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv_cc T K V V'
H4 : le J K
============================
equiv_cc T J V V'
equiv_cc_closed < case H1 (keep).
Subgoal 1:
Variables:
K,J : nat
V : tm
V' : tm'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv_cc tnat K V V'
H4 : le J K
============================
equiv_cc tnat J V V'
Subgoal 2 is:
equiv_cc tunit J V V'
Subgoal 3 is:
equiv_cc (prod T1 T2) J V V'
Subgoal 4 is:
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < case H3.
Subgoal 1:
Variables:
K,J,N : nat
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H4 : le J K
============================
equiv_cc tnat J (nat N) (nat' N)
Subgoal 2 is:
equiv_cc tunit J V V'
Subgoal 3 is:
equiv_cc (prod T1 T2) J V V'
Subgoal 4 is:
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < search.
Subgoal 2:
Variables:
K,J : nat
V : tm
V' : tm'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv_cc tunit K V V'
H4 : le J K
============================
equiv_cc tunit J V V'
Subgoal 3 is:
equiv_cc (prod T1 T2) J V V'
Subgoal 4 is:
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < case H3.
Subgoal 2:
Variables:
K,J : nat
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H4 : le J K
============================
equiv_cc tunit J unit unit'
Subgoal 3 is:
equiv_cc (prod T1 T2) J V V'
Subgoal 4 is:
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < search.
Subgoal 3:
Variables:
K,J : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (prod T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
============================
equiv_cc (prod T1 T2) J V V'
Subgoal 4 is:
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < case H3.
Subgoal 3:
Variables:
K,J : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H7 : equiv_cc T1 K V1 V1'
H8 : equiv_cc T2 K V2 V2'
============================
equiv_cc (prod T1 T2) J (pair V1 V2) (pair' V1' V2')
Subgoal 4 is:
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < unfold.
Subgoal 3.1:
Variables:
K,J : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H7 : equiv_cc T1 K V1 V1'
H8 : equiv_cc T2 K V2 V2'
============================
equiv_cc T1 J V1 V1'
Subgoal 3.2 is:
equiv_cc T2 J V2 V2'
Subgoal 4 is:
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < backchain IH.
Subgoal 3.2:
Variables:
K,J : nat
V2,V1 : tm
V2',V1' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H7 : equiv_cc T1 K V1 V1'
H8 : equiv_cc T2 K V2 V2'
============================
equiv_cc T2 J V2 V2'
Subgoal 4 is:
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < backchain IH.
Subgoal 4:
Variables:
K,J : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
============================
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < apply le_to_lt to _ H4.
Subgoal 4:
Variables:
K,J : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H7 : J = K \/ lt J K
============================
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < case H7.
Subgoal 4.1:
Variables:
K : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : le K K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
============================
equiv_cc (arr T1 T2) K V V'
Subgoal 4.2 is:
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < search.
Subgoal 4.2:
Variables:
K,J : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J K
============================
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < case H2 (keep).
Subgoal 4.2.1:
Variables:
J : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat z}@@
H3 : equiv_cc (arr T1 T2) z V V'
H4 : le J z
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J z
============================
equiv_cc (arr T1 T2) J V V'
Subgoal 4.2.2 is:
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < apply lt_z_absurd to H8.
Subgoal 4.2.2:
Variables:
J,N : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : le J (s N)
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
============================
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < apply lt_pred_le to _ H8.
Subgoal 4.2.2:
Variables:
J,N : nat
V : tm
V' : tm'
T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : le J (s N)
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
H10 : le J N
============================
equiv_cc (arr T1 T2) J V V'
equiv_cc_closed < case H3.
Subgoal 4.2.2:
Variables:
J,N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H4 : le J (s N)
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
H10 : le J N
H11 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H12 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
equiv_cc (arr T1 T2) J (fix R) (clos' (abs' R') VE)
equiv_cc_closed < apply IH1 to H1 H9 H11 H10.
Subgoal 4.2.2:
Variables:
J,N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H4 : le J (s N)
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
H10 : le J N
H11 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H12 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H13 : equiv_cc (arr T1 T2) J (fix R) (clos' (abs' R') VE)
============================
equiv_cc (arr T1 T2) J (fix R) (clos' (abs' R') VE)
equiv_cc_closed < search.
Proof completed.
Abella < Theorem equiv_cc_arr_cond :
forall K T1 T2 R R' VE, {is_nat K} ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))).
============================
forall K T1 T2 R R' VE, {is_nat K} ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
equiv_cc_arr_cond < induction on 1.
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
============================
forall K T1 T2 R R' VE, {is_nat K}@ ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
equiv_cc_arr_cond < intros.
Variables:
K,J : nat
V1,V2 : tm
VE,V1',V2' : tm'
T1,T2 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H1 : {is_nat K}@
H2 : equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE)
H3 : lt J K
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
============================
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_cond < case H1.
Subgoal 1:
Variables:
J : nat
V1,V2 : tm
VE,V1',V2' : tm'
T1,T2 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) z (fix R) (clos' (abs' R') VE)
H3 : lt J z
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
============================
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
Subgoal 2 is:
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_cond < apply lt_z_absurd to H3.
Subgoal 2:
Variables:
J,N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T1,T2 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
============================
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_cond < apply lt_pred_le to _ H3.
Subgoal 2:
Variables:
J,N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T1,T2 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
============================
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_cond < apply le_to_lt to _ H7.
Subgoal 2:
Variables:
J,N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T1,T2 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H8 : J = N \/ lt J N
============================
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_cond < case H8.
Subgoal 2.1:
Variables:
N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T1,T2 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt N (s N)
H4 : equiv_cc T1 N V1 V1'
H5 : equiv_cc (arr T1 T2) N V2 V2'
H6 : {is_nat N}*
H7 : le N N
============================
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
Subgoal 2.2 is:
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_cond < case H2.
Subgoal 2.1:
Variables:
N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T1,T2 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H3 : lt N (s N)
H4 : equiv_cc T1 N V1 V1'
H5 : equiv_cc (arr T1 T2) N V2 V2'
H6 : {is_nat N}*
H7 : le N N
H9 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H10 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
Subgoal 2.2 is:
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_cond < backchain H10.
Subgoal 2.2:
Variables:
J,N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T1,T2 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H9 : lt J N
============================
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_cond < case H2.
Subgoal 2.2:
Variables:
J,N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T1,T2 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H9 : lt J N
H10 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H11 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_cond < apply IH to H6 H10.
Subgoal 2.2:
Variables:
J,N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T1,T2 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H9 : lt J N
H10 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H11 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H12 : forall J V1 V1' V2 V2', lt J N -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_cond < backchain H12.
Proof completed.
Abella < Theorem app_equiv_cc_arr :
forall T1 T R F VE N1 N2 V1 V1' K, {is_sty (arr T1 T)} -> {is_nat N1} ->
{is_nat N2} -> equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE) ->
equiv_cc T1 N2 V1 V1' -> lt K N1 -> lt K N2 ->
sim_cc T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE))).
============================
forall T1 T R F VE N1 N2 V1 V1' K, {is_sty (arr T1 T)} -> {is_nat N1} ->
{is_nat N2} -> equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE) ->
equiv_cc T1 N2 V1 V1' -> lt K N1 -> lt K N2 ->
sim_cc T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))
app_equiv_cc_arr < intros.
Variables:
N1,N2,K : nat
V1 : tm
VE,V1' : tm'
T1,T : ty
R : tm -> tm -> tm
F : tm' -> tm'
H1 : {is_sty (arr T1 T)}
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
============================
sim_cc T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))
app_equiv_cc_arr < case H1.
Variables:
N1,N2,K : nat
V1 : tm
VE,V1' : tm'
T1,T : ty
R : tm -> tm -> tm
F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
============================
sim_cc T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))
app_equiv_cc_arr < apply equiv_cc_arr_cond to _ H4.
Variables:
N1,N2,K : nat
V1 : tm
VE,V1' : tm'
T1,T : ty
R : tm -> tm -> tm
F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
H10 : forall J V1 V1' V2 V2', lt J N1 -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T) J V2 V2' ->
sim_cc T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
sim_cc T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))
app_equiv_cc_arr < backchain H10.
Subgoal 1:
Variables:
N1,N2,K : nat
V1 : tm
VE,V1' : tm'
T1,T : ty
R : tm -> tm -> tm
F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
H10 : forall J V1 V1' V2 V2', lt J N1 -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T) J V2 V2' ->
sim_cc T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
equiv_cc T1 K V1 V1'
Subgoal 2 is:
equiv_cc (arr T1 T) K (fix R) (clos' (abs' F) VE)
app_equiv_cc_arr < backchain equiv_cc_closed with K = N2.
Subgoal 1:
Variables:
N1,N2,K : nat
V1 : tm
VE,V1' : tm'
T1,T : ty
R : tm -> tm -> tm
F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
H10 : forall J V1 V1' V2 V2', lt J N1 -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T) J V2 V2' ->
sim_cc T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
le K N2
Subgoal 2 is:
equiv_cc (arr T1 T) K (fix R) (clos' (abs' F) VE)
app_equiv_cc_arr < backchain lt_to_le.
Subgoal 2:
Variables:
N1,N2,K : nat
V1 : tm
VE,V1' : tm'
T1,T : ty
R : tm -> tm -> tm
F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
H10 : forall J V1 V1' V2 V2', lt J N1 -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T) J V2 V2' ->
sim_cc T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
equiv_cc (arr T1 T) K (fix R) (clos' (abs' F) VE)
app_equiv_cc_arr < backchain equiv_cc_closed with K = N1.
Subgoal 2:
Variables:
N1,N2,K : nat
V1 : tm
VE,V1' : tm'
T1,T : ty
R : tm -> tm -> tm
F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
H10 : forall J V1 V1' V2 V2', lt J N1 -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T) J V2 V2' ->
sim_cc T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
le K N1
app_equiv_cc_arr < backchain lt_to_le.
Proof completed.
Abella < Define equiv_cc_arr : ty -> nat -> tm -> tm' -> prop by
equiv_cc_arr (arr T1 T2) K (fix R) (clos' (abs' R') VE) := {val' VE} /\ {tm (fix R)} /\ {tm' (clos' (abs' R') VE)} /\
(forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))).
Abella < Theorem equiv_cc_arr_closed :
forall J K T M M', {is_nat K} -> le J K -> equiv_cc_arr T K M M' ->
equiv_cc_arr T J M M'.
============================
forall J K T M M', {is_nat K} -> le J K -> equiv_cc_arr T K M M' ->
equiv_cc_arr T J M M'
equiv_cc_arr_closed < intros.
Variables:
J,K : nat
M : tm
M' : tm'
T : ty
H1 : {is_nat K}
H2 : le J K
H3 : equiv_cc_arr T K M M'
============================
equiv_cc_arr T J M M'
equiv_cc_arr_closed < case H3.
Variables:
J,K : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
equiv_cc_arr (arr T1 T2) J (fix R) (clos' (abs' R') VE)
equiv_cc_arr_closed < unfold.
Subgoal 1:
Variables:
J,K : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{val' VE}
Subgoal 2 is:
{tm (fix R)}
Subgoal 3 is:
{tm' (clos' (abs' R') VE)}
Subgoal 4 is:
forall J1 V1 V1' V2 V2', lt J1 J -> equiv_cc T1 J1 V1 V1' ->
equiv_cc (arr T1 T2) J1 V2 V2' ->
sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_closed < search.
Subgoal 2:
Variables:
J,K : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{tm (fix R)}
Subgoal 3 is:
{tm' (clos' (abs' R') VE)}
Subgoal 4 is:
forall J1 V1 V1' V2 V2', lt J1 J -> equiv_cc T1 J1 V1 V1' ->
equiv_cc (arr T1 T2) J1 V2 V2' ->
sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_closed < search.
Subgoal 3:
Variables:
J,K : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{tm' (clos' (abs' R') VE)}
Subgoal 4 is:
forall J1 V1 V1' V2 V2', lt J1 J -> equiv_cc T1 J1 V1 V1' ->
equiv_cc (arr T1 T2) J1 V2 V2' ->
sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_closed < search.
Subgoal 4:
Variables:
J,K : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
forall J1 V1 V1' V2 V2', lt J1 J -> equiv_cc T1 J1 V1 V1' ->
equiv_cc (arr T1 T2) J1 V2 V2' ->
sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_closed < intros.
Subgoal 4:
Variables:
J,K,J1 : nat
V1,V2 : tm
VE,V1',V2' : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : lt J1 J
H9 : equiv_cc T1 J1 V1 V1'
H10 : equiv_cc (arr T1 T2) J1 V2 V2'
============================
sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_closed < apply lt_le_compose to H8 H2.
Subgoal 4:
Variables:
J,K,J1 : nat
V1,V2 : tm
VE,V1',V2' : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : lt J1 J
H9 : equiv_cc T1 J1 V1 V1'
H10 : equiv_cc (arr T1 T2) J1 V2 V2'
H11 : lt J1 K
============================
sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_closed < apply H7 to _ H9 H10.
Subgoal 4:
Variables:
J,K,J1 : nat
V1,V2 : tm
VE,V1',V2' : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : lt J1 J
H9 : equiv_cc T1 J1 V1 V1'
H10 : equiv_cc (arr T1 T2) J1 V2 V2'
H11 : lt J1 K
H12 : sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_closed < search.
Proof completed.
Abella < Theorem equiv_cc_arr_to_equiv_cc :
forall T K M M', {is_nat K} -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'.
============================
forall T K M M', {is_nat K} -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
equiv_cc_arr_to_equiv_cc < induction on 1.
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
============================
forall T K M M', {is_nat K}@ -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
equiv_cc_arr_to_equiv_cc < intros.
Variables:
K : nat
M : tm
M' : tm'
T : ty
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H1 : {is_nat K}@
H2 : {is_sty T}
H3 : equiv_cc_arr T K M M'
============================
equiv_cc T K M M'
equiv_cc_arr_to_equiv_cc < case H3 (keep).
Variables:
K : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H1 : {is_nat K}@
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) K (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE)
equiv_cc_arr_to_equiv_cc < case H1.
Subgoal 1:
Variables:
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) z (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J z -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
equiv_cc (arr T1 T2) z (fix R) (clos' (abs' R') VE)
Subgoal 2 is:
equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
equiv_cc_arr_to_equiv_cc < search.
Subgoal 2:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
equiv_cc_arr_to_equiv_cc < unfold.
Subgoal 2.1:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
Subgoal 2.2 is:
forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_to_equiv_cc < apply equiv_cc_arr_closed to _ _ H3 with J = N.
Subgoal 2.1.1:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
le N (s N)
Subgoal 2.1 is:
equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
Subgoal 2.2 is:
forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_to_equiv_cc < backchain le_succ.
Subgoal 2.1.1:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
le N N
Subgoal 2.1 is:
equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
Subgoal 2.2 is:
forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_to_equiv_cc < backchain le_refl.
Subgoal 2.1:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc_arr (arr T1 T2) N (fix R) (clos' (abs' R') VE)
============================
equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
Subgoal 2.2 is:
forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_to_equiv_cc < apply IH to H8 _ H9.
Subgoal 2.1:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc_arr (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H10 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
============================
equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
Subgoal 2.2 is:
forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_to_equiv_cc < search.
Subgoal 2.2:
Variables:
N : nat
VE : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
equiv_cc (arr T1 T2) N V2 V2' ->
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_to_equiv_cc < intros.
Subgoal 2.2:
Variables:
N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc T1 N V1 V1'
H10 : equiv_cc (arr T1 T2) N V2 V2'
============================
sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_cc_arr_to_equiv_cc < backchain H7.
Subgoal 2.2:
Variables:
N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc T1 N V1 V1'
H10 : equiv_cc (arr T1 T2) N V2 V2'
============================
lt N (s N)
equiv_cc_arr_to_equiv_cc < unfold.
Subgoal 2.2:
Variables:
N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc T1 N V1 V1'
H10 : equiv_cc (arr T1 T2) N V2 V2'
============================
exists N1, {add N (s N1) (s N)}
equiv_cc_arr_to_equiv_cc < exists z.
Subgoal 2.2:
Variables:
N : nat
V1,V2 : tm
VE,V1',V2' : tm'
T2,T1 : ty
R : tm -> tm -> tm
R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc T1 N V1 V1'
H10 : equiv_cc (arr T1 T2) N V2 V2'
============================
{add N (s z) (s N)}
equiv_cc_arr_to_equiv_cc < backchain add_comm.
Proof completed.
Abella < Theorem sim_cc_val_tm' :
forall V T K M' V', {val V} -> {eval' M' V'} -> equiv_cc T K V V' ->
sim_cc T K V M'.
============================
forall V T K M' V', {val V} -> {eval' M' V'} -> equiv_cc T K V V' ->
sim_cc T K V M'
sim_cc_val_tm' < intros.
Variables:
K : nat
V : tm
M',V' : tm'
T : ty
H1 : {val V}
H2 : {eval' M' V'}
H3 : equiv_cc T K V V'
============================
sim_cc T K V M'
sim_cc_val_tm' < unfold.
Variables:
K : nat
V : tm
M',V' : tm'
T : ty
H1 : {val V}
H2 : {eval' M' V'}
H3 : equiv_cc T K V V'
============================
forall J V1, le J K -> {nstep J V V1} -> {val V1} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V1 V')
sim_cc_val_tm' < intros.
Variables:
K,J : nat
V,V1 : tm
M',V' : tm'
T : ty
H1 : {val V}
H2 : {eval' M' V'}
H3 : equiv_cc T K V V'
H4 : le J K
H5 : {nstep J V V1}
H6 : {val V1}
============================
exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V1 V'
sim_cc_val_tm' < apply nstep_val_inv to H1 H5.
Variables:
K : nat
V1 : tm
M',V' : tm'
T : ty
H1 : {val V1}
H2 : {eval' M' V'}
H3 : equiv_cc T K V1 V'
H4 : le z K
H5 : {nstep z V1 V1}
H6 : {val V1}
============================
exists V' N, {eval' M' V'} /\ {add z N K} /\ equiv_cc T N V1 V'
sim_cc_val_tm' < search.
Proof completed.
Abella < Theorem sim_cc_nat :
forall K N, sim_cc tnat K (nat N) (nat' N).
============================
forall K N, sim_cc tnat K (nat N) (nat' N)
sim_cc_nat < intros.
Variables:
K,N : nat
============================
sim_cc tnat K (nat N) (nat' N)
sim_cc_nat < unfold.
Variables:
K,N : nat
============================
forall J V, le J K -> {nstep J (nat N) V} -> {val V} ->
(exists V' N1, {eval' (nat' N) V'} /\ {add J N1 K} /\
equiv_cc tnat N1 V V')
sim_cc_nat < intros.
Variables:
K,N,J : nat
V : tm
H1 : le J K
H2 : {nstep J (nat N) V}
H3 : {val V}
============================
exists V' N1, {eval' (nat' N) V'} /\ {add J N1 K} /\ equiv_cc tnat N1 V V'
sim_cc_nat < apply nstep_val_inv to _ H2.
Variables:
K,N : nat
H1 : le z K
H2 : {nstep z (nat N) (nat N)}
H3 : {val (nat N)}
============================
exists V' N1, {eval' (nat' N) V'} /\ {add z N1 K} /\
equiv_cc tnat N1 (nat N) V'
sim_cc_nat < search.
Proof completed.
Abella < Theorem sim_cc_pred :
forall K M M', sim_cc tnat K M M' -> sim_cc tnat K (pred M) (pred' M').
============================
forall K M M', sim_cc tnat K M M' -> sim_cc tnat K (pred M) (pred' M')
sim_cc_pred < intros.
Variables:
K : nat
M : tm
M' : tm'
H1 : sim_cc tnat K M M'
============================
sim_cc tnat K (pred M) (pred' M')
sim_cc_pred < case H1.
Variables:
K : nat
M : tm
M' : tm'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
sim_cc tnat K (pred M) (pred' M')
sim_cc_pred < unfold.
Variables:
K : nat
M : tm
M' : tm'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
forall J V, le J K -> {nstep J (pred M) V} -> {val V} ->
(exists V' N, {eval' (pred' M') V'} /\ {add J N K} /\
equiv_cc tnat N V V')
sim_cc_pred < intros.
Variables:
K,J : nat
M,V : tm
M' : tm'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H3 : le J K
H4 : {nstep J (pred M) V}
H5 : {val V}
============================
exists V' N, {eval' (pred' M') V'} /\ {add J N K} /\ equiv_cc tnat N V V'
sim_cc_pred < apply nstep_pred_inv to H5 H4.
Variables:
K,J1,N,N' : nat
M : tm
M' : tm'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H3 : le (s J1) K
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
============================
exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N K} /\
equiv_cc tnat N (nat N') V'
sim_cc_pred < case H3.
Variables:
K,J1,N,N',N1 : nat
M : tm
M' : tm'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H8 : {add (s J1) N1 K}
============================
exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N K} /\
equiv_cc tnat N (nat N') V'
sim_cc_pred < case H8.
Variables:
J1,N,N',N1,N3 : nat
M : tm
M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
============================
exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
equiv_cc tnat N (nat N') V'
sim_cc_pred < assert {add J1 (s N1) (s N3)}.
Subgoal 1:
Variables:
J1,N,N',N1,N3 : nat
M : tm
M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
============================
{add J1 (s N1) (s N3)}
Subgoal is:
exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
equiv_cc tnat N (nat N') V'
sim_cc_pred < backchain add_s.
Variables:
J1,N,N',N1,N3 : nat
M : tm
M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
============================
exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
equiv_cc tnat N (nat N') V'
sim_cc_pred < apply H2 to _ H6 _ with J = J1.
Variables:
J1,N,N',N1,N3,N2 : nat
M : tm
M',V' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' V'}
H12 : {add J1 N2 (s N3)}
H13 : equiv_cc tnat N2 (nat N) V'
============================
exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
equiv_cc tnat N (nat N') V'
sim_cc_pred < case H13.
Variables:
J1,N,N',N1,N3,N2 : nat
M : tm
M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
equiv_cc tnat N (nat N') V'
sim_cc_pred < exists nat' N'.
Variables:
J1,N,N',N1,N3,N2 : nat
M : tm
M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
exists N, {eval' (pred' M') (nat' N')} /\ {add (s J1) N (s N3)} /\
equiv_cc tnat N (nat N') (nat' N')
sim_cc_pred < exists N1.
Variables:
J1,N,N',N1,N3,N2 : nat
M : tm
M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
{eval' (pred' M') (nat' N')} /\ {add (s J1) N1 (s N3)} /\
equiv_cc tnat N1 (nat N') (nat' N')
sim_cc_pred < split.
Subgoal 2:
Variables:
J1,N,N',N1,N3,N2 : nat
M : tm
M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
{eval' (pred' M') (nat' N')}
Subgoal 3 is:
{add (s J1) N1 (s N3)}
Subgoal 4 is:
equiv_cc tnat N1 (nat N') (nat' N')
sim_cc_pred < backchain eval'_pred_fwd.
Subgoal 3:
Variables:
J1,N,N',N1,N3,N2 : nat
M : tm
M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
{add (s J1) N1 (s N3)}
Subgoal 4 is:
equiv_cc tnat N1 (nat N') (nat' N')
sim_cc_pred < search.
Subgoal 4:
Variables:
J1,N,N',N1,N3,N2 : nat
M : tm
M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
equiv_cc tnat N1 (nat N') (nat' N')
sim_cc_pred < search.
Proof completed.
Abella < Theorem sim_cc_plus :
forall K M1 M2 M1' M2', {is_nat K} -> sim_cc tnat K M1 M1' ->
sim_cc tnat K M2 M2' -> sim_cc tnat K (plus M1 M2) (plus' M1' M2').
============================
forall K M1 M2 M1' M2', {is_nat K} -> sim_cc tnat K M1 M1' ->
sim_cc tnat K M2 M2' -> sim_cc tnat K (plus M1 M2) (plus' M1' M2')
sim_cc_plus < intros.
Variables:
K : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
============================
sim_cc tnat K (plus M1 M2) (plus' M1' M2')
sim_cc_plus < unfold.
Variables:
K : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
============================
forall J V, le J K -> {nstep J (plus M1 M2) V} -> {val V} ->
(exists V' N, {eval' (plus' M1' M2') V'} /\ {add J N K} /\
equiv_cc tnat N V V')
sim_cc_plus < intros.
Variables:
K,J : nat
M1,M2,V : tm
M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le J K
H5 : {nstep J (plus M1 M2) V}
H6 : {val V}
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add J N K} /\
equiv_cc tnat N V V'
sim_cc_plus < apply nstep_plus_inv to H6 H5.
Variables:
K,J1,J2,J12,N1,N2,N3 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < assert le J1 K.
Subgoal 1:
Variables:
K,J1,J2,J12,N1,N2,N3 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
============================
le J1 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < apply add_s to H7.
Subgoal 1:
Variables:
K,J1,J2,J12,N1,N2,N3 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : {add J1 (s J2) (s J12)}
============================
le J1 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < apply le_trans to _ H4.
Subgoal 1:
Variables:
K,J1,J2,J12,N1,N2,N3 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : {add J1 (s J2) (s J12)}
H12 : le J1 K
============================
le J1 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < search.
Variables:
K,J1,J2,J12,N1,N2,N3 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < case H2.
Variables:
K,J1,J2,J12,N1,N2,N3 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < apply H12 to H11 H8 _.
Variables:
K,J1,J2,J12,N1,N2,N3,N : nat
M1,M2 : tm
M1',M2',V' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' V'}
H14 : {add J1 N K}
H15 : equiv_cc tnat N (nat N1) V'
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < case H15.
Variables:
K,J1,J2,J12,N1,N2,N3,N : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < assert le J2 K.
Subgoal 2:
Variables:
K,J1,J2,J12,N1,N2,N3,N : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
============================
le J2 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < apply add_comm to _ H7.
Subgoal 2.1:
Variables:
K,J1,J2,J12,N1,N2,N3,N : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
============================
{is_nat J12}
Subgoal 2 is:
le J2 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < case H4.
Subgoal 2.1:
Variables:
K,J1,J2,J12,N1,N2,N3,N,N4 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add (s J12) N4 K}
============================
{is_nat J12}
Subgoal 2 is:
le J2 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < apply add_arg1_isnat to H16.
Subgoal 2.1:
Variables:
K,J1,J2,J12,N1,N2,N3,N,N4 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add (s J12) N4 K}
H17 : {is_nat (s J12)}
============================
{is_nat J12}
Subgoal 2 is:
le J2 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < case H17.
Subgoal 2.1:
Variables:
K,J1,J2,J12,N1,N2,N3,N,N4 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add (s J12) N4 K}
H18 : {is_nat J12}
============================
{is_nat J12}
Subgoal 2 is:
le J2 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < search.
Subgoal 2:
Variables:
K,J1,J2,J12,N1,N2,N3,N : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add J2 J1 J12}
============================
le J2 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < apply add_s to H16.
Subgoal 2:
Variables:
K,J1,J2,J12,N1,N2,N3,N : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add J2 J1 J12}
H17 : {add J2 (s J1) (s J12)}
============================
le J2 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < apply le_trans to _ H4.
Subgoal 2:
Variables:
K,J1,J2,J12,N1,N2,N3,N : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add J2 J1 J12}
H17 : {add J2 (s J1) (s J12)}
H18 : le J2 K
============================
le J2 K
Subgoal is:
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < search.
Variables:
K,J1,J2,J12,N1,N2,N3,N : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < case H3.
Variables:
K,J1,J2,J12,N1,N2,N3,N : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
H17 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < apply H17 to H16 H9 _.
Variables:
K,J1,J2,J12,N1,N2,N3,N,N4 : nat
M1,M2 : tm
M1',M2',V'1 : tm'
H1 : {is_nat K}
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
H17 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H18 : {eval' M2' V'1}
H19 : {add J2 N4 K}
H20 : equiv_cc tnat N4 (nat N2) V'1
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < case H20.
Variables:
K,J1,J2,J12,N1,N2,N3,N,N4 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
H17 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H18 : {eval' M2' (nat' N2)}
H19 : {add J2 N4 K}
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < apply eval'_plus_fwd to H13 H18 H10.
Variables:
K,J1,J2,J12,N1,N2,N3,N,N4 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
H17 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H18 : {eval' M2' (nat' N2)}
H19 : {add J2 N4 K}
H21 : {eval' (plus' M1' M2') (nat' N3)}
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < case H4.
Variables:
K,J1,J2,J12,N1,N2,N3,N,N4,N5 : nat
M1,M2 : tm
M1',M2' : tm'
H1 : {is_nat K}
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
H17 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H18 : {eval' M2' (nat' N2)}
H19 : {add J2 N4 K}
H21 : {eval' (plus' M1' M2') (nat' N3)}
H22 : {add (s J12) N5 K}
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv_cc tnat N (nat N3) V'
sim_cc_plus < search.
Proof completed.
Abella < Theorem sim_cc_ifz :
forall K T M M1 M2 M' M1' M2', {is_nat K} -> {is_sty T} ->
sim_cc tnat K M M' -> sim_cc T K M1 M1' -> sim_cc T K M2 M2' ->
sim_cc T K (ifz M M1 M2) (ifz' M' M1' M2').
============================
forall K T M M1 M2 M' M1' M2', {is_nat K} -> {is_sty T} ->
sim_cc tnat K M M' -> sim_cc T K M1 M1' -> sim_cc T K M2 M2' ->
sim_cc T K (ifz M M1 M2) (ifz' M' M1' M2')
sim_cc_ifz < intros.
Variables:
K : nat
M,M1,M2 : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
============================
sim_cc T K (ifz M M1 M2) (ifz' M' M1' M2')
sim_cc_ifz < unfold.
Variables:
K : nat
M,M1,M2 : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
============================
forall J V, le J K -> {nstep J (ifz M M1 M2) V} -> {val V} ->
(exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V')
sim_cc_ifz < intros.
Variables:
K,J : nat
M,M1,M2,V : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < apply nstep_ifz_inv to _ _ H7.
Subgoal 1:
Variables:
K,J : nat
M,M1,M2,V : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
============================
{is_nat J}
Subgoal is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < case H6.
Subgoal 1:
Variables:
K,J,N : nat
M,M1,M2,V : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : {add J N K}
============================
{is_nat J}
Subgoal is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < backchain add_arg1_isnat.
Variables:
K,J,I,J1,N : nat
M,M1,M2,V : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H11 : {nstep J1 M (nat z)} /\ {nstep I M1 V} \/ {nstep J1 M (nat (s N))} /\
{nstep I M2 V}
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < case H11.
Subgoal 2:
Variables:
K,J,I,J1,N : nat
M,M1,M2,V : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < apply le_trans to H9 H6.
Subgoal 2:
Variables:
K,J,I,J1,N : nat
M,M1,M2,V : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < case H3.
Subgoal 2:
Variables:
K,J,I,J1,N : nat
M,M1,M2,V : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < apply H15 to _ H12 _.
Subgoal 2:
Variables:
K,J,I,J1,N,N1 : nat
M,M1,M2,V : tm
M',M1',M2',V' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat z) V'
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < apply le_trans to H10 H6.
Subgoal 2:
Variables:
K,J,I,J1,N,N1 : nat
M,M1,M2,V : tm
M',M1',M2',V' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat z) V'
H19 : le I K
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < case H4.
Subgoal 2:
Variables:
K,J,I,J1,N,N1 : nat
M,M1,M2,V : tm
M',M1',M2',V' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat z) V'
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < apply H20 to _ H13 _.
Subgoal 2:
Variables:
K,J,I,J1,N,N1,N2 : nat
M,M1,M2,V : tm
M',M1',M2',V',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat z) V'
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < case H18.
Subgoal 2:
Variables:
K,J,I,J1,N,N1,N2 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < case H6.
Subgoal 2:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < exists V'1.
Subgoal 2:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
exists N, {eval' (ifz' M' M1' M2') V'1} /\ {add J N K} /\ equiv_cc T N V V'1
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < exists N3.
Subgoal 2:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
{eval' (ifz' M' M1' M2') V'1} /\ {add J N3 K} /\ equiv_cc T N3 V V'1
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < split.
Subgoal 2.1:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
{eval' (ifz' M' M1' M2') V'1}
Subgoal 2.2 is:
{add J N3 K}
Subgoal 2.3 is:
equiv_cc T N3 V V'1
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < backchain eval'_ifz_fwd1.
Subgoal 2.2:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
{add J N3 K}
Subgoal 2.3 is:
equiv_cc T N3 V V'1
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < search.
Subgoal 2.3:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
equiv_cc T N3 V V'1
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < backchain equiv_cc_closed with K = N2.
Subgoal 2.3.1:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
{is_nat N2}
Subgoal 2.3.2 is:
le N3 N2
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < backchain add_arg2_isnat.
Subgoal 2.3.2:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
le N3 N2
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < backchain add_le_complement with N = K, N1 = I, N1' = J.
Subgoal 2.3.2:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
{is_nat N2}
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < backchain add_arg2_isnat.
Subgoal 3:
Variables:
K,J,I,J1,N : nat
M,M1,M2,V : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < apply le_trans to H9 H6.
Subgoal 3:
Variables:
K,J,I,J1,N : nat
M,M1,M2,V : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < case H3.
Subgoal 3:
Variables:
K,J,I,J1,N : nat
M,M1,M2,V : tm
M',M1',M2' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < apply H15 to _ H12 _.
Subgoal 3:
Variables:
K,J,I,J1,N,N1 : nat
M,M1,M2,V : tm
M',M1',M2',V' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat (s N)) V'
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < apply le_trans to H10 H6.
Subgoal 3:
Variables:
K,J,I,J1,N,N1 : nat
M,M1,M2,V : tm
M',M1',M2',V' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat (s N)) V'
H19 : le I K
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < case H5.
Subgoal 3:
Variables:
K,J,I,J1,N,N1 : nat
M,M1,M2,V : tm
M',M1',M2',V' : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat (s N)) V'
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < apply H20 to _ H13 _.
Subgoal 3:
Variables:
K,J,I,J1,N,N1,N2 : nat
M,M1,M2,V : tm
M',M1',M2',V',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat (s N)) V'
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < case H18.
Subgoal 3:
Variables:
K,J,I,J1,N,N1,N2 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < case H6.
Subgoal 3:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
equiv_cc T N V V'
sim_cc_ifz < exists V'1.
Subgoal 3:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
exists N, {eval' (ifz' M' M1' M2') V'1} /\ {add J N K} /\ equiv_cc T N V V'1
sim_cc_ifz < exists N3.
Subgoal 3:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
{eval' (ifz' M' M1' M2') V'1} /\ {add J N3 K} /\ equiv_cc T N3 V V'1
sim_cc_ifz < split.
Subgoal 3.1:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
{eval' (ifz' M' M1' M2') V'1}
Subgoal 3.2 is:
{add J N3 K}
Subgoal 3.3 is:
equiv_cc T N3 V V'1
sim_cc_ifz < backchain eval'_ifz_fwd2.
Subgoal 3.2:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
{add J N3 K}
Subgoal 3.3 is:
equiv_cc T N3 V V'1
sim_cc_ifz < search.
Subgoal 3.3:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
equiv_cc T N3 V V'1
sim_cc_ifz < backchain equiv_cc_closed with K = N2.
Subgoal 3.3.1:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
{is_nat N2}
Subgoal 3.3.2 is:
le N3 N2
sim_cc_ifz < backchain add_arg2_isnat.
Subgoal 3.3.2:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
le N3 N2
sim_cc_ifz < backchain add_le_complement with N = K, N1 = I, N1' = J.
Subgoal 3.3.2:
Variables:
K,J,I,J1,N,N1,N2,N3 : nat
M,M1,M2,V : tm
M',M1',M2',V'1 : tm'
T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
{is_nat N2}
sim_cc_ifz < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_cc_unit :
forall K, sim_cc tunit K unit unit'.
============================
forall K, sim_cc tunit K unit unit'
sim_cc_unit < intros.
Variables:
K : nat
============================
sim_cc tunit K unit unit'
sim_cc_unit < unfold.
Variables:
K : nat
============================
forall J V, le J K -> {nstep J unit V} -> {val V} ->
(exists V' N, {eval' unit' V'} /\ {add J N K} /\ equiv_cc tunit N V V')
sim_cc_unit < intros.
Variables:
K,J : nat
V : tm
H1 : le J K
H2 : {nstep J unit V}
H3 : {val V}
============================
exists V' N, {eval' unit' V'} /\ {add J N K} /\ equiv_cc tunit N V V'
sim_cc_unit < apply nstep_val_inv to _ H2.
Variables:
K : nat
H1 : le z K
H2 : {nstep z unit unit}
H3 : {val unit}
============================
exists V' N, {eval' unit' V'} /\ {add z N K} /\ equiv_cc tunit N unit V'
sim_cc_unit < search.
Proof completed.
Abella < Theorem sim_cc_pair :
forall T1 T2 K M1 M2 M1' M2', {is_nat K} -> {is_sty T1} -> {is_sty T2} ->
sim_cc T1 K M1 M1' -> sim_cc T2 K M2 M2' ->
sim_cc (prod T1 T2) K (pair M1 M2) (pair' M1' M2').
============================
forall T1 T2 K M1 M2 M1' M2', {is_nat K} -> {is_sty T1} -> {is_sty T2} ->
sim_cc T1 K M1 M1' -> sim_cc T2 K M2 M2' ->
sim_cc (prod T1 T2) K (pair M1 M2) (pair' M1' M2')
sim_cc_pair < intros.
Variables:
K : nat
M1,M2 : tm
M1',M2' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
============================
sim_cc (prod T1 T2) K (pair M1 M2) (pair' M1' M2')
sim_cc_pair < unfold.
Variables:
K : nat
M1,M2 : tm
M1',M2' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
============================
forall J V, le J K -> {nstep J (pair M1 M2) V} -> {val V} ->
(exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
sim_cc_pair < intros.
Variables:
K,J : nat
M1,M2,V : tm
M1',M2' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) V}
H8 : {val V}
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V'
sim_cc_pair < apply nstep_pair_inv to _ H7.
Variables:
K,J,I,J1 : nat
M1,M2,V1,V2 : tm
M1',M2' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H8 : {val (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < case H8.
Variables:
K,J,I,J1 : nat
M1,M2,V1,V2 : tm
M1',M2' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < case H6 (keep).
Variables:
K,J,I,J1,N : nat
M1,M2,V1,V2 : tm
M1',M2' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < apply le_trans to _ H6.
Variables:
K,J,I,J1,N : nat
M1,M2,V1,V2 : tm
M1',M2' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < case H4.
Variables:
K,J,I,J1,N : nat
M1,M2,V1,V2 : tm
M1',M2' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < apply H16 to _ H10 _.
Variables:
K,J,I,J1,N,N1 : nat
M1,M2,V1,V2 : tm
M1',M2',V' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < assert le J1 J.
Subgoal 1:
Variables:
K,J,I,J1,N,N1 : nat
M1,M2,V1,V2 : tm
M1',M2',V' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
============================
le J1 J
Subgoal is:
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < unfold.
Subgoal 1:
Variables:
K,J,I,J1,N,N1 : nat
M1,M2,V1,V2 : tm
M1',M2',V' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
============================
exists N, {add J1 N J}
Subgoal is:
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < exists I.
Subgoal 1:
Variables:
K,J,I,J1,N,N1 : nat
M1,M2,V1,V2 : tm
M1',M2',V' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
============================
{add J1 I J}
Subgoal is:
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < backchain add_comm.
Subgoal 1:
Variables:
K,J,I,J1,N,N1 : nat
M1,M2,V1,V2 : tm
M1',M2',V' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
============================
{is_nat J}
Subgoal is:
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < backchain add_arg1_isnat.
Variables:
K,J,I,J1,N,N1 : nat
M1,M2,V1,V2 : tm
M1',M2',V' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < apply le_trans to H20 H6.
Variables:
K,J,I,J1,N,N1 : nat
M1,M2,V1,V2 : tm
M1',M2',V' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < case H5.
Variables:
K,J,I,J1,N,N1 : nat
M1,M2,V1,V2 : tm
M1',M2',V' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < apply H22 to _ H11 _.
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) V'
sim_cc_pair < exists pair' V' V'1.
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
exists N, {eval' (pair' M1' M2') (pair' V' V'1)} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) (pair' V' V'1)
sim_cc_pair < exists N.
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
{eval' (pair' M1' M2') (pair' V' V'1)} /\ {add J N K} /\
equiv_cc (prod T1 T2) N (pair V1 V2) (pair' V' V'1)
sim_cc_pair < split.
Subgoal 2:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
{eval' (pair' M1' M2') (pair' V' V'1)}
Subgoal 3 is:
{add J N K}
Subgoal 4 is:
equiv_cc (prod T1 T2) N (pair V1 V2) (pair' V' V'1)
sim_cc_pair < backchain eval'_pair_fwd.
Subgoal 3:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
{add J N K}
Subgoal 4 is:
equiv_cc (prod T1 T2) N (pair V1 V2) (pair' V' V'1)
sim_cc_pair < search.
Subgoal 4:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
equiv_cc (prod T1 T2) N (pair V1 V2) (pair' V' V'1)
sim_cc_pair < unfold.
Subgoal 4.1:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
equiv_cc T1 N V1 V'
Subgoal 4.2 is:
equiv_cc T2 N V2 V'1
sim_cc_pair < backchain equiv_cc_closed with K = N1.
Subgoal 4.1.1:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
{is_nat N1}
Subgoal 4.1.2 is:
le N N1
Subgoal 4.2 is:
equiv_cc T2 N V2 V'1
sim_cc_pair < backchain add_arg2_isnat.
Subgoal 4.1.2:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
le N N1
Subgoal 4.2 is:
equiv_cc T2 N V2 V'1
sim_cc_pair < backchain add_le_complement with N = K, N1 = I, N1' = J.
Subgoal 4.1.2:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
{is_nat N1}
Subgoal 4.2 is:
equiv_cc T2 N V2 V'1
sim_cc_pair < backchain add_arg2_isnat.
Subgoal 4.2:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
equiv_cc T2 N V2 V'1
sim_cc_pair < backchain equiv_cc_closed with K = N2.
Subgoal 4.2.1:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
{is_nat N2}
Subgoal 4.2.2 is:
le N N2
sim_cc_pair < backchain add_arg2_isnat.
Subgoal 4.2.2:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
le N N2
sim_cc_pair < backchain add_le_complement with N = K, N1 = J1, N1' = J.
Subgoal 4.2.2:
Variables:
K,J,I,J1,N,N1,N2 : nat
M1,M2,V1,V2 : tm
M1',M2',V',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
(exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
{is_nat N2}
sim_cc_pair < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_cc_fst :
forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
sim_cc (prod T1 T2) K M M' -> sim_cc T1 K (fst M) (fst' M').
============================
forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
sim_cc (prod T1 T2) K M M' -> sim_cc T1 K (fst M) (fst' M')
sim_cc_fst < intros.
Variables:
K : nat
M : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
============================
sim_cc T1 K (fst M) (fst' M')
sim_cc_fst < unfold.
Variables:
K : nat
M : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
============================
forall J V, le J K -> {nstep J (fst M) V} -> {val V} ->
(exists V' N, {eval' (fst' M') V'} /\ {add J N K} /\ equiv_cc T1 N V V')
sim_cc_fst < intros.
Variables:
K,J : nat
M,V : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
H4 : le J K
H5 : {nstep J (fst M) V}
H6 : {val V}
============================
exists V' N, {eval' (fst' M') V'} /\ {add J N K} /\ equiv_cc T1 N V V'
sim_cc_fst < apply nstep_fst_inv to H6 H5.
Variables:
K,K' : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
H4 : le (s K') K
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
============================
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'
sim_cc_fst < case H3.
Variables:
K,K' : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
============================
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'
sim_cc_fst < apply H9 to _ H8 _.
Subgoal 1:
Variables:
K,K' : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
============================
le K' K
Subgoal is:
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'
sim_cc_fst < case H4.
Subgoal 1:
Variables:
K,K',N : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {add (s K') N K}
============================
le K' K
Subgoal is:
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'
sim_cc_fst < case H10.
Subgoal 1:
Variables:
K',N,N3 : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat (s N3)}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc (prod T1 T2) N V V')
H11 : {add K' N N3}
============================
le K' (s N3)
Subgoal is:
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'
sim_cc_fst < apply add_s to H11.
Subgoal 1:
Variables:
K',N,N3 : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat (s N3)}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc (prod T1 T2) N V V')
H11 : {add K' N N3}
H12 : {add K' (s N) (s N3)}
============================
le K' (s N3)
Subgoal is:
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'
sim_cc_fst < search.
Variables:
K,K',N : nat
M,V,V' : tm
M',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv_cc (prod T1 T2) N (pair V V') V'1
============================
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'
sim_cc_fst < case H4.
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv_cc (prod T1 T2) N (pair V V') V'1
H13 : {add (s K') N1 K}
============================
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'
sim_cc_fst < case H12.
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'
sim_cc_fst < exists V1'.
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
exists N, {eval' (fst' M') V1'} /\ {add (s K') N K} /\ equiv_cc T1 N V V1'
sim_cc_fst < exists N1.
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
{eval' (fst' M') V1'} /\ {add (s K') N1 K} /\ equiv_cc T1 N1 V V1'
sim_cc_fst < split.
Subgoal 2:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
{eval' (fst' M') V1'}
Subgoal 3 is:
{add (s K') N1 K}
Subgoal 4 is:
equiv_cc T1 N1 V V1'
sim_cc_fst < backchain eval'_fst_fwd.
Subgoal 3:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
{add (s K') N1 K}
Subgoal 4 is:
equiv_cc T1 N1 V V1'
sim_cc_fst < search.
Subgoal 4:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
equiv_cc T1 N1 V V1'
sim_cc_fst < apply add_le_complement to _ _ H11 H13.
Subgoal 4.1:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
le K' (s K')
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv_cc T1 N1 V V1'
sim_cc_fst < backchain le_succ.
Subgoal 4.1:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
le K' K'
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv_cc T1 N1 V V1'
sim_cc_fst < backchain le_refl.
Subgoal 4.1:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
{is_nat K'}
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv_cc T1 N1 V V1'
sim_cc_fst < backchain add_arg1_isnat.
Subgoal 4.2:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
{is_nat N}
Subgoal 4 is:
equiv_cc T1 N1 V V1'
sim_cc_fst < backchain add_arg2_isnat.
Subgoal 4:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
H16 : le N1 N
============================
equiv_cc T1 N1 V V1'
sim_cc_fst < backchain equiv_cc_closed with K = N.
Subgoal 4.3:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
H16 : le N1 N
============================
{is_sty T1}
Subgoal 4.4 is:
{is_nat N}
sim_cc_fst < case H2.
Subgoal 4.3:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
H16 : le N1 N
H17 : {is_sty T1}
H18 : {is_sty T2}
============================
{is_sty T1}
Subgoal 4.4 is:
{is_nat N}
sim_cc_fst < search.
Subgoal 4.4:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
H16 : le N1 N
============================
{is_nat N}
sim_cc_fst < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_cc_snd :
forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
sim_cc (prod T1 T2) K M M' -> sim_cc T2 K (snd M) (snd' M').
============================
forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
sim_cc (prod T1 T2) K M M' -> sim_cc T2 K (snd M) (snd' M')
sim_cc_snd < intros.
Variables:
K : nat
M : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
============================
sim_cc T2 K (snd M) (snd' M')
sim_cc_snd < unfold.
Variables:
K : nat
M : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
============================
forall J V, le J K -> {nstep J (snd M) V} -> {val V} ->
(exists V' N, {eval' (snd' M') V'} /\ {add J N K} /\ equiv_cc T2 N V V')
sim_cc_snd < intros.
Variables:
K,J : nat
M,V : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
H4 : le J K
H5 : {nstep J (snd M) V}
H6 : {val V}
============================
exists V' N, {eval' (snd' M') V'} /\ {add J N K} /\ equiv_cc T2 N V V'
sim_cc_snd < apply nstep_snd_inv to H6 H5.
Variables:
K,K' : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
H4 : le (s K') K
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
============================
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'
sim_cc_snd < case H3.
Variables:
K,K' : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
============================
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'
sim_cc_snd < apply H9 to _ H8 _.
Subgoal 1:
Variables:
K,K' : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
============================
le K' K
Subgoal is:
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'
sim_cc_snd < case H4.
Subgoal 1:
Variables:
K,K',N : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {add (s K') N K}
============================
le K' K
Subgoal is:
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'
sim_cc_snd < case H10.
Subgoal 1:
Variables:
K',N,N3 : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat (s N3)}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc (prod T1 T2) N V V')
H11 : {add K' N N3}
============================
le K' (s N3)
Subgoal is:
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'
sim_cc_snd < apply add_s to H11.
Subgoal 1:
Variables:
K',N,N3 : nat
M,V,V' : tm
M' : tm'
T1,T2 : ty
H1 : {is_nat (s N3)}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
equiv_cc (prod T1 T2) N V V')
H11 : {add K' N N3}
H12 : {add K' (s N) (s N3)}
============================
le K' (s N3)
Subgoal is:
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'
sim_cc_snd < search.
Variables:
K,K',N : nat
M,V,V' : tm
M',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv_cc (prod T1 T2) N (pair V' V) V'1
============================
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'
sim_cc_snd < case H4.
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V'1 : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv_cc (prod T1 T2) N (pair V' V) V'1
H13 : {add (s K') N1 K}
============================
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'
sim_cc_snd < case H12.
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'
sim_cc_snd < exists V2'.
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
exists N, {eval' (snd' M') V2'} /\ {add (s K') N K} /\ equiv_cc T2 N V V2'
sim_cc_snd < exists N1.
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
{eval' (snd' M') V2'} /\ {add (s K') N1 K} /\ equiv_cc T2 N1 V V2'
sim_cc_snd < split.
Subgoal 2:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
{eval' (snd' M') V2'}
Subgoal 3 is:
{add (s K') N1 K}
Subgoal 4 is:
equiv_cc T2 N1 V V2'
sim_cc_snd < backchain eval'_snd_fwd.
Subgoal 3:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
{add (s K') N1 K}
Subgoal 4 is:
equiv_cc T2 N1 V V2'
sim_cc_snd < search.
Subgoal 4:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
equiv_cc T2 N1 V V2'
sim_cc_snd < apply add_le_complement to _ _ H11 H13.
Subgoal 4.1:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
le K' (s K')
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv_cc T2 N1 V V2'
sim_cc_snd < backchain le_succ.
Subgoal 4.1:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
le K' K'
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv_cc T2 N1 V V2'
sim_cc_snd < backchain le_refl.
Subgoal 4.1:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
{is_nat K'}
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv_cc T2 N1 V V2'
sim_cc_snd < backchain add_arg1_isnat.
Subgoal 4.2:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
{is_nat N}
Subgoal 4 is:
equiv_cc T2 N1 V V2'
sim_cc_snd < backchain add_arg2_isnat.
Subgoal 4:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
H16 : le N1 N
============================
equiv_cc T2 N1 V V2'
sim_cc_snd < backchain equiv_cc_closed with K = N.
Subgoal 4.3:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
H16 : le N1 N
============================
{is_sty T2}
Subgoal 4.4 is:
{is_nat N}
sim_cc_snd < case H2.
Subgoal 4.3:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
H16 : le N1 N
H17 : {is_sty T1}
H18 : {is_sty T2}
============================
{is_sty T2}
Subgoal 4.4 is:
{is_nat N}
sim_cc_snd < search.
Subgoal 4.4:
Variables:
K,K',N,N1 : nat
M,V,V' : tm
M',V2',V1' : tm'
T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\
equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
H16 : le N1 N
============================
{is_nat N}
sim_cc_snd < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_cc_nstep :
forall T K M M' J I V, sim_cc T K M M' -> {nstep J M V} -> {val V} ->
{add J I K} -> (exists V', {eval' M' V'} /\ equiv_cc T I V V').
============================
forall T K M M' J I V, sim_cc T K M M' -> {nstep J M V} -> {val V} ->
{add J I K} -> (exists V', {eval' M' V'} /\ equiv_cc T I V V')
sim_cc_nstep < intros.
Variables:
K,J,I : nat
M,V : tm
M' : tm'
T : ty
H1 : sim_cc T K M M'
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
============================
exists V', {eval' M' V'} /\ equiv_cc T I V V'
sim_cc_nstep < case H1.
Variables:
K,J,I : nat
M,V : tm
M' : tm'
T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
============================
exists V', {eval' M' V'} /\ equiv_cc T I V V'
sim_cc_nstep < apply H5 to _ H2 H3.
Variables:
K,J,I,N : nat
M,V : tm
M',V' : tm'
T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
exists V', {eval' M' V'} /\ equiv_cc T I V V'
sim_cc_nstep < exists V'.
Variables:
K,J,I,N : nat
M,V : tm
M',V' : tm'
T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
{eval' M' V'} /\ equiv_cc T I V V'
sim_cc_nstep < split.
Subgoal 1:
Variables:
K,J,I,N : nat
M,V : tm
M',V' : tm'
T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
{eval' M' V'}
Subgoal 2 is:
equiv_cc T I V V'
sim_cc_nstep < search.
Subgoal 2:
Variables:
K,J,I,N : nat
M,V : tm
M',V' : tm'
T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
equiv_cc T I V V'
sim_cc_nstep < assert I = N.
Subgoal 2.1:
Variables:
K,J,I,N : nat
M,V : tm
M',V' : tm'
T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
I = N
Subgoal 2 is:
equiv_cc T I V V'
sim_cc_nstep < backchain add_arg2_det.
Subgoal 2:
Variables:
K,J,I,N : nat
M,V : tm
M',V' : tm'
T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
H9 : I = N
============================
equiv_cc T I V V'
sim_cc_nstep < case H9.
Subgoal 2:
Variables:
K,J,N : nat
M,V : tm
M',V' : tm'
T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J N K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
equiv_cc T N V V'
sim_cc_nstep < search.
Proof completed.
Abella < Theorem sim_cc_closed_nstep' :
forall T K N M M' M1', {nstep' N M1' M'} -> sim_cc T K M M' ->
sim_cc T K M M1'.
============================
forall T K N M M' M1', {nstep' N M1' M'} -> sim_cc T K M M' ->
sim_cc T K M M1'
sim_cc_closed_nstep' < intros.
Variables:
K,N : nat
M : tm
M',M1' : tm'
T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
============================
sim_cc T K M M1'
sim_cc_closed_nstep' < unfold.
Variables:
K,N : nat
M : tm
M',M1' : tm'
T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
============================
forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
sim_cc_closed_nstep' < intros.
Variables:
K,N,J : nat
M,V : tm
M',M1' : tm'
T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
H3 : le J K
H4 : {nstep J M V}
H5 : {val V}
============================
exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V'
sim_cc_closed_nstep' < case H3.
Variables:
K,N,J,N1 : nat
M,V : tm
M',M1' : tm'
T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
H4 : {nstep J M V}
H5 : {val V}
H6 : {add J N1 K}
============================
exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V'
sim_cc_closed_nstep' < apply sim_cc_nstep to H2 H4 _ _.
Variables:
K,N,J,N1 : nat
M,V : tm
M',M1',V' : tm'
T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
H4 : {nstep J M V}
H5 : {val V}
H6 : {add J N1 K}
H7 : {eval' M' V'}
H8 : equiv_cc T N1 V V'
============================
exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V'
sim_cc_closed_nstep' < apply nstep'_eval_closed to _ H7.
Variables:
K,N,J,N1 : nat
M,V : tm
M',M1',V' : tm'
T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
H4 : {nstep J M V}
H5 : {val V}
H6 : {add J N1 K}
H7 : {eval' M' V'}
H8 : equiv_cc T N1 V V'
H9 : {eval' M1' V'}
============================
exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V'
sim_cc_closed_nstep' < search.
Proof completed.
Abella < Theorem sim_cc_app :
forall T1 T K M1 M1' M2 M2', {is_nat K} -> {is_sty (arr T1 T)} ->
sim_cc (arr T1 T) K M1 M1' -> sim_cc T1 K M2 M2' ->
sim_cc T K (app M1 M2)
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))).
============================
forall T1 T K M1 M1' M2 M2', {is_nat K} -> {is_sty (arr T1 T)} ->
sim_cc (arr T1 T) K M1 M1' -> sim_cc T1 K M2 M2' ->
sim_cc T K (app M1 M2)
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
sim_cc_app < intros.
Variables:
K : nat
M1,M2 : tm
M1',M2' : tm'
T1,T : ty
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
============================
sim_cc T K (app M1 M2)
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
sim_cc_app < unfold.
Variables:
K : nat
M1,M2 : tm
M1',M2' : tm'
T1,T : ty
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
============================
forall J V, le J K -> {nstep J (app M1 M2) V} -> {val V} ->
(exists V' N, {eval'
(let' M1'
(g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add J N K} /\ equiv_cc T N V V')
sim_cc_app < intros.
Variables:
K,J : nat
M1,M2,V : tm
M1',M2' : tm'
T1,T : ty
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
H5 : le J K
H6 : {nstep J (app M1 M2) V}
H7 : {val V}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add J N K} /\ equiv_cc T N V V'
sim_cc_app < assert exists J1 J2 J3 J23 J123 V2 R, {add J2 J3 J23} /\ {add J1 J23 J123} /\ J =
s J123 /\ {nstep J1 M1 (fix R)} /\ {nstep J2 M2 V2} /\ {val V2} /\
{nstep J3 (R (fix R) V2) V}.
Subgoal 1:
Variables:
K,J : nat
M1,M2,V : tm
M1',M2' : tm'
T1,T : ty
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
H5 : le J K
H6 : {nstep J (app M1 M2) V}
H7 : {val V}
============================
exists J1 J2 J3 J23 J123 V2 R, {add J2 J3 J23} /\ {add J1 J23 J123} /\ J =
s J123 /\ {nstep J1 M1 (fix R)} /\ {nstep J2 M2 V2} /\ {val V2} /\
{nstep J3 (R (fix R) V2) V}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add J N K} /\ equiv_cc T N V V'
sim_cc_app < backchain nstep_app_inv.
Variables:
K,J : nat
M1,M2,V : tm
M1',M2' : tm'
T1,T : ty
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
H5 : le J K
H6 : {nstep J (app M1 M2) V}
H7 : {val V}
H8 : exists J1 J2 J3 J23 J123 V2 R, {add J2 J3 J23} /\ {add J1 J23 J123} /\
J =
s J123 /\ {nstep J1 M1 (fix R)} /\ {nstep J2 M2 V2} /\ {val V2} /\
{nstep J3 (R (fix R) V2) V}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add J N K} /\ equiv_cc T N V V'
sim_cc_app < case H8.
Variables:
K,J1,J2,J3,J23,J123 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
H5 : le (s J123) K
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N K} /\ equiv_cc T N V V'
sim_cc_app < case H5.
Variables:
K,J1,J2,J3,J23,J123,N : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H15 : {add (s J123) N K}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N K} /\ equiv_cc T N V V'
sim_cc_app < case H15.
Variables:
J1,J2,J3,J23,J123,N,N3 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert exists N1, {add J1 N1 N3}.
Subgoal 2:
Variables:
J1,J2,J3,J23,J123,N,N3 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
============================
exists N1, {add J1 N1 N3}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain k_minus_n1.
Variables:
J1,J2,J3,J23,J123,N,N3 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H17 : exists N1, {add J1 N1 N3}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < case H17.
Variables:
J1,J2,J3,J23,J123,N,N3,N1 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert exists N2, {add J2 N2 N3}.
Subgoal 3:
Variables:
J1,J2,J3,J23,J123,N,N3,N1 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
============================
exists N2, {add J2 N2 N3}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain k_minus_n2.
Variables:
J1,J2,J3,J23,J123,N,N3,N1 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H19 : exists N2, {add J2 N2 N3}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < case H19.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert exists V1', {eval' M1' V1'} /\ equiv_cc (arr T1 T) (s N1) (fix R) V1'.
Subgoal 4:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
============================
exists V1', {eval' M1' V1'} /\ equiv_cc (arr T1 T) (s N1) (fix R) V1'
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain sim_cc_nstep.
Subgoal 4:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
============================
{add J1 (s N1) (s N3)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain add_s.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H21 : exists V1', {eval' M1' V1'} /\ equiv_cc (arr T1 T) (s N1) (fix R) V1'
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < case H21.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2',V1' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert exists V2', {eval' M2' V2'} /\ equiv_cc T1 (s N2) V2 V2'.
Subgoal 5:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2',V1' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
============================
exists V2', {eval' M2' V2'} /\ equiv_cc T1 (s N2) V2 V2'
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain sim_cc_nstep.
Subgoal 5:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2',V1' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
============================
{add J2 (s N2) (s N3)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain add_s.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2',V1' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H24 : exists V2', {eval' M2' V2'} /\ equiv_cc T1 (s N2) V2 V2'
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < case H24.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert exists K' J12, {add J1 J2 J12} /\ {add J3 N K'} /\ {add J12 K' N3}.
Subgoal 6:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
============================
exists K' J12, {add J1 J2 J12} /\ {add J3 N K'} /\ {add J12 K' N3}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain k_minus_n12.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H27 : exists K' J12, {add J1 J2 J12} /\ {add J3 N K'} /\ {add J12 K' N3}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < case H27.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert lt K' (s N1).
Subgoal 7:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
============================
lt K' (s N1)
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain sum_complement_to_lt1 with N1 = J1, N2 = J2, N = N3.
Subgoal 7:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
============================
{is_nat N3}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < case H1.
Subgoal 7:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : {is_nat N3}
============================
{is_nat N3}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < search.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert lt K' (s N2).
Subgoal 8:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
============================
lt K' (s N2)
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain sum_complement_to_lt2 with N1 = J1, N2 = J2, N = N3.
Subgoal 8:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
============================
{is_nat N3}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < case H1.
Subgoal 8:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : {is_nat N3}
============================
{is_nat N3}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < search.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < apply equiv_cc_arr_val' to _ H23.
Subgoal 9:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
============================
{is_nat (s N1)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert {is_nat N1}.
Subgoal 9.1:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
============================
{is_nat N1}
Subgoal 9 is:
{is_nat (s N1)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain add_arg2_isnat.
Subgoal 9:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V1',V2' : tm'
T1,T : ty
R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {is_nat N1}
============================
{is_nat (s N1)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < search.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert sim_cc T K' (R (fix R) V2) (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))).
Subgoal 10:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
sim_cc T K' (R (fix R) V2) (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain app_equiv_cc_arr with T1 = T1, N1 = s N1, N2 = s N2, R = R, F = R'.
Subgoal 10.1:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
{is_nat (s N1)}
Subgoal 10.2 is:
{is_nat (s N2)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert {is_nat N1}.
Subgoal 10.1.1:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
{is_nat N1}
Subgoal 10.1 is:
{is_nat (s N1)}
Subgoal 10.2 is:
{is_nat (s N2)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain add_arg2_isnat.
Subgoal 10.1:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : {is_nat N1}
============================
{is_nat (s N1)}
Subgoal 10.2 is:
{is_nat (s N2)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < search.
Subgoal 10.2:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
{is_nat (s N2)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert {is_nat N2}.
Subgoal 10.2.1:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
{is_nat N2}
Subgoal 10.2 is:
{is_nat (s N2)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain add_arg2_isnat.
Subgoal 10.2:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : {is_nat N2}
============================
{is_nat (s N2)}
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < search.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
(R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < assert exists V', {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'} /\
equiv_cc T N V V'.
Subgoal 11:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
(R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
============================
exists V', {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'} /\
equiv_cc T N V V'
Subgoal is:
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < backchain sim_cc_nstep.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
(R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H35 : exists V', {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'} /\
equiv_cc T N V V'
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < case H35.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE,V' : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
(R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
exists V' N, {eval'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < exists V'.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE,V' : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
(R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
exists N, {eval' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < exists N.
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE,V' : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
(R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
{eval' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) V'} /\
{add (s J123) N (s N3)} /\ equiv_cc T N V V'
sim_cc_app < split.
Subgoal 12:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE,V' : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
(R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
{eval' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) V'}
Subgoal 13 is:
{add (s J123) N (s N3)}
Subgoal 14 is:
equiv_cc T N V V'
sim_cc_app < apply eval'_open_fwd to _ H25 H36 with R = R', M1 = clos' (abs' R') VE.
Subgoal 12:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE,V' : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
(R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
H38 : {eval'
(open' (clos' (abs' R') VE)
(f\e\app' f (pair' (clos' (abs' R') VE) (pair' M2' e))))
V'}
============================
{eval' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) V'}
Subgoal 13 is:
{add (s J123) N (s N3)}
Subgoal 14 is:
equiv_cc T N V V'
sim_cc_app < backchain eval'_let_fwd with R = g\open' g (f\e\app' f (pair' g (pair' M2' e))).
Subgoal 13:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE,V' : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
(R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
{add (s J123) N (s N3)}
Subgoal 14 is:
equiv_cc T N V V'
sim_cc_app < search.
Subgoal 14:
Variables:
J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
K',J12 : nat
M1,M2,V,V2 : tm
M1',M2',V2',VE,V' : tm'
T1,T : ty
R : tm -> tm -> tm
R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
(R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
equiv_cc T N V V'
sim_cc_app < search.
Proof completed.
Abella < Define subst_env_equiv_cc : (list o) -> nat -> (list (map tm tm)) -> tm' -> prop by
subst_env_equiv_cc nil K ML unit';
subst_env_equiv_cc (of X T :: L) K ML (pair' V' VE) := exists V, subst_env_equiv_cc L K ML VE /\ member (map X V) ML /\
equiv_cc T K V V'.
Abella < Define subst_equiv_cc : (list o) -> nat -> (list (map tm tm)) -> (list (map tm' tm')) -> prop by
nabla e, subst_equiv_cc L K ML (map e VE :: nil) := subst_env_equiv_cc L K ML VE;
nabla x y, subst_equiv_cc (of x T :: L) K (map x V :: ML) (map y V' :: ML') := equiv_cc T K V V' /\ subst_equiv_cc L K ML ML'.
Abella < Theorem subst_env_equiv_cc_closed :
forall L K J ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
le J K -> subst_env_equiv_cc L J ML VE.
============================
forall L K J ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
le J K -> subst_env_equiv_cc L J ML VE
subst_env_equiv_cc_closed < induction on 3.
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
============================
forall L K J ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE @ ->
le J K -> subst_env_equiv_cc L J ML VE
subst_env_equiv_cc_closed < intros.
Variables:
ML : list (map tm tm)
L : list o
K,J : nat
VE : tm'
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx L
H3 : subst_env_equiv_cc L K ML VE @
H4 : le J K
============================
subst_env_equiv_cc L J ML VE
subst_env_equiv_cc_closed < case H3.
Subgoal 1:
Variables:
ML : list (map tm tm)
K,J : nat
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx nil
H4 : le J K
============================
subst_env_equiv_cc nil J ML unit'
Subgoal 2 is:
subst_env_equiv_cc (of X T :: L1) J ML (pair' V' VE1)
subst_env_equiv_cc_closed < search.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K,J : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
subst_env_equiv_cc (of X T :: L1) J ML (pair' V' VE1)
subst_env_equiv_cc_closed < unfold.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K,J : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
exists V, subst_env_equiv_cc L1 J ML VE1 /\ member (map X V) ML /\
equiv_cc T J V V'
subst_env_equiv_cc_closed < exists V.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K,J : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
subst_env_equiv_cc L1 J ML VE1 /\ member (map X V) ML /\ equiv_cc T J V V'
subst_env_equiv_cc_closed < split.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
L1 : list o
K,J : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
subst_env_equiv_cc L1 J ML VE1
Subgoal 2.2 is:
member (map X V) ML
Subgoal 2.3 is:
equiv_cc T J V V'
subst_env_equiv_cc_closed < backchain IH.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
L1 : list o
K,J : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
ctx L1
Subgoal 2.2 is:
member (map X V) ML
Subgoal 2.3 is:
equiv_cc T J V V'
subst_env_equiv_cc_closed < case H2.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
L1 : list o
K,J : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
H8 : ctx L1
H9 : name X
H10 : {is_sty T}
H11 : forall T', member (of X T') L1 -> T = T'
============================
ctx L1
Subgoal 2.2 is:
member (map X V) ML
Subgoal 2.3 is:
equiv_cc T J V V'
subst_env_equiv_cc_closed < search.
Subgoal 2.2:
Variables:
ML : list (map tm tm)
L1 : list o
K,J : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
member (map X V) ML
Subgoal 2.3 is:
equiv_cc T J V V'
subst_env_equiv_cc_closed < search.
Subgoal 2.3:
Variables:
ML : list (map tm tm)
L1 : list o
K,J : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
equiv_cc T J V V'
subst_env_equiv_cc_closed < backchain equiv_cc_closed with K = K.
Subgoal 2.3:
Variables:
ML : list (map tm tm)
L1 : list o
K,J : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
{is_sty T}
subst_env_equiv_cc_closed < case H2.
Subgoal 2.3:
Variables:
ML : list (map tm tm)
L1 : list o
K,J : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> le J K ->
subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
H8 : ctx L1
H9 : name X
H10 : {is_sty T}
H11 : forall T', member (of X T') L1 -> T = T'
============================
{is_sty T}
subst_env_equiv_cc_closed < search.
Proof completed.
Abella < Theorem subst_equiv_cc_closed :
forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv_cc L K ML ML' ->
le J K -> subst_equiv_cc L J ML ML'.
============================
forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv_cc L K ML ML' ->
le J K -> subst_equiv_cc L J ML ML'
subst_equiv_cc_closed < induction on 3.
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
============================
forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv_cc L K ML ML' @ ->
le J K -> subst_equiv_cc L J ML ML'
subst_equiv_cc_closed < intros.
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
K,J : nat
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : ctx L
H3 : subst_equiv_cc L K ML ML' @
H4 : le J K
============================
subst_equiv_cc L J ML ML'
subst_equiv_cc_closed < case H3.
Subgoal 1:
Variables:
ML1 : list (map tm tm)
L1 : list o
K,J : nat
VE : tm'
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : ctx L1
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML1 VE
============================
[n1 : tm']
|> subst_equiv_cc L1 J ML1 (map n1 VE :: nil)
Subgoal 2 is:
[n1 : tm, n2 : tm']
|> subst_equiv_cc (of n1 T :: L1) J (map n1 V :: ML1) (map n2 V' :: ML'1)
subst_equiv_cc_closed < unfold.
Subgoal 1:
Variables:
ML1 : list (map tm tm)
L1 : list o
K,J : nat
VE : tm'
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : ctx L1
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML1 VE
============================
subst_env_equiv_cc L1 J ML1 VE
Subgoal 2 is:
[n1 : tm, n2 : tm']
|> subst_equiv_cc (of n1 T :: L1) J (map n1 V :: ML1) (map n2 V' :: ML'1)
subst_equiv_cc_closed < backchain subst_env_equiv_cc_closed.
Subgoal 2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K,J : nat
V : tm
V' : tm'
T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : [n1 : tm]
|> ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
============================
[n1 : tm, n2 : tm']
|> subst_equiv_cc (of n1 T :: L1) J (map n1 V :: ML1) (map n2 V' :: ML'1)
subst_equiv_cc_closed < unfold.
Subgoal 2.1:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K,J : nat
V : tm
V' : tm'
T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : [n1 : tm]
|> ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
============================
equiv_cc T J V V'
Subgoal 2.2 is:
subst_equiv_cc L1 J ML1 ML'1
subst_equiv_cc_closed < backchain equiv_cc_closed.
Subgoal 2.1:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K,J : nat
V : tm
V' : tm'
T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : [n1 : tm]
|> ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
============================
{is_sty T}
Subgoal 2.2 is:
subst_equiv_cc L1 J ML1 ML'1
subst_equiv_cc_closed < case H2.
Subgoal 2.1:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K,J : nat
V : tm
V' : tm'
T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
H7 : ctx L1
H8 : [n1 : tm]
|> name n1
H9 : {is_sty T}
H10 : [n1 : tm]
|> forall T', member (of n1 T') L1 -> T = T'
============================
{is_sty T}
Subgoal 2.2 is:
subst_equiv_cc L1 J ML1 ML'1
subst_equiv_cc_closed < search.
Subgoal 2.2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K,J : nat
V : tm
V' : tm'
T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : [n1 : tm]
|> ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
============================
subst_equiv_cc L1 J ML1 ML'1
subst_equiv_cc_closed < backchain IH.
Subgoal 2.2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K,J : nat
V : tm
V' : tm'
T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : [n1 : tm]
|> ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
============================
ctx L1
subst_equiv_cc_closed < case H2.
Subgoal 2.2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K,J : nat
V : tm
V' : tm'
T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
H7 : ctx L1
H8 : [n1 : tm]
|> name n1
H9 : {is_sty T}
H10 : [n1 : tm]
|> forall T', member (of n1 T') L1 -> T = T'
============================
ctx L1
subst_equiv_cc_closed < search.
Proof completed.
Abella < Theorem subst_equiv_cc_extend :
forall T L K ML ML' V V', nabla x y, subst_equiv_cc L K ML ML' ->
equiv_cc T K V V' ->
subst_equiv_cc (of x T :: L) K (map x V :: ML) (map y V' :: ML').
============================
forall T L K ML ML' V V', nabla x y, subst_equiv_cc L K ML ML' ->
equiv_cc T K V V' ->
subst_equiv_cc (of x T :: L) K (map x V :: ML) (map y V' :: ML')
subst_equiv_cc_extend < intros.
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
K : nat
V : tm
V' : tm'
T : ty
H1 : subst_equiv_cc L K ML ML'
H2 : equiv_cc T K V V'
============================
[n1 : tm, n2 : tm']
|> subst_equiv_cc (of n1 T :: L) K (map n1 V :: ML) (map n2 V' :: ML')
subst_equiv_cc_extend < unfold.
Subgoal 1:
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
K : nat
V : tm
V' : tm'
T : ty
H1 : subst_equiv_cc L K ML ML'
H2 : equiv_cc T K V V'
============================
equiv_cc T K V V'
Subgoal 2 is:
subst_equiv_cc L K ML ML'
subst_equiv_cc_extend < search.
Subgoal 2:
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
K : nat
V : tm
V' : tm'
T : ty
H1 : subst_equiv_cc L K ML ML'
H2 : equiv_cc T K V V'
============================
subst_equiv_cc L K ML ML'
subst_equiv_cc_extend < search.
Proof completed.
Abella < Theorem subst_env_equiv_cc_val' :
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
{val' VE}.
============================
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
{val' VE}
subst_env_equiv_cc_val' < induction on 3.
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {val' VE}
============================
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE @ ->
{val' VE}
subst_env_equiv_cc_val' < intros.
Variables:
ML : list (map tm tm)
L : list o
K : nat
VE : tm'
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H2 : ctx L
H3 : subst_env_equiv_cc L K ML VE @
============================
{val' VE}
subst_env_equiv_cc_val' < case H3.
Subgoal 1:
Variables:
ML : list (map tm tm)
K : nat
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H2 : ctx nil
============================
{val' unit'}
Subgoal 2 is:
{val' (pair' V' VE1)}
subst_env_equiv_cc_val' < search.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
============================
{val' (pair' V' VE1)}
subst_env_equiv_cc_val' < case H2.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
============================
{val' (pair' V' VE1)}
subst_env_equiv_cc_val' < assert {val' VE1}.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
============================
{val' VE1}
Subgoal 2 is:
{val' (pair' V' VE1)}
subst_env_equiv_cc_val' < backchain IH.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {val' VE1}
============================
{val' (pair' V' VE1)}
subst_env_equiv_cc_val' < assert {val' V'}.
Subgoal 2.2:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {val' VE1}
============================
{val' V'}
Subgoal 2 is:
{val' (pair' V' VE1)}
subst_env_equiv_cc_val' < backchain equiv_cc_val'.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {val' VE1}
H12 : {val' V'}
============================
{val' (pair' V' VE1)}
subst_env_equiv_cc_val' < search.
Proof completed.
Abella < Theorem subst_env_equiv_cc_tm' :
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
{tm' VE}.
============================
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
{tm' VE}
subst_env_equiv_cc_tm' < induction on 3.
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {tm' VE}
============================
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE @ ->
{tm' VE}
subst_env_equiv_cc_tm' < intros.
Variables:
ML : list (map tm tm)
L : list o
K : nat
VE : tm'
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H2 : ctx L
H3 : subst_env_equiv_cc L K ML VE @
============================
{tm' VE}
subst_env_equiv_cc_tm' < case H3.
Subgoal 1:
Variables:
ML : list (map tm tm)
K : nat
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H2 : ctx nil
============================
{tm' unit'}
Subgoal 2 is:
{tm' (pair' V' VE1)}
subst_env_equiv_cc_tm' < search.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
============================
{tm' (pair' V' VE1)}
subst_env_equiv_cc_tm' < case H2.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
============================
{tm' (pair' V' VE1)}
subst_env_equiv_cc_tm' < assert {tm' VE1}.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
============================
{tm' VE1}
Subgoal 2 is:
{tm' (pair' V' VE1)}
subst_env_equiv_cc_tm' < backchain IH.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {tm' VE1}
============================
{tm' (pair' V' VE1)}
subst_env_equiv_cc_tm' < assert {tm' V'}.
Subgoal 2.2:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {tm' VE1}
============================
{tm' V'}
Subgoal 2 is:
{tm' (pair' V' VE1)}
subst_env_equiv_cc_tm' < backchain equiv_cc_tm'.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {tm' VE1}
H12 : {tm' V'}
============================
{tm' (pair' V' VE1)}
subst_env_equiv_cc_tm' < search.
Proof completed.
Abella < Theorem subst_env_equiv_cc_vars_in_subst :
forall L K ML VE Vs, subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
vars_in_subst Vs ML.
============================
forall L K ML VE Vs, subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
subst_env_equiv_cc_vars_in_subst < induction on 1.
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
vars_of_ctx L Vs -> vars_in_subst Vs ML
============================
forall L K ML VE Vs, subst_env_equiv_cc L K ML VE @ -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
subst_env_equiv_cc_vars_in_subst < intros.
Variables:
ML : list (map tm tm)
L : list o
Vs : list tm
K : nat
VE : tm'
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
vars_of_ctx L Vs -> vars_in_subst Vs ML
H1 : subst_env_equiv_cc L K ML VE @
H2 : vars_of_ctx L Vs
============================
vars_in_subst Vs ML
subst_env_equiv_cc_vars_in_subst < case H1.
Subgoal 1:
Variables:
ML : list (map tm tm)
Vs : list tm
K : nat
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
vars_of_ctx L Vs -> vars_in_subst Vs ML
H2 : vars_of_ctx nil Vs
============================
vars_in_subst Vs ML
Subgoal 2 is:
vars_in_subst Vs ML
subst_env_equiv_cc_vars_in_subst < case H2.
Subgoal 1:
Variables:
ML : list (map tm tm)
K : nat
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
vars_of_ctx L Vs -> vars_in_subst Vs ML
============================
vars_in_subst nil ML
Subgoal 2 is:
vars_in_subst Vs ML
subst_env_equiv_cc_vars_in_subst < search.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
Vs : list tm
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
vars_of_ctx L Vs -> vars_in_subst Vs ML
H2 : vars_of_ctx (of X T :: L1) Vs
H3 : subst_env_equiv_cc L1 K ML VE1 *
H4 : member (map X V) ML
H5 : equiv_cc T K V V'
============================
vars_in_subst Vs ML
subst_env_equiv_cc_vars_in_subst < case H2.
Subgoal 2:
Variables:
ML : list (map tm tm)
L1 : list o
Vs1 : list tm
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
vars_of_ctx L Vs -> vars_in_subst Vs ML
H3 : subst_env_equiv_cc L1 K ML VE1 *
H4 : member (map X V) ML
H5 : equiv_cc T K V V'
H6 : vars_of_ctx L1 Vs1
============================
vars_in_subst (X :: Vs1) ML
subst_env_equiv_cc_vars_in_subst < unfold.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
L1 : list o
Vs1 : list tm
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
vars_of_ctx L Vs -> vars_in_subst Vs ML
H3 : subst_env_equiv_cc L1 K ML VE1 *
H4 : member (map X V) ML
H5 : equiv_cc T K V V'
H6 : vars_of_ctx L1 Vs1
============================
vars_in_subst Vs1 ML
Subgoal 2.2 is:
exists V, member (map X V) ML
subst_env_equiv_cc_vars_in_subst < backchain IH.
Subgoal 2.2:
Variables:
ML : list (map tm tm)
L1 : list o
Vs1 : list tm
K : nat
V,X : tm
VE1,V' : tm'
T : ty
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
vars_of_ctx L Vs -> vars_in_subst Vs ML
H3 : subst_env_equiv_cc L1 K ML VE1 *
H4 : member (map X V) ML
H5 : equiv_cc T K V V'
H6 : vars_of_ctx L1 Vs1
============================
exists V, member (map X V) ML
subst_env_equiv_cc_vars_in_subst < search.
Proof completed.
Abella < Theorem subst_equiv_cc_vars_in_subst :
forall L K Vs ML ML', subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_in_subst Vs ML.
============================
forall L K Vs ML ML', subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
subst_equiv_cc_vars_in_subst < induction on 1.
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
============================
forall L K Vs ML ML', subst_equiv_cc L K ML ML' @ -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
subst_equiv_cc_vars_in_subst < intros.
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
Vs : list tm
K : nat
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H1 : subst_equiv_cc L K ML ML' @
H2 : vars_of_ctx L Vs
============================
vars_in_subst Vs ML
subst_equiv_cc_vars_in_subst < case H1.
Subgoal 1:
Variables:
ML1 : list (map tm tm)
L1 : list o
Vs : list tm
K : nat
VE : tm'
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H2 : vars_of_ctx L1 Vs
H3 : subst_env_equiv_cc L1 K ML1 VE
============================
vars_in_subst Vs ML1
Subgoal 2 is:
[n1 : tm]
|> vars_in_subst (Vs n1) (map n1 V :: ML1)
subst_equiv_cc_vars_in_subst < backchain subst_env_equiv_cc_vars_in_subst.
Subgoal 2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K : nat
V : tm
V' : tm'
T : ty
Vs : tm -> (list tm)
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H2 : [n1 : tm]
|> vars_of_ctx (of n1 T :: L1) (Vs n1)
H3 : equiv_cc T K V V'
H4 : subst_equiv_cc L1 K ML1 ML'1 *
============================
[n1 : tm]
|> vars_in_subst (Vs n1) (map n1 V :: ML1)
subst_equiv_cc_vars_in_subst < case H2.
Subgoal 2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K : nat
V : tm
V' : tm'
T : ty
Vs1 : tm -> (list tm)
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : equiv_cc T K V V'
H4 : subst_equiv_cc L1 K ML1 ML'1 *
H5 : [n1 : tm]
|> vars_of_ctx L1 (Vs1 n1)
============================
[n1 : tm]
|> vars_in_subst (n1 :: Vs1 n1) (map n1 V :: ML1)
subst_equiv_cc_vars_in_subst < unfold.
Subgoal 2.1:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K : nat
V : tm
V' : tm'
T : ty
Vs1 : tm -> (list tm)
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : equiv_cc T K V V'
H4 : subst_equiv_cc L1 K ML1 ML'1 *
H5 : [n1 : tm]
|> vars_of_ctx L1 (Vs1 n1)
============================
[n1 : tm]
|> vars_in_subst (Vs1 n1) (map n1 V :: ML1)
Subgoal 2.2 is:
[n1 : tm]
|> exists V1, member (map n1 V1) (map n1 V :: ML1)
subst_equiv_cc_vars_in_subst < apply IH to H4 H5.
Subgoal 2.1:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K : nat
V : tm
V' : tm'
T : ty
Vs1 : tm -> (list tm)
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : equiv_cc T K V V'
H4 : subst_equiv_cc L1 K ML1 ML'1 *
H5 : [n1 : tm]
|> vars_of_ctx L1 (Vs1 n1)
H6 : [n1 : tm]
|> vars_in_subst (Vs1 n1) ML1
============================
[n1 : tm]
|> vars_in_subst (Vs1 n1) (map n1 V :: ML1)
Subgoal 2.2 is:
[n1 : tm]
|> exists V1, member (map n1 V1) (map n1 V :: ML1)
subst_equiv_cc_vars_in_subst < backchain vars_in_subst_extend.
Subgoal 2.2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K : nat
V : tm
V' : tm'
T : ty
Vs1 : tm -> (list tm)
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : equiv_cc T K V V'
H4 : subst_equiv_cc L1 K ML1 ML'1 *
H5 : [n1 : tm]
|> vars_of_ctx L1 (Vs1 n1)
============================
[n1 : tm]
|> exists V1, member (map n1 V1) (map n1 V :: ML1)
subst_equiv_cc_vars_in_subst < search.
Proof completed.
Abella < Theorem subst_env_equiv_cc_mem :
forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs} -> (exists V, member (map X V) ML).
============================
forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs} -> (exists V, member (map X V) ML)
subst_env_equiv_cc_mem < induction on 3.
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs}* -> (exists V, member (map X V) ML)
============================
forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs}@ -> (exists V, member (map X V) ML)
subst_env_equiv_cc_mem < intros.
Variables:
ML : list (map tm tm)
L : list o
Vs : list tm
K : nat
X : tm
E : tm'
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs}* -> (exists V, member (map X V) ML)
H1 : subst_env_equiv_cc L K ML E
H2 : vars_of_ctx L Vs
H3 : {memb X Vs}@
============================
exists V, member (map X V) ML
subst_env_equiv_cc_mem < case H3.
Subgoal 1:
Variables:
ML : list (map tm tm)
L : list o
L1 : list tm
K : nat
X : tm
E : tm'
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs}* -> (exists V, member (map X V) ML)
H1 : subst_env_equiv_cc L K ML E
H2 : vars_of_ctx L (X :: L1)
============================
exists V, member (map X V) ML
Subgoal 2 is:
exists V, member (map X V) ML
subst_env_equiv_cc_mem < case H2.
Subgoal 1:
Variables:
ML : list (map tm tm)
L2 : list o
L1 : list tm
K : nat
X : tm
E : tm'
T : ty
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs}* -> (exists V, member (map X V) ML)
H1 : subst_env_equiv_cc (of X T :: L2) K ML E
H4 : vars_of_ctx L2 L1
============================
exists V, member (map X V) ML
Subgoal 2 is:
exists V, member (map X V) ML
subst_env_equiv_cc_mem < case H1.
Subgoal 1:
Variables:
ML : list (map tm tm)
L2 : list o
L1 : list tm
K : nat
X,V : tm
VE,V' : tm'
T : ty
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs}* -> (exists V, member (map X V) ML)
H4 : vars_of_ctx L2 L1
H5 : subst_env_equiv_cc L2 K ML VE
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
exists V, member (map X V) ML
Subgoal 2 is:
exists V, member (map X V) ML
subst_env_equiv_cc_mem < search.
Subgoal 2:
Variables:
ML : list (map tm tm)
L : list o
L1 : list tm
K : nat
X,X1 : tm
E : tm'
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs}* -> (exists V, member (map X V) ML)
H1 : subst_env_equiv_cc L K ML E
H2 : vars_of_ctx L (X1 :: L1)
H4 : {memb X L1}*
============================
exists V, member (map X V) ML
subst_env_equiv_cc_mem < case H2.
Subgoal 2:
Variables:
ML : list (map tm tm)
L2 : list o
L1 : list tm
K : nat
X,X1 : tm
E : tm'
T : ty
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs}* -> (exists V, member (map X V) ML)
H1 : subst_env_equiv_cc (of X1 T :: L2) K ML E
H4 : {memb X L1}*
H5 : vars_of_ctx L2 L1
============================
exists V, member (map X V) ML
subst_env_equiv_cc_mem < case H1.
Subgoal 2:
Variables:
ML : list (map tm tm)
L2 : list o
L1 : list tm
K : nat
X,X1,V : tm
VE,V' : tm'
T : ty
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs}* -> (exists V, member (map X V) ML)
H4 : {memb X L1}*
H5 : vars_of_ctx L2 L1
H6 : subst_env_equiv_cc L2 K ML VE
H7 : member (map X1 V) ML
H8 : equiv_cc T K V V'
============================
exists V, member (map X V) ML
subst_env_equiv_cc_mem < apply IH to H6 H5 H4.
Subgoal 2:
Variables:
ML : list (map tm tm)
L2 : list o
L1 : list tm
K : nat
X,X1,V,V1 : tm
VE,V' : tm'
T : ty
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
{memb X Vs}* -> (exists V, member (map X V) ML)
H4 : {memb X L1}*
H5 : vars_of_ctx L2 L1
H6 : subst_env_equiv_cc L2 K ML VE
H7 : member (map X1 V) ML
H8 : equiv_cc T K V V'
H9 : member (map X V1) ML
============================
exists V, member (map X V) ML
subst_env_equiv_cc_mem < search.
Proof completed.
Abella < Theorem subst_equiv_cc_mem :
forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
{memb X Vs} -> (exists V, member (map X V) ML).
============================
forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
{memb X Vs} -> (exists V, member (map X V) ML)
subst_equiv_cc_mem < induction on 1.
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
============================
forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' @ -> vars_of_ctx L Vs ->
{memb X Vs} -> (exists V, member (map X V) ML)
subst_equiv_cc_mem < intros.
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
Vs : list tm
K : nat
X : tm
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H1 : subst_equiv_cc L K ML ML' @
H2 : vars_of_ctx L Vs
H3 : {memb X Vs}
============================
exists V, member (map X V) ML
subst_equiv_cc_mem < case H1.
Subgoal 1:
Variables:
ML1 : list (map tm tm)
L1 : list o
Vs : list tm
K : nat
X : tm
VE : tm'
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H2 : vars_of_ctx L1 Vs
H3 : {memb X Vs}
H4 : subst_env_equiv_cc L1 K ML1 VE
============================
exists V, member (map X V) ML1
Subgoal 2 is:
[n1 : tm]
|> exists V1, member (map (X n1) V1) (map n1 V :: ML1)
subst_equiv_cc_mem < backchain subst_env_equiv_cc_mem.
Subgoal 2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K : nat
V : tm
V' : tm'
T : ty
Vs : tm -> (list tm)
X : tm -> tm
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H2 : [n1 : tm]
|> vars_of_ctx (of n1 T :: L1) (Vs n1)
H3 : [n1 : tm]
|> {memb (X n1) (Vs n1)}
H4 : equiv_cc T K V V'
H5 : subst_equiv_cc L1 K ML1 ML'1 *
============================
[n1 : tm]
|> exists V1, member (map (X n1) V1) (map n1 V :: ML1)
subst_equiv_cc_mem < case H2.
Subgoal 2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K : nat
V : tm
V' : tm'
T : ty
Vs1 : tm -> (list tm)
X : tm -> tm
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H3 : [n1 : tm]
|> {memb (X n1) (n1 :: Vs1 n1)}
H4 : equiv_cc T K V V'
H5 : subst_equiv_cc L1 K ML1 ML'1 *
H6 : [n1 : tm]
|> vars_of_ctx L1 (Vs1 n1)
============================
[n1 : tm]
|> exists V1, member (map (X n1) V1) (map n1 V :: ML1)
subst_equiv_cc_mem < case H3.
Subgoal 2.1:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K : nat
V : tm
V' : tm'
T : ty
Vs1 : tm -> (list tm)
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H4 : equiv_cc T K V V'
H5 : subst_equiv_cc L1 K ML1 ML'1 *
H6 : [n1 : tm]
|> vars_of_ctx L1 (Vs1 n1)
============================
[n1 : tm]
|> exists V1, member (map n1 V1) (map n1 V :: ML1)
Subgoal 2.2 is:
[n1 : tm]
|> exists V1, member (map (X n1) V1) (map n1 V :: ML1)
subst_equiv_cc_mem < search.
Subgoal 2.2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K : nat
V : tm
V' : tm'
T : ty
Vs1 : tm -> (list tm)
X : tm -> tm
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H4 : equiv_cc T K V V'
H5 : subst_equiv_cc L1 K ML1 ML'1 *
H6 : [n1 : tm]
|> vars_of_ctx L1 (Vs1 n1)
H7 : [n1 : tm]
|> {memb (X n1) (Vs1 n1)}
============================
[n1 : tm]
|> exists V1, member (map (X n1) V1) (map n1 V :: ML1)
subst_equiv_cc_mem < apply IH to H5 H6 H7.
Subgoal 2.2:
Variables:
ML1 : list (map tm tm)
ML'1 : list (map tm' tm')
L1 : list o
K : nat
V : tm
V' : tm'
T : ty
Vs1 : tm -> (list tm)
X,V1 : tm -> tm
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H4 : equiv_cc T K V V'
H5 : subst_equiv_cc L1 K ML1 ML'1 *
H6 : [n1 : tm]
|> vars_of_ctx L1 (Vs1 n1)
H7 : [n1 : tm]
|> {memb (X n1) (Vs1 n1)}
H8 : [n1 : tm]
|> member (map (X n1) (V1 n1)) ML1
============================
[n1 : tm]
|> exists V1, member (map (X n1) V1) (map n1 V :: ML1)
subst_equiv_cc_mem < search.
Proof completed.
Abella < Theorem eq_memb_rewrite_tm' :
forall A B X M', nabla x, A = B -> {memb (map X (M' x)) (B x)} ->
{memb (map X (M' x)) (A x)}.
============================
forall A B X M', nabla x, A = B -> {memb (map X (M' x)) (B x)} ->
{memb (map X (M' x)) (A x)}
eq_memb_rewrite_tm' < intros.
Variables:
X : tm
A,B : tm' -> (list (map tm tm'))
M' : tm' -> tm'
H1 : A = B
H2 : [n1 : tm']
|> {memb (map X (M' n1)) (B n1)}
============================
[n1 : tm']
|> {memb (map X (M' n1)) (A n1)}
eq_memb_rewrite_tm' < case H1.
Variables:
X : tm
B : tm' -> (list (map tm tm'))
M' : tm' -> tm'
H2 : [n1 : tm']
|> {memb (map X (M' n1)) (B n1)}
============================
[n1 : tm']
|> {memb (map X (M' n1)) (B n1)}
eq_memb_rewrite_tm' < search.
Proof completed.
Abella < Define env_elem_aux : (tm' -> tm') -> prop by
env_elem_aux x\x;
env_elem_aux (x\snd' (R x)) := env_elem_aux R.
Abella < Define env_elem : (tm' -> tm') -> prop by
env_elem (x\fst' (R x)) := env_elem_aux R.
Abella < Theorem env_elem_aux_closed :
forall E, nabla x, env_elem_aux (E x) -> (exists E', E = y\E').
============================
forall E, nabla x, env_elem_aux (E x) -> (exists E', E = y\E')
env_elem_aux_closed < induction on 1.
IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
============================
forall E, nabla x, env_elem_aux (E x) @ -> (exists E', E = y\E')
env_elem_aux_closed < intros.
Variables:
E : tm' -> tm' -> tm'
IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
H1 : [n1 : tm']
|> env_elem_aux (E n1) @
============================
exists E', E = y\E'
env_elem_aux_closed < case H1.
Subgoal 1:
IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
============================
exists E', z1\z2\z2 = y\E'
Subgoal 2 is:
exists E', z1\z2\snd' (R z1 z2) = y\E'
env_elem_aux_closed < search.
Subgoal 2:
Variables:
R : tm' -> tm' -> tm'
IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
H2 : [n1 : tm']
|> env_elem_aux (R n1) *
============================
exists E', z1\z2\snd' (R z1 z2) = y\E'
env_elem_aux_closed < apply IH to H2.
Subgoal 2:
Variables:
E' : tm' -> tm'
IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
H2 : env_elem_aux E' *
============================
exists E'1, z1\z2\snd' (E' z2) = y\E'1
env_elem_aux_closed < search.
Proof completed.
Abella < Theorem env_elem_closed :
forall E, nabla x, env_elem (E x) -> (exists E', E = y\E').
============================
forall E, nabla x, env_elem (E x) -> (exists E', E = y\E')
env_elem_closed < intros.
Variables:
E : tm' -> tm' -> tm'
H1 : [n1 : tm']
|> env_elem (E n1)
============================
exists E', E = y\E'
env_elem_closed < case H1.
Variables:
R : tm' -> tm' -> tm'
H2 : [n1 : tm']
|> env_elem_aux (R n1)
============================
exists E', z1\z2\fst' (R z1 z2) = y\E'
env_elem_closed < apply env_elem_aux_closed to H2.
Variables:
E' : tm' -> tm'
H2 : env_elem_aux E'
============================
exists E'1, z1\z2\fst' (E' z2) = y\E'1
env_elem_closed < search.
Proof completed.
Abella < Theorem env_elem_aux_extend :
forall E, env_elem_aux E -> env_elem_aux (x\E (snd' x)).
============================
forall E, env_elem_aux E -> env_elem_aux (x\E (snd' x))
env_elem_aux_extend < induction on 1.
IH : forall E, env_elem_aux E * -> env_elem_aux (x\E (snd' x))
============================
forall E, env_elem_aux E @ -> env_elem_aux (x\E (snd' x))
env_elem_aux_extend < intros.
Variables:
E : tm' -> tm'
IH : forall E, env_elem_aux E * -> env_elem_aux (x\E (snd' x))
H1 : env_elem_aux E @
============================
env_elem_aux (x\E (snd' x))
env_elem_aux_extend < case H1.
Subgoal 1:
IH : forall E, env_elem_aux E * -> env_elem_aux (x\E (snd' x))
============================
env_elem_aux (x\snd' x)
Subgoal 2 is:
env_elem_aux (x\snd' (R (snd' x)))
env_elem_aux_extend < search.
Subgoal 2:
Variables:
R : tm' -> tm'
IH : forall E, env_elem_aux E * -> env_elem_aux (x\E (snd' x))
H2 : env_elem_aux R *
============================
env_elem_aux (x\snd' (R (snd' x)))
env_elem_aux_extend < apply IH to H2.
Subgoal 2:
Variables:
R : tm' -> tm'
IH : forall E, env_elem_aux E * -> env_elem_aux (x\E (snd' x))
H2 : env_elem_aux R *
H3 : env_elem_aux (x\R (snd' x))
============================
env_elem_aux (x\snd' (R (snd' x)))
env_elem_aux_extend < search.
Proof completed.
Abella < Theorem env_elem_extend :
forall E, env_elem E -> env_elem (x\E (snd' x)).
============================
forall E, env_elem E -> env_elem (x\E (snd' x))
env_elem_extend < intros.
Variables:
E : tm' -> tm'
H1 : env_elem E
============================
env_elem (x\E (snd' x))
env_elem_extend < case H1.
Variables:
R : tm' -> tm'
H2 : env_elem_aux R
============================
env_elem (x\fst' (R (snd' x)))
env_elem_extend < apply env_elem_aux_extend to H2.
Variables:
R : tm' -> tm'
H2 : env_elem_aux R
H3 : env_elem_aux (x\R (snd' x))
============================
env_elem (x\fst' (R (snd' x)))
env_elem_extend < search.
Proof completed.
Abella < Theorem env_elem_aux_eval'_cong :
forall E E1 E2 V V', env_elem_aux E -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}.
============================
forall E E1 E2 V V', env_elem_aux E -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}
env_elem_aux_eval'_cong < induction on 1.
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}
============================
forall E E1 E2 V V', env_elem_aux E @ -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}
env_elem_aux_eval'_cong < intros.
Variables:
E1,E2,V,V' : tm'
E : tm' -> tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}
H1 : env_elem_aux E @
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (E E1) V'}
============================
{eval' (E E2) V'}
env_elem_aux_eval'_cong < case H1.
Subgoal 1:
Variables:
E1,E2,V,V' : tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' E1 V'}
============================
{eval' E2 V'}
Subgoal 2 is:
{eval' (snd' (R E2)) V'}
env_elem_aux_eval'_cong < apply eval'_det to H2 H4.
Subgoal 1:
Variables:
E1,E2,V' : tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}
H2 : {eval' E1 V'}
H3 : {eval' E2 V'}
H4 : {eval' E1 V'}
============================
{eval' E2 V'}
Subgoal 2 is:
{eval' (snd' (R E2)) V'}
env_elem_aux_eval'_cong < search.
Subgoal 2:
Variables:
E1,E2,V,V' : tm'
R : tm' -> tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (snd' (R E1)) V'}
H5 : env_elem_aux R *
============================
{eval' (snd' (R E2)) V'}
env_elem_aux_eval'_cong < apply eval'_snd_inv to H4.
Subgoal 2:
Variables:
E1,E2,V,V',V'1 : tm'
R : tm' -> tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (snd' (R E1)) V'}
H5 : env_elem_aux R *
H6 : {eval' (R E1) (pair' V'1 V')}
============================
{eval' (snd' (R E2)) V'}
env_elem_aux_eval'_cong < apply IH to H5 H2 H3 H6.
Subgoal 2:
Variables:
E1,E2,V,V',V'1 : tm'
R : tm' -> tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (snd' (R E1)) V'}
H5 : env_elem_aux R *
H6 : {eval' (R E1) (pair' V'1 V')}
H7 : {eval' (R E2) (pair' V'1 V')}
============================
{eval' (snd' (R E2)) V'}
env_elem_aux_eval'_cong < backchain eval'_snd_fwd.
Proof completed.
Abella < Theorem env_elem_eval'_cong :
forall E E1 E2 V V', env_elem E -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}.
============================
forall E E1 E2 V V', env_elem E -> {eval' E1 V} -> {eval' E2 V} ->
{eval' (E E1) V'} -> {eval' (E E2) V'}
env_elem_eval'_cong < intros.
Variables:
E1,E2,V,V' : tm'
E : tm' -> tm'
H1 : env_elem E
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (E E1) V'}
============================
{eval' (E E2) V'}
env_elem_eval'_cong < case H1.
Variables:
E1,E2,V,V' : tm'
R : tm' -> tm'
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (fst' (R E1)) V'}
H5 : env_elem_aux R
============================
{eval' (fst' (R E2)) V'}
env_elem_eval'_cong < apply eval'_fst_inv to H4.
Variables:
E1,E2,V,V',V'1 : tm'
R : tm' -> tm'
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (fst' (R E1)) V'}
H5 : env_elem_aux R
H6 : {eval' (R E1) (pair' V' V'1)}
============================
{eval' (fst' (R E2)) V'}
env_elem_eval'_cong < apply env_elem_aux_eval'_cong to H5 H2 H3 H6.
Variables:
E1,E2,V,V',V'1 : tm'
R : tm' -> tm'
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (fst' (R E1)) V'}
H5 : env_elem_aux R
H6 : {eval' (R E1) (pair' V' V'1)}
H7 : {eval' (R E2) (pair' V' V'1)}
============================
{eval' (fst' (R E2)) V'}
env_elem_eval'_cong < backchain eval'_fst_fwd.
Proof completed.
Abella < Theorem mapvar_mem :
forall FVs Map X E Env, nabla x, {mapvar FVs Map} ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\ {memb (map X (E' x)) (Map x)}).
============================
forall FVs Map X E Env, nabla x, {mapvar FVs Map} ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\ {memb (map X (E' x)) (Map x)})
mapvar_mem < induction on 1.
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
============================
forall FVs Map X E Env, nabla x, {mapvar FVs Map}@ ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\ {memb (map X (E' x)) (Map x)})
mapvar_mem < intros.
Variables:
FVs : list tm
X : tm
E,Env : tm'
Map : tm' -> (list (map tm tm'))
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H1 : {mapvar FVs Map}@
H2 : {memb (map X E) (Map Env)}
============================
[n1 : tm']
|> exists E', E = E' Env /\ env_elem E' /\ {memb (map X (E' n1)) (Map n1)}
mapvar_mem < case H1.
Subgoal 1:
Variables:
X : tm
E,Env : tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H2 : {memb (map X E) nil}
============================
[n1 : tm']
|> exists E', E = E' Env /\ env_elem E' /\ {memb (map X (E' n1)) nil}
Subgoal 2 is:
[n1 : tm']
|> exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < case H2.
Subgoal 2:
Variables:
L : list tm
X,X1 : tm
E,Env : tm'
Map1 : tm' -> (list (map tm tm'))
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H2 : {memb (map X E) (map X1 (fst' Env) :: Map1 (snd' Env))}
H3 : {mapvar L Map1}*
============================
[n1 : tm']
|> exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < case H2.
Subgoal 2.1:
Variables:
L : list tm
X1 : tm
Env : tm'
Map1 : tm' -> (list (map tm tm'))
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
============================
[n1 : tm']
|> exists E', fst' Env = E' Env /\ env_elem E' /\
{memb (map X1 (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}
Subgoal 2.2 is:
[n1 : tm']
|> exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < exists x\fst' x.
Subgoal 2.1:
Variables:
L : list tm
X1 : tm
Env : tm'
Map1 : tm' -> (list (map tm tm'))
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
============================
[n1 : tm']
|> fst' Env = fst' Env /\ env_elem (x\fst' x) /\
{memb (map X1 (fst' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}
Subgoal 2.2 is:
[n1 : tm']
|> exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < search.
Subgoal 2.2:
Variables:
L : list tm
X,X1 : tm
E,Env : tm'
Map1 : tm' -> (list (map tm tm'))
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
============================
[n1 : tm']
|> exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < apply IH to H3 H4.
Subgoal 2.2:
Variables:
L : list tm
X,X1 : tm
E,Env : tm'
Map1 : tm' -> (list (map tm tm'))
E' : tm' -> tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : [n1 : tm']
|> E = E' n1 (snd' Env)
H6 : [n1 : tm']
|> env_elem (E' n1)
H7 : [n1 : tm']
|> {memb (map X (E' n1 n1)) (Map1 n1)}
============================
[n1 : tm']
|> exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < apply env_elem_closed to H6.
Subgoal 2.2:
Variables:
L : list tm
X,X1 : tm
E,Env : tm'
Map1 : tm' -> (list (map tm tm'))
E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
|> {memb (map X (E'1 n1)) (Map1 n1)}
============================
[n1 : tm']
|> exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < exists x\E'1 (snd' x).
Subgoal 2.2:
Variables:
L : list tm
X,X1 : tm
E,Env : tm'
Map1 : tm' -> (list (map tm tm'))
E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
|> {memb (map X (E'1 n1)) (Map1 n1)}
============================
[n1 : tm']
|> E = E'1 (snd' Env) /\ env_elem (x\E'1 (snd' x)) /\
{memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < split.
Subgoal 2.2.1:
Variables:
L : list tm
X,X1 : tm
E,Env : tm'
Map1 : tm' -> (list (map tm tm'))
E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
|> {memb (map X (E'1 n1)) (Map1 n1)}
============================
E = E'1 (snd' Env)
Subgoal 2.2.2 is:
env_elem (x\E'1 (snd' x))
Subgoal 2.2.3 is:
[n1 : tm']
|> {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < search.
Subgoal 2.2.2:
Variables:
L : list tm
X,X1 : tm
E,Env : tm'
Map1 : tm' -> (list (map tm tm'))
E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
|> {memb (map X (E'1 n1)) (Map1 n1)}
============================
env_elem (x\E'1 (snd' x))
Subgoal 2.2.3 is:
[n1 : tm']
|> {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < apply env_elem_extend to H6.
Subgoal 2.2.2:
Variables:
L : list tm
X,X1 : tm
E,Env : tm'
Map1 : tm' -> (list (map tm tm'))
E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
|> {memb (map X (E'1 n1)) (Map1 n1)}
H8 : env_elem (x\E'1 (snd' x))
============================
env_elem (x\E'1 (snd' x))
Subgoal 2.2.3 is:
[n1 : tm']
|> {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < search.
Subgoal 2.2.3:
Variables:
L : list tm
X,X1 : tm
E,Env : tm'
Map1 : tm' -> (list (map tm tm'))
E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
|> {memb (map X (E'1 n1)) (Map1 n1)}
============================
[n1 : tm']
|> {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < inst H7 with n1 = snd' n1.
Subgoal 2.2.3:
Variables:
L : list tm
X,X1 : tm
E,Env : tm'
Map1 : tm' -> (list (map tm tm'))
E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{memb (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
|> {memb (map X (E'1 n1)) (Map1 n1)}
H8 : [n1 : tm']
|> {memb (map X (E'1 (snd' n1))) (Map1 (snd' n1))}
============================
[n1 : tm']
|> {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}
mapvar_mem < search.
Proof completed.
Abella < Theorem mapvar_sync :
forall Vs Map X M E, {mapvar Vs Map} -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}.
============================
forall Vs Map X M E, {mapvar Vs Map} -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
mapvar_sync < induction on 1.
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
============================
forall Vs Map X M E, {mapvar Vs Map}@ -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
mapvar_sync < intros.
Variables:
Vs : list tm
X : tm
E : tm'
Map : tm' -> (list (map tm tm'))
M : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
H1 : {mapvar Vs Map}@
H2 : {memb (map X (M E)) (Map E)}
============================
{memb X Vs}
mapvar_sync < case H1.
Subgoal 1:
Variables:
X : tm
E : tm'
M : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
H2 : {memb (map X (M E)) nil}
============================
{memb X nil}
Subgoal 2 is:
{memb X (X1 :: L)}
mapvar_sync < case H2.
Subgoal 2:
Variables:
L : list tm
X,X1 : tm
E : tm'
Map1 : tm' -> (list (map tm tm'))
M : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
H2 : {memb (map X (M E)) (map X1 (fst' E) :: Map1 (snd' E))}
H3 : {mapvar L Map1}*
============================
{memb X (X1 :: L)}
mapvar_sync < case H2.
Subgoal 2.1:
Variables:
L : list tm
X1 : tm
E : tm'
Map1 : tm' -> (list (map tm tm'))
M : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
H3 : {mapvar L Map1}*
H4 : M E = fst' E
============================
{memb X1 (X1 :: L)}
Subgoal 2.2 is:
{memb X (X1 :: L)}
mapvar_sync < search.
Subgoal 2.2:
Variables:
L : list tm
X,X1 : tm
E : tm'
Map1 : tm' -> (list (map tm tm'))
M : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map X (M E)) (Map1 (snd' E))}
============================
{memb X (X1 :: L)}
mapvar_sync < apply mapvar_mem to H3 H4.
Subgoal 2.2:
Variables:
L : list tm
X,X1 : tm
E : tm'
Map1 : tm' -> (list (map tm tm'))
M : tm' -> tm'
E' : tm' -> tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map X (M E)) (Map1 (snd' E))}
H5 : [n1 : tm']
|> M E = E' n1 (snd' E)
H6 : [n1 : tm']
|> env_elem (E' n1)
H7 : [n1 : tm']
|> {memb (map X (E' n1 n1)) (Map1 n1)}
============================
{memb X (X1 :: L)}
mapvar_sync < apply env_elem_closed to H6.
Subgoal 2.2:
Variables:
L : list tm
X,X1 : tm
E : tm'
Map1 : tm' -> (list (map tm tm'))
M,E'1 : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map X (M E)) (Map1 (snd' E))}
H5 : M E = E'1 (snd' E)
H6 : env_elem E'1
H7 : [n1 : tm']
|> {memb (map X (E'1 n1)) (Map1 n1)}
============================
{memb X (X1 :: L)}
mapvar_sync < apply IH to H3 H7 with M = E'1, Map = Map1.
Subgoal 2.2:
Variables:
L : list tm
X,X1 : tm
E : tm'
Map1 : tm' -> (list (map tm tm'))
M,E'1 : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
{memb X Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map X (M E)) (Map1 (snd' E))}
H5 : M E = E'1 (snd' E)
H6 : env_elem E'1
H7 : [n1 : tm']
|> {memb (map X (E'1 n1)) (Map1 n1)}
H8 : {memb X L}
============================
{memb X (X1 :: L)}
mapvar_sync < search.
Proof completed.
Abella < Theorem eq_rewrite_eval' :
forall A B C V, nabla x, A x = B x -> {eval' (B C) V} -> {eval' (A C) V}.
============================
forall A B C V, nabla x, A x = B x -> {eval' (B C) V} -> {eval' (A C) V}
eq_rewrite_eval' < intros.
Variables:
C,V : tm'
A,B : tm' -> tm'
H1 : [n1 : tm']
|> A n1 = B n1
H2 : {eval' (B C) V}
============================
{eval' (A C) V}
eq_rewrite_eval' < case H1.
Variables:
C,V : tm'
B : tm' -> tm'
H2 : {eval' (B C) V}
============================
{eval' (B C) V}
eq_rewrite_eval' < search.
Proof completed.
Abella < Theorem fvar_sem_pres :
forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L -> subst ML ->
subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs -> {mapvar Vs Map} ->
member (of X T) L -> {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V').
============================
forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map} -> member (of X T) L -> {memb (map X (M' e)) (Map e)} ->
app_subst ML X V -> (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
fvar_sem_pres < induction on 6.
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
============================
forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}@ -> member (of X T) L -> {memb (map X (M' e)) (Map e)} ->
app_subst ML X V -> (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
fvar_sem_pres < intros.
Variables:
ML : list (map tm tm)
L : list o
Vs : list tm
K : nat
X,V : tm
VE : tm'
T : ty
Map : tm' -> (list (map tm tm'))
M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv_cc L K ML VE
H5 : vars_of_ctx L Vs
H6 : {mapvar Vs Map}@
H7 : member (of X T) L
H8 : [n1 : tm']
|> {memb (map X (M' n1)) (Map n1)}
H9 : app_subst ML X V
============================
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < case H8.
Subgoal 1:
Variables:
ML : list (map tm tm)
L : list o
Vs : list tm
K : nat
X,V : tm
VE : tm'
T : ty
L1 : tm' -> (list (map tm tm'))
M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv_cc L K ML VE
H5 : vars_of_ctx L Vs
H6 : {mapvar Vs (z1\map X (M' z1) :: L1 z1)}@
H7 : member (of X T) L
H9 : app_subst ML X V
============================
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < case H6.
Subgoal 1:
Variables:
ML : list (map tm tm)
L : list o
L2 : list tm
K : nat
X,V : tm
VE : tm'
T : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv_cc L K ML VE
H5 : vars_of_ctx L (X :: L2)
H7 : member (of X T) L
H9 : app_subst ML X V
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
============================
exists V', {eval' (fst' VE) V'} /\ equiv_cc T K V V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < case H5.
Subgoal 1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V : tm
VE : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H4 : subst_env_equiv_cc (of X T1 :: L3) K ML VE
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
============================
exists V', {eval' (fst' VE) V'} /\ equiv_cc T K V V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < case H4.
Subgoal 1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
exists V'1, {eval' (fst' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < apply subst_var_eq to _ H14 H9.
Subgoal 1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
exists V'1, {eval' (fst' (pair' V' VE1)) V'1} /\ equiv_cc T K V1 V'1
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < exists V'.
Subgoal 1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
{eval' (fst' (pair' V' VE1)) V'} /\ equiv_cc T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < split.
Subgoal 1.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv_cc T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < apply equiv_cc_val' to _ _ H15.
Subgoal 1.1.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
{is_sty T1}
Subgoal 1.1 is:
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv_cc T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < case H2.
Subgoal 1.1.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
H16 : ctx L3
H17 : name X
H18 : {is_sty T1}
H19 : forall T', member (of X T') L3 -> T1 = T'
============================
{is_sty T1}
Subgoal 1.1 is:
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv_cc T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < search.
Subgoal 1.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
H16 : {val' V'}
============================
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv_cc T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < apply subst_env_equiv_cc_val' to _ _ H13.
Subgoal 1.1.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
H16 : {val' V'}
============================
ctx L3
Subgoal 1.1 is:
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv_cc T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < case H2.
Subgoal 1.1.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
H16 : {val' V'}
H17 : ctx L3
H18 : name X
H19 : {is_sty T1}
H20 : forall T', member (of X T') L3 -> T1 = T'
============================
ctx L3
Subgoal 1.1 is:
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv_cc T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < search.
Subgoal 1.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
H16 : {val' V'}
H17 : {val' VE1}
============================
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv_cc T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < search.
Subgoal 1.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
equiv_cc T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < apply ctx_mem_sync to H2 H7 _ with T' = T1.
Subgoal 1.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V1 : tm
VE1,V' : tm'
T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T1) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
equiv_cc T1 K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < search.
Subgoal 2:
Variables:
ML : list (map tm tm)
L : list o
Vs : list tm
K : nat
X,V : tm
VE : tm'
T : ty
L1 : tm' -> (list (map tm tm'))
X1 : tm' -> (map tm tm')
M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv_cc L K ML VE
H5 : vars_of_ctx L Vs
H6 : {mapvar Vs (z1\X1 z1 :: L1 z1)}@
H7 : member (of X T) L
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
============================
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < case H6.
Subgoal 2:
Variables:
ML : list (map tm tm)
L : list o
L2 : list tm
K : nat
X,V,X2 : tm
VE : tm'
T : ty
L1,Map1 : tm' -> (list (map tm tm'))
M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv_cc L K ML VE
H5 : vars_of_ctx L (X2 :: L2)
H7 : member (of X T) L
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
============================
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < case H5.
Subgoal 2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2 : tm
VE : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H4 : subst_env_equiv_cc (of X2 T1 :: L3) K ML VE
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
============================
exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'
fvar_sem_pres < case H4.
Subgoal 2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply eq_memb_rewrite_tm' to H11 H10.
Subgoal 2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply mapvar_mem to H12 H17.
Subgoal 2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M' : tm' -> tm'
E' : tm' -> tm' -> tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm', n2 : tm']
|> M' n1 = E' n1 n2 (snd' n1)
H19 : [n1 : tm', n2 : tm']
|> env_elem (E' n1 n2)
H20 : [n1 : tm', n2 : tm']
|> {memb (map X (E' n1 n2 n2)) (Map1 n2)}
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply env_elem_closed to H19.
Subgoal 2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M' : tm' -> tm'
E'1 : tm' -> tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm', n2 : tm']
|> M' n1 = E'1 n2 (snd' n1)
H19 : [n2 : tm']
|> env_elem (E'1 n2)
H20 : [n2 : tm']
|> {memb (map X (E'1 n2 n2)) (Map1 n2)}
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply env_elem_closed to H19.
Subgoal 2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply IH to _ _ _ H14 H13 H12 _ H20 H9 with T = T.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
============================
member (of X T) L3
Subgoal 2.2 is:
ctx L3
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply mapvar_sync to H12 H20 with M = E'2, Map = Map1.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {memb X L2}
============================
member (of X T) L3
Subgoal 2.2 is:
ctx L3
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply lst_mem_to_ctx_mem to H13 H21.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1,T2 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {memb X L2}
H22 : member (of X T2) L3
============================
member (of X T) L3
Subgoal 2.2 is:
ctx L3
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < case H7 (keep).
Subgoal 2.1.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
V,X2,V1 : tm
VE1,V' : tm'
T1,T2 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X2 T1) (of X2 T1 :: L3)
H9 : app_subst ML X2 V
H10 : [n1 : tm']
|> {memb (map X2 (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X2 (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X2 (E'2 n2)) (Map1 n2)}
H21 : {memb X2 L2}
H22 : member (of X2 T2) L3
============================
member (of X2 T1) L3
Subgoal 2.1.2 is:
member (of X T) L3
Subgoal 2.2 is:
ctx L3
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply ctx_mem_sync to H2 H7 _ with T' = T2.
Subgoal 2.1.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
V,X2,V1 : tm
VE1,V' : tm'
T2 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T2 :: L3)
H3 : subst ML
H7 : member (of X2 T2) (of X2 T2 :: L3)
H9 : app_subst ML X2 V
H10 : [n1 : tm']
|> {memb (map X2 (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T2 K V1 V'
H17 : [n1 : tm']
|> {memb (map X2 (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X2 (E'2 n2)) (Map1 n2)}
H21 : {memb X2 L2}
H22 : member (of X2 T2) L3
============================
member (of X2 T2) L3
Subgoal 2.1.2 is:
member (of X T) L3
Subgoal 2.2 is:
ctx L3
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < search.
Subgoal 2.1.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1,T2 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {memb X L2}
H22 : member (of X T2) L3
H23 : member (of X T) L3
============================
member (of X T) L3
Subgoal 2.2 is:
ctx L3
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < search.
Subgoal 2.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
============================
ctx L3
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < case H2.
Subgoal 2.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V' : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : ctx L3
H22 : name X2
H23 : {is_sty T1}
H24 : forall T', member (of X2 T') L3 -> T1 = T'
============================
ctx L3
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < search.
Subgoal 2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < assert {eval' (E'2 (snd' (pair' V' VE1))) V'1}.
Subgoal 2.3:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
============================
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < assert {eval' (snd' (pair' V' VE1)) VE1}.
Subgoal 2.3.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
============================
{eval' (snd' (pair' V' VE1)) VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply equiv_cc_val' to _ _ H16.
Subgoal 2.3.1.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
============================
{is_sty T1}
Subgoal 2.3.1 is:
{eval' (snd' (pair' V' VE1)) VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < case H2.
Subgoal 2.3.1.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : ctx L3
H24 : name X2
H25 : {is_sty T1}
H26 : forall T', member (of X2 T') L3 -> T1 = T'
============================
{is_sty T1}
Subgoal 2.3.1 is:
{eval' (snd' (pair' V' VE1)) VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < search.
Subgoal 2.3.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {val' V'}
============================
{eval' (snd' (pair' V' VE1)) VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply subst_env_equiv_cc_val' to _ _ H14.
Subgoal 2.3.1.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {val' V'}
============================
ctx L3
Subgoal 2.3.1 is:
{eval' (snd' (pair' V' VE1)) VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < case H2.
Subgoal 2.3.1.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {val' V'}
H24 : ctx L3
H25 : name X2
H26 : {is_sty T1}
H27 : forall T', member (of X2 T') L3 -> T1 = T'
============================
ctx L3
Subgoal 2.3.1 is:
{eval' (snd' (pair' V' VE1)) VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < search.
Subgoal 2.3.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {val' V'}
H24 : {val' VE1}
============================
{eval' (snd' (pair' V' VE1)) VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < search.
Subgoal 2.3:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
============================
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < assert {eval' VE1 VE1}.
Subgoal 2.3.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
============================
{eval' VE1 VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply subst_env_equiv_cc_val' to _ _ H14.
Subgoal 2.3.2.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
============================
ctx L3
Subgoal 2.3.2 is:
{eval' VE1 VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < case H2.
Subgoal 2.3.2.1:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
H24 : ctx L3
H25 : name X2
H26 : {is_sty T1}
H27 : forall T', member (of X2 T') L3 -> T1 = T'
============================
ctx L3
Subgoal 2.3.2 is:
{eval' VE1 VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < search.
Subgoal 2.3.2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
H24 : {val' VE1}
============================
{eval' VE1 VE1}
Subgoal 2.3 is:
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < backchain eval'_refl.
Subgoal 2.3:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
H24 : {eval' VE1 VE1}
============================
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply env_elem_eval'_cong to H19 H24 H23 H21 with E = E'2.
Subgoal 2.3:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
H24 : {eval' VE1 VE1}
H25 : {eval' (E'2 (snd' (pair' V' VE1))) V'1}
============================
{eval' (E'2 (snd' (pair' V' VE1))) V'1}
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < search.
Subgoal 2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (E'2 (snd' (pair' V' VE1))) V'1}
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < apply eq_rewrite_eval' to H18 H23.
Subgoal 2:
Variables:
ML : list (map tm tm)
L3 : list o
L2 : list tm
K : nat
X,V,X2,V1 : tm
VE1,V',V'1 : tm'
T,T1 : ty
L1,Map1 : tm' -> (list (map tm tm'))
M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
|> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
|> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (E'2 (snd' (pair' V' VE1))) V'1}
H24 : {eval' (M' (pair' V' VE1)) V'1}
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1
fvar_sem_pres < search.
Proof completed.
Abella < Define to_mapping : (list tm) -> (list tm') -> (list (map tm tm')) -> prop by
to_mapping Vs (E :: nil) (Map E) := {mapvar Vs Map};
to_mapping (X :: Vs) (X' :: Vs') (map X X' :: Map) := to_mapping Vs Vs' Map.
Abella < Theorem eq_map_list_inv_tm' :
forall A B, nabla x, A x = B x -> A = B.
============================
forall A B, nabla x, A x = B x -> A = B
eq_map_list_inv_tm' < intros.
Variables:
A,B : tm' -> tm' -> (list (map tm tm'))
H1 : [n1 : tm']
|> A n1 = B n1
============================
A = B
eq_map_list_inv_tm' < case H1.
Variables:
B : tm' -> tm' -> (list (map tm tm'))
============================
z1\B z1 = B
eq_map_list_inv_tm' < search.
Proof completed.
Abella < Theorem eq_map_list_inv_tm :
forall A B, nabla x, A x = B x -> A = B.
============================
forall A B, nabla x, A x = B x -> A = B
eq_map_list_inv_tm < intros.
Variables:
A,B : tm -> tm' -> (list (map tm tm'))
H1 : [n1 : tm]
|> A n1 = B n1
============================
A = B
eq_map_list_inv_tm < case H1.
Variables:
B : tm -> tm' -> (list (map tm tm'))
============================
z1\B z1 = B
eq_map_list_inv_tm < search.
Proof completed.
Abella < Theorem eq_map_list_rewrite_tm' :
forall A B X, A = B -> z1\z2\map X (fst' z2) :: A z1 z2 =
y\z2\map X (fst' z2) :: B y z2.
============================
forall A B X, A = B -> z1\z2\map X (fst' z2) :: A z1 z2 =
y\z2\map X (fst' z2) :: B y z2
eq_map_list_rewrite_tm' < intros.
Variables:
X : tm
A,B : tm' -> tm' -> (list (map tm tm'))
H1 : A = B
============================
z1\z2\map X (fst' z2) :: A z1 z2 = y\z2\map X (fst' z2) :: B y z2
eq_map_list_rewrite_tm' < case H1.
Variables:
X : tm
B : tm' -> tm' -> (list (map tm tm'))
============================
z1\z2\map X (fst' z2) :: B z1 z2 = y\z2\map X (fst' z2) :: B y z2
eq_map_list_rewrite_tm' < search.
Proof completed.
Abella < Theorem eq_map_list_rewrite_tm :
forall A B X, A = B -> z1\z2\map X (fst' z2) :: A z1 z2 =
y\z2\map X (fst' z2) :: B y z2.
============================
forall A B X, A = B -> z1\z2\map X (fst' z2) :: A z1 z2 =
y\z2\map X (fst' z2) :: B y z2
eq_map_list_rewrite_tm < intros.
Variables:
X : tm
A,B : tm -> tm' -> (list (map tm tm'))
H1 : A = B
============================
z1\z2\map X (fst' z2) :: A z1 z2 = y\z2\map X (fst' z2) :: B y z2
eq_map_list_rewrite_tm < case H1.
Variables:
X : tm
B : tm -> tm' -> (list (map tm tm'))
============================
z1\z2\map X (fst' z2) :: B z1 z2 = y\z2\map X (fst' z2) :: B y z2
eq_map_list_rewrite_tm < search.
Proof completed.
Abella < Theorem mapvar_prune_tm :
forall FVs ML, nabla x, {mapvar FVs (ML x)} -> (exists ML', ML = y\ML').
============================
forall FVs ML, nabla x, {mapvar FVs (ML x)} -> (exists ML', ML = y\ML')
mapvar_prune_tm < induction on 1.
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
============================
forall FVs ML, nabla x, {mapvar FVs (ML x)}@ -> (exists ML', ML = y\ML')
mapvar_prune_tm < intros.
Variables:
FVs : list tm
ML : tm -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H1 : [n1 : tm]
|> {mapvar FVs (ML n1)}@
============================
exists ML', ML = y\ML'
mapvar_prune_tm < case H1.
Subgoal 1:
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
============================
exists ML', z1\z2\nil = y\ML'
Subgoal 2 is:
exists ML', ML = y\ML'
mapvar_prune_tm < search.
Subgoal 2:
Variables:
FVs2 : list tm
FVs1 : tm
ML,Map : tm -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : [n1 : tm]
|> e\map FVs1 (fst' e) :: Map n1 (snd' e) = e\ML n1 e
H3 : [n1 : tm]
|> {mapvar FVs2 (Map n1)}*
============================
exists ML', ML = y\ML'
mapvar_prune_tm < apply IH to H3.
Subgoal 2:
Variables:
FVs2 : list tm
FVs1 : tm
ML : tm -> tm' -> (list (map tm tm'))
ML' : tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : [n1 : tm]
|> e\map FVs1 (fst' e) :: ML' (snd' e) = e\ML n1 e
H3 : {mapvar FVs2 ML'}*
============================
exists ML', ML = y\ML'
mapvar_prune_tm < case H2.
Subgoal 2:
Variables:
FVs2 : list tm
FVs1 : tm
ML2 : tm -> tm' -> (list (map tm tm'))
ML' : tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar FVs2 ML'}*
H4 : [n1 : tm]
|> e\ML2 n1 e = e\ML' (snd' e)
============================
exists ML', z1\z2\map FVs1 (fst' z2) :: ML2 z1 z2 = y\ML'
mapvar_prune_tm < exists z2\map FVs1 (fst' z2) :: ML' (snd' z2).
Subgoal 2:
Variables:
FVs2 : list tm
FVs1 : tm
ML2 : tm -> tm' -> (list (map tm tm'))
ML' : tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar FVs2 ML'}*
H4 : [n1 : tm]
|> e\ML2 n1 e = e\ML' (snd' e)
============================
z1\z2\map FVs1 (fst' z2) :: ML2 z1 z2 =
y\z2\map FVs1 (fst' z2) :: ML' (snd' z2)
mapvar_prune_tm < apply eq_map_list_inv_tm to H4.
Subgoal 2:
Variables:
FVs2 : list tm
FVs1 : tm
ML2 : tm -> tm' -> (list (map tm tm'))
ML' : tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar FVs2 ML'}*
H4 : [n1 : tm]
|> e\ML2 n1 e = e\ML' (snd' e)
H5 : z2\z3\ML2 z2 z3 = z2\z3\ML' (snd' z3)
============================
z1\z2\map FVs1 (fst' z2) :: ML2 z1 z2 =
y\z2\map FVs1 (fst' z2) :: ML' (snd' z2)
mapvar_prune_tm < backchain eq_map_list_rewrite_tm.
Proof completed.
Abella < Theorem mapvar_prune_tm' :
forall FVs ML, nabla x, {mapvar FVs (ML x)} -> (exists ML', ML = y\ML').
============================
forall FVs ML, nabla x, {mapvar FVs (ML x)} -> (exists ML', ML = y\ML')
mapvar_prune_tm' < induction on 1.
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
============================
forall FVs ML, nabla x, {mapvar FVs (ML x)}@ -> (exists ML', ML = y\ML')
mapvar_prune_tm' < intros.
Variables:
FVs : list tm
ML : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H1 : [n1 : tm']
|> {mapvar FVs (ML n1)}@
============================
exists ML', ML = y\ML'
mapvar_prune_tm' < case H1.
Subgoal 1:
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
============================
exists ML', z1\z2\nil = y\ML'
Subgoal 2 is:
exists ML', ML = y\ML'
mapvar_prune_tm' < search.
Subgoal 2:
Variables:
L : list tm
X : tm
ML,Map : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : [n1 : tm']
|> e\map X (fst' e) :: Map n1 (snd' e) = e\ML n1 e
H3 : [n1 : tm']
|> {mapvar L (Map n1)}*
============================
exists ML', ML = y\ML'
mapvar_prune_tm' < apply IH to H3.
Subgoal 2:
Variables:
L : list tm
X : tm
ML' : tm' -> (list (map tm tm'))
ML : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : [n1 : tm']
|> e\map X (fst' e) :: ML' (snd' e) = e\ML n1 e
H3 : {mapvar L ML'}*
============================
exists ML', ML = y\ML'
mapvar_prune_tm' < case H2.
Subgoal 2:
Variables:
L : list tm
X : tm
ML' : tm' -> (list (map tm tm'))
ML2 : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar L ML'}*
H4 : [n1 : tm']
|> e\ML2 n1 e = e\ML' (snd' e)
============================
exists ML', z1\z2\map X (fst' z2) :: ML2 z1 z2 = y\ML'
mapvar_prune_tm' < exists z2\map X (fst' z2) :: ML' (snd' z2).
Subgoal 2:
Variables:
L : list tm
X : tm
ML' : tm' -> (list (map tm tm'))
ML2 : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar L ML'}*
H4 : [n1 : tm']
|> e\ML2 n1 e = e\ML' (snd' e)
============================
z1\z2\map X (fst' z2) :: ML2 z1 z2 = y\z2\map X (fst' z2) :: ML' (snd' z2)
mapvar_prune_tm' < apply eq_map_list_inv_tm' to H4.
Subgoal 2:
Variables:
L : list tm
X : tm
ML' : tm' -> (list (map tm tm'))
ML2 : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar L ML'}*
H4 : [n1 : tm']
|> e\ML2 n1 e = e\ML' (snd' e)
H5 : z2\z3\ML2 z2 z3 = z2\z3\ML' (snd' z3)
============================
z1\z2\map X (fst' z2) :: ML2 z1 z2 = y\z2\map X (fst' z2) :: ML' (snd' z2)
mapvar_prune_tm' < backchain eq_map_list_rewrite_tm'.
Proof completed.
Abella < Theorem vars_of_ctx_prune_tm :
forall L Vs, nabla x, vars_of_ctx L (Vs x) -> (exists Vs', Vs = y\Vs').
============================
forall L Vs, nabla x, vars_of_ctx L (Vs x) -> (exists Vs', Vs = y\Vs')
vars_of_ctx_prune_tm < induction on 1.
IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
============================
forall L Vs, nabla x, vars_of_ctx L (Vs x) @ -> (exists Vs', Vs = y\Vs')
vars_of_ctx_prune_tm < intros.
Variables:
L : list o
Vs : tm -> (list tm)
IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
H1 : [n1 : tm]
|> vars_of_ctx L (Vs n1) @
============================
exists Vs', Vs = y\Vs'
vars_of_ctx_prune_tm < case H1.
Subgoal 1:
IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
============================
exists Vs', z1\nil = y\Vs'
Subgoal 2 is:
exists Vs', z1\L2 :: Vs1 z1 = y\Vs'
vars_of_ctx_prune_tm < search.
Subgoal 2:
Variables:
L3 : list o
L2 : tm
T : ty
Vs1 : tm -> (list tm)
IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
H2 : [n1 : tm]
|> vars_of_ctx L3 (Vs1 n1) *
============================
exists Vs', z1\L2 :: Vs1 z1 = y\Vs'
vars_of_ctx_prune_tm < apply IH to H2.
Subgoal 2:
Variables:
L3 : list o
Vs' : list tm
L2 : tm
T : ty
IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
H2 : vars_of_ctx L3 Vs' *
============================
exists Vs'1, z1\L2 :: Vs' = y\Vs'1
vars_of_ctx_prune_tm < search.
Proof completed.
Abella < Theorem vars_of_subst'_prune_tm' :
forall ML Vs, nabla x, vars_of_subst' ML (Vs x) -> (exists Vs', Vs = y\Vs').
============================
forall ML Vs, nabla x, vars_of_subst' ML (Vs x) -> (exists Vs', Vs = y\Vs')
vars_of_subst'_prune_tm' < induction on 1.
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
(exists Vs', Vs = y\Vs')
============================
forall ML Vs, nabla x, vars_of_subst' ML (Vs x) @ ->
(exists Vs', Vs = y\Vs')
vars_of_subst'_prune_tm' < intros.
Variables:
ML : list (map tm' tm')
Vs : tm' -> (list tm')
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
(exists Vs', Vs = y\Vs')
H1 : [n1 : tm']
|> vars_of_subst' ML (Vs n1) @
============================
exists Vs', Vs = y\Vs'
vars_of_subst'_prune_tm' < case H1.
Subgoal 1:
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
(exists Vs', Vs = y\Vs')
============================
exists Vs', z1\nil = y\Vs'
Subgoal 2 is:
[n2 : tm']
|> exists Vs', z2\n2 :: L z2 = y\Vs'
vars_of_subst'_prune_tm' < search.
Subgoal 2:
Variables:
ML3 : list (map tm' tm')
ML2 : tm'
L : tm' -> (list tm')
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
(exists Vs', Vs = y\Vs')
H2 : [n1 : tm']
|> vars_of_subst' ML3 (L n1) *
============================
[n2 : tm']
|> exists Vs', z2\n2 :: L z2 = y\Vs'
vars_of_subst'_prune_tm' < apply IH to H2.
Subgoal 2:
Variables:
ML3 : list (map tm' tm')
Vs' : list tm'
ML2 : tm'
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
(exists Vs', Vs = y\Vs')
H2 : vars_of_subst' ML3 Vs' *
============================
[n2 : tm']
|> exists Vs'1, z2\n2 :: Vs' = y\Vs'1
vars_of_subst'_prune_tm' < search.
Proof completed.
Abella < Theorem to_mapping_prune_tm :
forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) ->
(exists Map', Map = y\Map').
============================
forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) ->
(exists Map', Map = y\Map')
to_mapping_prune_tm < induction on 1.
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
============================
forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) @ ->
(exists Map', Map = y\Map')
to_mapping_prune_tm < intros.
Variables:
Vs : list tm
Vs' : list tm'
Map : tm -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H1 : [n1 : tm]
|> to_mapping Vs Vs' (Map n1) @
============================
exists Map', Map = y\Map'
to_mapping_prune_tm < case H1.
Subgoal 1:
Variables:
Vs : list tm
E : tm'
Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : [n1 : tm]
|> {mapvar Vs (Map1 n1)}
============================
exists Map', z1\Map1 z1 E = y\Map'
Subgoal 2 is:
exists Map', z1\map Vs2 X' :: Map1 z1 = y\Map'
to_mapping_prune_tm < apply mapvar_prune_tm to H2.
Subgoal 1:
Variables:
Vs : list tm
E : tm'
ML' : tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : {mapvar Vs ML'}
============================
exists Map', z1\ML' E = y\Map'
Subgoal 2 is:
exists Map', z1\map Vs2 X' :: Map1 z1 = y\Map'
to_mapping_prune_tm < search.
Subgoal 2:
Variables:
Vs3 : list tm
Vs'1 : list tm'
Vs2 : tm
X' : tm'
Map1 : tm -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : [n1 : tm]
|> to_mapping Vs3 Vs'1 (Map1 n1) *
============================
exists Map', z1\map Vs2 X' :: Map1 z1 = y\Map'
to_mapping_prune_tm < apply IH to H2.
Subgoal 2:
Variables:
Map' : list (map tm tm')
Vs3 : list tm
Vs'1 : list tm'
Vs2 : tm
X' : tm'
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : to_mapping Vs3 Vs'1 Map' *
============================
exists Map'1, z1\map Vs2 X' :: Map' = y\Map'1
to_mapping_prune_tm < search.
Proof completed.
Abella < Theorem to_mapping_prune_tm' :
forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) ->
(exists Map', Map = y\Map').
============================
forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) ->
(exists Map', Map = y\Map')
to_mapping_prune_tm' < induction on 1.
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
============================
forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) @ ->
(exists Map', Map = y\Map')
to_mapping_prune_tm' < intros.
Variables:
Vs : list tm
Vs' : list tm'
Map : tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H1 : [n1 : tm']
|> to_mapping Vs Vs' (Map n1) @
============================
exists Map', Map = y\Map'
to_mapping_prune_tm' < case H1.
Subgoal 1:
Variables:
Vs : list tm
Vs'1 : tm'
Map1 : tm' -> tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : [n1 : tm']
|> {mapvar Vs (Map1 n1)}
============================
exists Map', z1\Map1 z1 Vs'1 = y\Map'
Subgoal 2 is:
exists Map', z1\map X Vs'2 :: Map1 z1 = y\Map'
to_mapping_prune_tm' < apply mapvar_prune_tm' to H2.
Subgoal 1:
Variables:
Vs : list tm
Vs'1 : tm'
ML' : tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : {mapvar Vs ML'}
============================
exists Map', z1\ML' Vs'1 = y\Map'
Subgoal 2 is:
exists Map', z1\map X Vs'2 :: Map1 z1 = y\Map'
to_mapping_prune_tm' < search.
Subgoal 2:
Variables:
Vs1 : list tm
Vs'3 : list tm'
X : tm
Vs'2 : tm'
Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : [n1 : tm']
|> to_mapping Vs1 Vs'3 (Map1 n1) *
============================
exists Map', z1\map X Vs'2 :: Map1 z1 = y\Map'
to_mapping_prune_tm' < apply IH to H2.
Subgoal 2:
Variables:
Map' : list (map tm tm')
Vs1 : list tm
Vs'3 : list tm'
X : tm
Vs'2 : tm'
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : to_mapping Vs1 Vs'3 Map' *
============================
exists Map'1, z1\map X Vs'2 :: Map' = y\Map'1
to_mapping_prune_tm' < search.
Proof completed.
Abella < Theorem var_sem_pres :
forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L -> subst ML ->
subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V').
============================
forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
var_sem_pres < induction on 8.
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
============================
forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map @ -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
var_sem_pres < intros.
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
X,V : tm
M',M'' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map @
H9 : member (of X T) L
H10 : {memb (map X M') Map}
H11 : app_subst ML X V
H12 : app_subst ML' M' M''
============================
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H8.
Subgoal 1:
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
Vs : list tm
K : nat
X,V : tm
M',M'',E : tm'
T : ty
Map1 : tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' (E :: nil)
H9 : member (of X T) L
H10 : {memb (map X M') (Map1 E)}
H11 : app_subst ML X V
H12 : app_subst ML' M' M''
H13 : {mapvar Vs Map1}
============================
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H7.
Subgoal 1:
Variables:
ML1 : list (map tm' tm')
Vs : list tm
K : nat
X,V : tm
V1 : tm'
T : ty
ML : tm' -> (list (map tm tm))
L : tm' -> (list o)
M',M'' : tm' -> tm'
Map1 : tm' -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n1 : tm']
|> ctx (L n1)
H3 : [n1 : tm']
|> subst (ML n1)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML1)
H5 : [n1 : tm']
|> subst_equiv_cc (L n1) K (ML n1) (map n1 V1 :: ML1)
H6 : [n1 : tm']
|> vars_of_ctx (L n1) Vs
H9 : [n1 : tm']
|> member (of X T) (L n1)
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 n1 n1)}
H11 : [n1 : tm']
|> app_subst (ML n1) X V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML1) (M' n1) (M'' n1)
H13 : [n1 : tm']
|> {mapvar Vs (Map1 n1)}
H14 : vars_of_subst' ML1 nil
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H14.
Subgoal 1:
Variables:
Vs : list tm
K : nat
X,V : tm
V1 : tm'
T : ty
ML : tm' -> (list (map tm tm))
L : tm' -> (list o)
M',M'' : tm' -> tm'
Map1 : tm' -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n1 : tm']
|> ctx (L n1)
H3 : [n1 : tm']
|> subst (ML n1)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H5 : [n1 : tm']
|> subst_equiv_cc (L n1) K (ML n1) (map n1 V1 :: nil)
H6 : [n1 : tm']
|> vars_of_ctx (L n1) Vs
H9 : [n1 : tm']
|> member (of X T) (L n1)
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 n1 n1)}
H11 : [n1 : tm']
|> app_subst (ML n1) X V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : [n1 : tm']
|> {mapvar Vs (Map1 n1)}
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H5.
Subgoal 1.1:
Variables:
ML2 : list (map tm tm)
L1 : list o
Vs : list tm
K : nat
X,V : tm
V1 : tm'
T : ty
M',M'' : tm' -> tm'
Map1 : tm' -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 n1 n1)}
H11 : app_subst ML2 X V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : [n1 : tm']
|> {mapvar Vs (Map1 n1)}
H15 : subst_env_equiv_cc L1 K ML2 V1
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
Subgoal 1.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < apply mapvar_prune_tm' to H13.
Subgoal 1.1:
Variables:
ML2 : list (map tm tm)
L1 : list o
Vs : list tm
K : nat
X,V : tm
V1 : tm'
T : ty
ML'1 : tm' -> (list (map tm tm'))
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv_cc L1 K ML2 V1
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
Subgoal 1.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < apply fvar_sem_pres to _ _ _ _ _ H13 H9 H10 _.
Subgoal 1.1:
Variables:
ML2 : list (map tm tm)
L1 : list o
Vs : list tm
K : nat
X,V : tm
V1,V' : tm'
T : ty
ML'1 : tm' -> (list (map tm tm'))
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv_cc L1 K ML2 V1
H16 : {eval' (M' V1) V'}
H17 : equiv_cc T K V V'
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
Subgoal 1.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H12.
Subgoal 1.1:
Variables:
ML2 : list (map tm tm)
L1 : list o
Vs : list tm
K : nat
X,V : tm
V1,V',M : tm'
T : ty
ML'1 : tm' -> (list (map tm tm'))
M' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv_cc L1 K ML2 V1
H16 : {eval' (M' V1) V'}
H17 : equiv_cc T K V V'
H18 : app_subst nil (M' V1) M
============================
exists V', {eval' M V'} /\ equiv_cc T K V V'
Subgoal 1.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H18.
Subgoal 1.1:
Variables:
ML2 : list (map tm tm)
L1 : list o
Vs : list tm
K : nat
X,V : tm
V1,V' : tm'
T : ty
ML'1 : tm' -> (list (map tm tm'))
M' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : [n1 : tm']
|> {memb (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv_cc L1 K ML2 V1
H16 : {eval' (M' V1) V'}
H17 : equiv_cc T K V V'
============================
exists V', {eval' (M' V1) V'} /\ equiv_cc T K V V'
Subgoal 1.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < search.
Subgoal 1.2:
Variables:
ML2 : list (map tm tm)
L1 : list o
K : nat
V2 : tm
V1 : tm'
T,T1 : ty
Vs : tm -> (list tm)
X,V : tm -> tm
Map1 : tm -> tm' -> tm' -> (list (map tm tm'))
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L1)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H6 : [n2 : tm]
|> vars_of_ctx (of n2 T1 :: L1) (Vs n2)
H9 : [n2 : tm]
|> member (of (X n2) T) (of n2 T1 :: L1)
H10 : [n1 : tm', n2 : tm]
|> {memb (map (X n2) (M' n1)) (Map1 n2 n1 n1)}
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : [n1 : tm', n2 : tm]
|> {mapvar (Vs n2) (Map1 n2 n1)}
H15 : equiv_cc T1 K V2 V1
H16 : subst_equiv_cc L1 K ML2 nil
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H16.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map1 : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs1 : list tm
Vs'1 : list tm'
K : nat
X,V,X1 : tm
M',M'',X' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L (X1 :: Vs1)
H7 : vars_of_subst' ML' (X' :: Vs'1)
H9 : member (of X T) L
H10 : {memb (map X M') (map X1 X' :: Map1)}
H11 : app_subst ML X V
H12 : app_subst ML' M' M''
H13 : to_mapping Vs1 Vs'1 Map1 *
============================
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H10.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
Map1 : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs1 : list tm
Vs'1 : list tm'
K : nat
V,X1 : tm
M'',X' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L (X1 :: Vs1)
H7 : vars_of_subst' ML' (X' :: Vs'1)
H9 : member (of X1 T) L
H11 : app_subst ML X1 V
H12 : app_subst ML' X' M''
H13 : to_mapping Vs1 Vs'1 Map1 *
============================
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H6.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
Map1 : list (map tm tm')
ML' : list (map tm' tm')
L1 : list o
Vs1 : list tm
Vs'1 : list tm'
K : nat
V,X1 : tm
M'',X' : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L1)
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc (of X1 T1 :: L1) K ML ML'
H7 : vars_of_subst' ML' (X' :: Vs'1)
H9 : member (of X1 T) (of X1 T1 :: L1)
H11 : app_subst ML X1 V
H12 : app_subst ML' X' M''
H13 : to_mapping Vs1 Vs'1 Map1 *
H14 : vars_of_ctx L1 Vs1
============================
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H7.
Subgoal 2.1:
Variables:
ML1 : list (map tm' tm')
Vs1 : list tm
L2 : list tm'
K : nat
V,X1 : tm
V1 : tm'
T,T1 : ty
ML : tm' -> (list (map tm tm))
Map1 : tm' -> (list (map tm tm'))
L1 : tm' -> (list o)
M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n1 : tm']
|> ctx (of X1 T1 :: L1 n1)
H3 : [n1 : tm']
|> subst (ML n1)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML1)
H5 : [n1 : tm']
|> subst_equiv_cc (of X1 T1 :: L1 n1) K (ML n1) (map n1 V1 :: ML1)
H9 : [n1 : tm']
|> member (of X1 T) (of X1 T1 :: L1 n1)
H11 : [n1 : tm']
|> app_subst (ML n1) X1 V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML1) n1 (M'' n1)
H13 : [n1 : tm']
|> to_mapping Vs1 L2 (Map1 n1) *
H14 : [n1 : tm']
|> vars_of_ctx (L1 n1) Vs1
H15 : vars_of_subst' ML1 L2
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H5.
Subgoal 2.1.1:
Variables:
ML2 : list (map tm tm)
L4 : list o
Vs1 : list tm
L2 : list tm'
K : nat
V,X1 : tm
V1 : tm'
T,T1 : ty
Map1 : tm' -> (list (map tm tm'))
M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H9 : member (of X1 T) (of X1 T1 :: L4)
H11 : app_subst ML2 X1 V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: nil) n1 (M'' n1)
H13 : [n1 : tm']
|> to_mapping Vs1 L2 (Map1 n1) *
H14 : vars_of_ctx L4 Vs1
H15 : vars_of_subst' nil L2
H16 : subst_env_equiv_cc (of X1 T1 :: L4) K ML2 V1
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
Subgoal 2.1.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H15.
Subgoal 2.1.1:
Variables:
ML2 : list (map tm tm)
L4 : list o
Vs1 : list tm
K : nat
V,X1 : tm
V1 : tm'
T,T1 : ty
Map1 : tm' -> (list (map tm tm'))
M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H9 : member (of X1 T) (of X1 T1 :: L4)
H11 : app_subst ML2 X1 V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: nil) n1 (M'' n1)
H13 : [n1 : tm']
|> to_mapping Vs1 nil (Map1 n1) *
H14 : vars_of_ctx L4 Vs1
H16 : subst_env_equiv_cc (of X1 T1 :: L4) K ML2 V1
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
Subgoal 2.1.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H13.
Subgoal 2.1.2:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T,T1 : ty
Vs1 : tm -> (list tm)
V : tm -> tm
Map1 : tm -> tm' -> (list (map tm tm'))
M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
|> member (of n2 T) (of n2 T1 :: L3)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) n2 (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) n1 (M'' n1)
H13 : [n1 : tm', n2 : tm]
|> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
|> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H9.
Subgoal 2.1.2.1:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T1 : ty
Vs1 : tm -> (list tm)
V : tm -> tm
Map1 : tm -> tm' -> (list (map tm tm'))
M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) n2 (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) n1 (M'' n1)
H13 : [n1 : tm', n2 : tm]
|> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
|> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T1 K (V n2) V'
Subgoal 2.1.2.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < apply subst_var_eq to H3 _ H11.
Subgoal 2.1.2.1:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T1 : ty
Vs1 : tm -> (list tm)
Map1 : tm -> tm' -> (list (map tm tm'))
M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) n1 (M'' n1)
H13 : [n1 : tm', n2 : tm]
|> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
|> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T1 K V2 V'
Subgoal 2.1.2.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < apply subst'_var_eq to H4 _ H12.
Subgoal 2.1.2.1:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T1 : ty
Vs1 : tm -> (list tm)
Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) n1 V1
H13 : [n1 : tm', n2 : tm]
|> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
|> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
============================
exists V', {eval' V1 V'} /\ equiv_cc T1 K V2 V'
Subgoal 2.1.2.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < apply equiv_cc_val' to _ _ H16.
Subgoal 2.1.2.1.1:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T1 : ty
Vs1 : tm -> (list tm)
Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) n1 V1
H13 : [n1 : tm', n2 : tm]
|> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
|> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
============================
{is_sty T1}
Subgoal 2.1.2.1 is:
exists V', {eval' V1 V'} /\ equiv_cc T1 K V2 V'
Subgoal 2.1.2.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H2.
Subgoal 2.1.2.1.1:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T1 : ty
Vs1 : tm -> (list tm)
Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) n1 V1
H13 : [n1 : tm', n2 : tm]
|> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
|> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
H18 : ctx L3
H19 : [n2 : tm]
|> name n2
H20 : {is_sty T1}
H21 : [n2 : tm]
|> forall T', member (of n2 T') L3 -> T1 = T'
============================
{is_sty T1}
Subgoal 2.1.2.1 is:
exists V', {eval' V1 V'} /\ equiv_cc T1 K V2 V'
Subgoal 2.1.2.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < search.
Subgoal 2.1.2.1:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T1 : ty
Vs1 : tm -> (list tm)
Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) n1 V1
H13 : [n1 : tm', n2 : tm]
|> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
|> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
H18 : {val' V1}
============================
exists V', {eval' V1 V'} /\ equiv_cc T1 K V2 V'
Subgoal 2.1.2.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < apply eval'_refl to H18.
Subgoal 2.1.2.1:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T1 : ty
Vs1 : tm -> (list tm)
Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) n1 V1
H13 : [n1 : tm', n2 : tm]
|> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
|> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
H18 : {val' V1}
H19 : {eval' V1 V1}
============================
exists V', {eval' V1 V'} /\ equiv_cc T1 K V2 V'
Subgoal 2.1.2.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < search.
Subgoal 2.1.2.2:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T,T1 : ty
Vs1 : tm -> (list tm)
V : tm -> tm
Map1 : tm -> tm' -> (list (map tm tm'))
M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) n2 (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) n1 (M'' n1)
H13 : [n1 : tm', n2 : tm]
|> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
|> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
H18 : [n2 : tm]
|> member (of n2 T) L3
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < apply member_prune to H18.
Subgoal 2.2:
Variables:
ML : list (map tm tm)
Map1 : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs1 : list tm
Vs'1 : list tm'
K : nat
X,V,X1 : tm
M',M'',X' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L (X1 :: Vs1)
H7 : vars_of_subst' ML' (X' :: Vs'1)
H9 : member (of X T) L
H11 : app_subst ML X V
H12 : app_subst ML' M' M''
H13 : to_mapping Vs1 Vs'1 Map1 *
H14 : {memb (map X M') Map1}
============================
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H6.
Subgoal 2.2:
Variables:
ML : list (map tm tm)
Map1 : list (map tm tm')
ML' : list (map tm' tm')
L1 : list o
Vs1 : list tm
Vs'1 : list tm'
K : nat
X,V,X1 : tm
M',M'',X' : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L1)
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc (of X1 T1 :: L1) K ML ML'
H7 : vars_of_subst' ML' (X' :: Vs'1)
H9 : member (of X T) (of X1 T1 :: L1)
H11 : app_subst ML X V
H12 : app_subst ML' M' M''
H13 : to_mapping Vs1 Vs'1 Map1 *
H14 : {memb (map X M') Map1}
H15 : vars_of_ctx L1 Vs1
============================
exists V', {eval' M'' V'} /\ equiv_cc T K V V'
var_sem_pres < case H7.
Subgoal 2.2:
Variables:
ML1 : list (map tm' tm')
Vs1 : list tm
L2 : list tm'
K : nat
X,V,X1 : tm
V1 : tm'
T,T1 : ty
ML : tm' -> (list (map tm tm))
Map1 : tm' -> (list (map tm tm'))
L1 : tm' -> (list o)
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n1 : tm']
|> ctx (of X1 T1 :: L1 n1)
H3 : [n1 : tm']
|> subst (ML n1)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML1)
H5 : [n1 : tm']
|> subst_equiv_cc (of X1 T1 :: L1 n1) K (ML n1) (map n1 V1 :: ML1)
H9 : [n1 : tm']
|> member (of X T) (of X1 T1 :: L1 n1)
H11 : [n1 : tm']
|> app_subst (ML n1) X V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML1) (M' n1) (M'' n1)
H13 : [n1 : tm']
|> to_mapping Vs1 L2 (Map1 n1) *
H14 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 n1)}
H15 : [n1 : tm']
|> vars_of_ctx (L1 n1) Vs1
H16 : vars_of_subst' ML1 L2
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
var_sem_pres < case H5.
Subgoal 2.2.1:
Variables:
ML2 : list (map tm tm)
L4 : list o
Vs1 : list tm
L2 : list tm'
K : nat
X,V,X1 : tm
V1 : tm'
T,T1 : ty
Map1 : tm' -> (list (map tm tm'))
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H9 : member (of X T) (of X1 T1 :: L4)
H11 : app_subst ML2 X V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : [n1 : tm']
|> to_mapping Vs1 L2 (Map1 n1) *
H14 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 n1)}
H15 : vars_of_ctx L4 Vs1
H16 : vars_of_subst' nil L2
H17 : subst_env_equiv_cc (of X1 T1 :: L4) K ML2 V1
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
Subgoal 2.2.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
var_sem_pres < case H16.
Subgoal 2.2.1:
Variables:
ML2 : list (map tm tm)
L4 : list o
Vs1 : list tm
K : nat
X,V,X1 : tm
V1 : tm'
T,T1 : ty
Map1 : tm' -> (list (map tm tm'))
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : [n1 : tm']
|> subst' (map n1 V1 :: nil)
H9 : member (of X T) (of X1 T1 :: L4)
H11 : app_subst ML2 X V
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : [n1 : tm']
|> to_mapping Vs1 nil (Map1 n1) *
H14 : [n1 : tm']
|> {memb (map X (M' n1)) (Map1 n1)}
H15 : vars_of_ctx L4 Vs1
H17 : subst_env_equiv_cc (of X1 T1 :: L4) K ML2 V1
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'
Subgoal 2.2.2 is:
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
var_sem_pres < case H13.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T,T1 : ty
Vs1 : tm -> (list tm)
X,V : tm -> tm
Map1 : tm -> tm' -> (list (map tm tm'))
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
|> member (of (X n2) T) (of n2 T1 :: L3)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : [n1 : tm', n2 : tm]
|> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n1 : tm', n2 : tm]
|> {memb (map (X n2) (M' n1)) (Map1 n2 n1)}
H15 : [n2 : tm]
|> vars_of_ctx L3 (Vs1 n2)
H16 : vars_of_subst' ML'1 L2
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
var_sem_pres < apply vars_of_ctx_prune_tm to H15.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
L2 : list tm'
K : nat
V2 : tm
V1 : tm'
T,T1 : ty
X,V : tm -> tm
Map1 : tm -> tm' -> (list (map tm tm'))
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
|> member (of (X n2) T) (of n2 T1 :: L3)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : [n1 : tm', n2 : tm]
|> to_mapping Vs'2 L2 (Map1 n2 n1) *
H14 : [n1 : tm', n2 : tm]
|> {memb (map (X n2) (M' n1)) (Map1 n2 n1)}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 L2
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
var_sem_pres < apply vars_of_subst'_prune_tm' to H16.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2 : tm
V1 : tm'
T,T1 : ty
X,V : tm -> tm
Map1 : tm -> tm' -> (list (map tm tm'))
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
|> member (of (X n2) T) (of n2 T1 :: L3)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : [n1 : tm', n2 : tm]
|> to_mapping Vs'2 Vs'3 (Map1 n2 n1) *
H14 : [n1 : tm', n2 : tm]
|> {memb (map (X n2) (M' n1)) (Map1 n2 n1)}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
var_sem_pres < apply to_mapping_prune_tm to H13.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2 : tm
V1 : tm'
T,T1 : ty
X,V : tm -> tm
Map' : tm' -> (list (map tm tm'))
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
|> member (of (X n2) T) (of n2 T1 :: L3)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : [n1 : tm']
|> to_mapping Vs'2 Vs'3 (Map' n1) *
H14 : [n1 : tm', n2 : tm]
|> {memb (map (X n2) (M' n1)) (Map' n1)}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
var_sem_pres < apply to_mapping_prune_tm' to H13.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2 : tm
V1 : tm'
T,T1 : ty
X,V : tm -> tm
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
|> member (of (X n2) T) (of n2 T1 :: L3)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : [n1 : tm', n2 : tm]
|> {memb (map (X n2) (M' n1)) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
var_sem_pres < apply memb_prune to H14.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2 : tm
V1 : tm'
T,T1 : ty
V : tm -> tm
M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
|> member (of M'2 T) (of n2 T1 :: L3)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) M'2 (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : [n1 : tm']
|> {memb (map M'2 (M' n1)) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
var_sem_pres < apply memb_prune to H14.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2 : tm
V1,M'4 : tm'
T,T1 : ty
V : tm -> tm
M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
|> member (of M'2 T) (of n2 T1 :: L3)
H11 : [n2 : tm]
|> app_subst (map n2 V2 :: ML2) M'2 (V n2)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) M'4 (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
[n1 : tm', n2 : tm]
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'
var_sem_pres < case H11.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2,M : tm
V1,M'4 : tm'
T,T1 : ty
M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
|> member (of M'2 T) (of n2 T1 :: L3)
H12 : [n1 : tm']
|> app_subst (map n1 V1 :: ML'1) M'4 (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
============================
[n1 : tm']
|> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K M V'
var_sem_pres < case H12.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2,M : tm
V1,M'4,M1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
|> member (of M'2 T) (of n2 T1 :: L3)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
============================
exists V', {eval' M1 V'} /\ equiv_cc T K M V'
var_sem_pres < case H9.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2,M : tm
V1,M'4,M1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
============================
exists V', {eval' M1 V'} /\ equiv_cc T K M V'
var_sem_pres < apply IH to _ _ _ _ H18 H15 H16 H13 _ H14 H19 H20.
Subgoal 2.2.2.1:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2,M : tm
V1,M'4,M1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
============================
subst' ML'1
Subgoal 2.2.2.2 is:
subst ML2
Subgoal 2.2.2.3 is:
ctx L3
Subgoal 2.2.2 is:
exists V', {eval' M1 V'} /\ equiv_cc T K M V'
var_sem_pres < case H4.
Subgoal 2.2.2.1:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2,M : tm
V1,M'4,M1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
H22 : subst' ML'1
H23 : {val' V1}
H24 : {tm' V1}
============================
subst' ML'1
Subgoal 2.2.2.2 is:
subst ML2
Subgoal 2.2.2.3 is:
ctx L3
Subgoal 2.2.2 is:
exists V', {eval' M1 V'} /\ equiv_cc T K M V'
var_sem_pres < search.
Subgoal 2.2.2.2:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2,M : tm
V1,M'4,M1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
============================
subst ML2
Subgoal 2.2.2.3 is:
ctx L3
Subgoal 2.2.2 is:
exists V', {eval' M1 V'} /\ equiv_cc T K M V'
var_sem_pres < case H3.
Subgoal 2.2.2.2:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2,M : tm
V1,M'4,M1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
H22 : subst ML2
H23 : {val V2}
H24 : {tm V2}
============================
subst ML2
Subgoal 2.2.2.3 is:
ctx L3
Subgoal 2.2.2 is:
exists V', {eval' M1 V'} /\ equiv_cc T K M V'
var_sem_pres < search.
Subgoal 2.2.2.3:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2,M : tm
V1,M'4,M1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
============================
ctx L3
Subgoal 2.2.2 is:
exists V', {eval' M1 V'} /\ equiv_cc T K M V'
var_sem_pres < case H2.
Subgoal 2.2.2.3:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2,M : tm
V1,M'4,M1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
H22 : ctx L3
H23 : [n2 : tm]
|> name n2
H24 : {is_sty T1}
H25 : [n2 : tm]
|> forall T', member (of n2 T') L3 -> T1 = T'
============================
ctx L3
Subgoal 2.2.2 is:
exists V', {eval' M1 V'} /\ equiv_cc T K M V'
var_sem_pres < search.
Subgoal 2.2.2:
Variables:
ML2 : list (map tm tm)
Map'1 : list (map tm tm')
ML'1 : list (map tm' tm')
L3 : list o
Vs'2 : list tm
Vs'3 : list tm'
K : nat
V2,M'2,M : tm
V1,M'4,M1,V' : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
|> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
|> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
|> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
H22 : {eval' M1 V'}
H23 : equiv_cc T K M V'
============================
exists V', {eval' M1 V'} /\ equiv_cc T K M V'
var_sem_pres < search.
Proof completed.
Abella < Theorem mapenv_sem_pres :
forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L -> subst ML ->
subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> prune_ctx NFVs L L' ->
{mapenv NFVs Map E} -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE').
============================
forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> prune_ctx NFVs L L' ->
{mapenv NFVs Map E} -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
mapenv_sem_pres < induction on 10.
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
============================
forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> prune_ctx NFVs L L' ->
{mapenv NFVs Map E}@ -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
mapenv_sem_pres < intros.
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,NFVs : list tm
Vs' : list tm'
K : nat
E,E' : tm'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : prune_ctx NFVs L L'
H10 : {mapenv NFVs Map E}@
H11 : app_subst ML' E E'
============================
exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'
mapenv_sem_pres < case H10.
Subgoal 1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs : list tm
Vs' : list tm'
K : nat
E' : tm'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : prune_ctx nil L L'
H11 : app_subst ML' unit' E'
============================
exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'
Subgoal 2 is:
exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'
mapenv_sem_pres < case H9.
Subgoal 1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
E' : tm'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' unit' E'
============================
exists VE', {eval' E' VE'} /\ subst_env_equiv_cc nil K ML VE'
Subgoal 2 is:
exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'
mapenv_sem_pres < apply app_subst'_unit_comm to H11.
Subgoal 1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' unit' unit'
============================
exists VE', {eval' unit' VE'} /\ subst_env_equiv_cc nil K ML VE'
Subgoal 2 is:
exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'
mapenv_sem_pres < search.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X : tm
E',ML1,M : tm'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : prune_ctx (X :: L1) L L'
H11 : app_subst ML' (pair' M ML1) E'
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
============================
exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'
mapenv_sem_pres < case H9.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X : tm
E',ML1,M : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) E'
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
============================
exists VE', {eval' E' VE'} /\ subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < apply app_subst'_pair_comm to H11.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X : tm
ML1,M,M1',M2' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < apply ctx_mem_to_lst_mem to H6 H14.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X : tm
ML1,M,M1',M2' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < apply subst_equiv_cc_mem to H5 H6 H18.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X,V : tm
ML1,M,M1',M2' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < apply subst_var to H3 H19.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X,V : tm
ML1,M,M1',M2' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < assert exists V', {eval' M1' V'} /\ equiv_cc T K V V'.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X,V : tm
ML1,M,M1',M2' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
============================
exists V', {eval' M1' V'} /\ equiv_cc T K V V'
Subgoal 2 is:
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < backchain var_sem_pres.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X,V : tm
ML1,M,M1',M2' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H21 : exists V', {eval' M1' V'} /\ equiv_cc T K V V'
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < case H21.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X,V : tm
ML1,M,M1',M2',V' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv_cc T K V V'
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < apply IH to _ _ _ _ _ _ _ _ H15 H13 H17.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X,V : tm
ML1,M,M1',M2',V',VE' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv_cc T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv_cc L'1 K ML VE'
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < assert subst_env_equiv_cc (of X T :: L'1) K ML (pair' V' VE').
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X,V : tm
ML1,M,M1',M2',V',VE' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv_cc T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv_cc L'1 K ML VE'
H26 : subst_env_equiv_cc (of X T :: L'1) K ML (pair' V' VE')
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < assert {eval' (pair' M1' M2') (pair' V' VE')}.
Subgoal 2.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X,V : tm
ML1,M,M1',M2',V',VE' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv_cc T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv_cc L'1 K ML VE'
H26 : subst_env_equiv_cc (of X T :: L'1) K ML (pair' V' VE')
============================
{eval' (pair' M1' M2') (pair' V' VE')}
Subgoal 2 is:
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < backchain eval'_pair_fwd.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L'1 : list o
Vs,L1 : list tm
Vs' : list tm'
K : nat
X,V : tm
ML1,M,M1',M2',V',VE' : tm'
T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
(exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv_cc T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv_cc L'1 K ML VE'
H26 : subst_env_equiv_cc (of X T :: L'1) K ML (pair' V' VE')
H27 : {eval' (pair' M1' M2') (pair' V' VE')}
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv_cc (of X T :: L'1) K ML VE'
mapenv_sem_pres < search.
Proof completed.
Abella < Theorem mapvar_to_lst_mem :
forall Vs Map M M' E, {mapvar Vs Map} -> {memb (map M M') (Map E)} ->
{memb M Vs}.
============================
forall Vs Map M M' E, {mapvar Vs Map} -> {memb (map M M') (Map E)} ->
{memb M Vs}
mapvar_to_lst_mem < induction on 1.
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
{memb M Vs}
============================
forall Vs Map M M' E, {mapvar Vs Map}@ -> {memb (map M M') (Map E)} ->
{memb M Vs}
mapvar_to_lst_mem < intros.
Variables:
Vs : list tm
M : tm
M',E : tm'
Map : tm' -> (list (map tm tm'))
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
{memb M Vs}
H1 : {mapvar Vs Map}@
H2 : {memb (map M M') (Map E)}
============================
{memb M Vs}
mapvar_to_lst_mem < case H1.
Subgoal 1:
Variables:
M : tm
M',E : tm'
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
{memb M Vs}
H2 : {memb (map M M') nil}
============================
{memb M nil}
Subgoal 2 is:
{memb M (X :: L)}
mapvar_to_lst_mem < case H2.
Subgoal 2:
Variables:
L : list tm
M,X : tm
M',E : tm'
Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
{memb M Vs}
H2 : {memb (map M M') (map X (fst' E) :: Map1 (snd' E))}
H3 : {mapvar L Map1}*
============================
{memb M (X :: L)}
mapvar_to_lst_mem < case H2.
Subgoal 2.1:
Variables:
L : list tm
X : tm
E : tm'
Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
{memb M Vs}
H3 : {mapvar L Map1}*
============================
{memb X (X :: L)}
Subgoal 2.2 is:
{memb M (X :: L)}
mapvar_to_lst_mem < search.
Subgoal 2.2:
Variables:
L : list tm
M,X : tm
M',E : tm'
Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
{memb M Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map M M') (Map1 (snd' E))}
============================
{memb M (X :: L)}
mapvar_to_lst_mem < apply IH to H3 H4.
Subgoal 2.2:
Variables:
L : list tm
M,X : tm
M',E : tm'
Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
{memb M Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map M M') (Map1 (snd' E))}
H5 : {memb M L}
============================
{memb M (X :: L)}
mapvar_to_lst_mem < search.
Proof completed.
Abella < Theorem map_mem_to_lst_mem :
forall Vs Vs' Map M M', to_mapping Vs Vs' Map -> {memb (map M M') Map} ->
{memb M Vs}.
============================
forall Vs Vs' Map M M', to_mapping Vs Vs' Map -> {memb (map M M') Map} ->
{memb M Vs}
map_mem_to_lst_mem < induction on 1.
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{memb (map M M') Map} -> {memb M Vs}
============================
forall Vs Vs' Map M M', to_mapping Vs Vs' Map @ -> {memb (map M M') Map} ->
{memb M Vs}
map_mem_to_lst_mem < intros.
Variables:
Map : list (map tm tm')
Vs : list tm
Vs' : list tm'
M : tm
M' : tm'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{memb (map M M') Map} -> {memb M Vs}
H1 : to_mapping Vs Vs' Map @
H2 : {memb (map M M') Map}
============================
{memb M Vs}
map_mem_to_lst_mem < case H1.
Subgoal 1:
Variables:
Vs : list tm
M : tm
M',E : tm'
Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{memb (map M M') Map} -> {memb M Vs}
H2 : {memb (map M M') (Map1 E)}
H3 : {mapvar Vs Map1}
============================
{memb M Vs}
Subgoal 2 is:
{memb M (X :: Vs1)}
map_mem_to_lst_mem < backchain mapvar_to_lst_mem.
Subgoal 2:
Variables:
Map1 : list (map tm tm')
Vs1 : list tm
Vs'1 : list tm'
M,X : tm
M',X' : tm'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{memb (map M M') Map} -> {memb M Vs}
H2 : {memb (map M M') (map X X' :: Map1)}
H3 : to_mapping Vs1 Vs'1 Map1 *
============================
{memb M (X :: Vs1)}
map_mem_to_lst_mem < case H2.
Subgoal 2.1:
Variables:
Map1 : list (map tm tm')
Vs1 : list tm
Vs'1 : list tm'
X : tm
X' : tm'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{memb (map M M') Map} -> {memb M Vs}
H3 : to_mapping Vs1 Vs'1 Map1 *
============================
{memb X (X :: Vs1)}
Subgoal 2.2 is:
{memb M (X :: Vs1)}
map_mem_to_lst_mem < search.
Subgoal 2.2:
Variables:
Map1 : list (map tm tm')
Vs1 : list tm
Vs'1 : list tm'
M,X : tm
M',X' : tm'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{memb (map M M') Map} -> {memb M Vs}
H3 : to_mapping Vs1 Vs'1 Map1 *
H4 : {memb (map M M') Map1}
============================
{memb M (X :: Vs1)}
map_mem_to_lst_mem < apply IH to H3 H4.
Subgoal 2.2:
Variables:
Map1 : list (map tm tm')
Vs1 : list tm
Vs'1 : list tm'
M,X : tm
M',X' : tm'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{memb (map M M') Map} -> {memb M Vs}
H3 : to_mapping Vs1 Vs'1 Map1 *
H4 : {memb (map M M') Map1}
H5 : {memb M Vs1}
============================
{memb M (X :: Vs1)}
map_mem_to_lst_mem < search.
Proof completed.
Abella < Theorem app_subst_var_val :
forall L K ML ML' Vs M V, subst ML -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> {memb M Vs} -> app_subst ML M V -> {val V}.
============================
forall L K ML ML' Vs M V, subst ML -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> {memb M Vs} -> app_subst ML M V -> {val V}
app_subst_var_val < intros.
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
Vs : list tm
K : nat
M,V : tm
H1 : subst ML
H2 : subst_equiv_cc L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {memb M Vs}
H5 : app_subst ML M V
============================
{val V}
app_subst_var_val < apply subst_equiv_cc_mem to H2 H3 H4.
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
Vs : list tm
K : nat
M,V,V1 : tm
H1 : subst ML
H2 : subst_equiv_cc L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {memb M Vs}
H5 : app_subst ML M V
H6 : member (map M V1) ML
============================
{val V}
app_subst_var_val < apply subst_var_eq to H1 H6 H5.
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
Vs : list tm
K : nat
M,V1 : tm
H1 : subst ML
H2 : subst_equiv_cc L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {memb M Vs}
H5 : app_subst ML M V1
H6 : member (map M V1) ML
============================
{val V1}
app_subst_var_val < apply subst_mem to H1 H6.
Variables:
ML : list (map tm tm)
ML' : list (map tm' tm')
L : list o
Vs : list tm
K : nat
X,V2 : tm
H1 : subst ML
H2 : subst_equiv_cc L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {memb X Vs}
H5 : app_subst ML X V2
H6 : member (map X V2) ML
H7 : name X
H8 : {val V2}
H9 : {tm V2}
============================
{val V2}
app_subst_var_val < search.
Proof completed.
Abella < Theorem cc_sem_pres :
forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L -> subst ML ->
subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> {L |- of M T} ->
{cc Map Vs M M'} -> app_subst ML M P -> app_subst ML' M' P' ->
sim_cc T K P P'.
============================
forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L -> subst ML ->
subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> {L |- of M T} ->
{cc Map Vs M M'} -> app_subst ML M P -> app_subst ML' M' P' ->
sim_cc T K P P'
cc_sem_pres < induction on 10.
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
============================
forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L -> subst ML ->
subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> {L |- of M T} ->
{cc Map Vs M M'}@ -> app_subst ML M P -> app_subst ML' M' P' ->
sim_cc T K P P'
cc_sem_pres < intros.
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H10 : {cc Map Vs M M'}@
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
============================
sim_cc T K P P'
cc_sem_pres < case H10.
Subgoal 1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K,N : nat
P : tm
P' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (nat N) T}
H11 : app_subst ML (nat N) P
H12 : app_subst ML' (nat' N) P'
============================
sim_cc T K P P'
Subgoal 2 is:
sim_cc T K P P'
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply subst_closed_tm_eq to _ H11.
Subgoal 1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K,N : nat
P' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (nat N) T}
H11 : app_subst ML (nat N) (nat N)
H12 : app_subst ML' (nat' N) P'
============================
sim_cc T K (nat N) P'
Subgoal 2 is:
sim_cc T K P P'
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply subst'_closed_tm_eq to _ H12.
Subgoal 1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K,N : nat
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (nat N) T}
H11 : app_subst ML (nat N) (nat N)
H12 : app_subst ML' (nat' N) (nat' N)
============================
sim_cc T K (nat N) (nat' N)
Subgoal 2 is:
sim_cc T K P P'
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply of_nat_inv to H2 H9.
Subgoal 1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K,N : nat
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (nat N) tnat}
H11 : app_subst ML (nat N) (nat N)
H12 : app_subst ML' (nat' N) (nat' N)
============================
sim_cc tnat K (nat N) (nat' N)
Subgoal 2 is:
sim_cc T K P P'
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_nat.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
============================
sim_cc T K P P'
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply map_mem_to_lst_mem to _ H13.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
============================
sim_cc T K P P'
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert member (of M T) L.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
============================
member (of M T) L
Subgoal 2 is:
sim_cc T K P P'
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_name to _ _ H14.
Subgoal 2.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
H15 : name M
============================
member (of M T) L
Subgoal 2 is:
sim_cc T K P P'
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain of_var_inv.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
H15 : member (of M T) L
============================
sim_cc T K P P'
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply var_sem_pres to _ _ _ _ _ _ _ _ H15 H13 _ _.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M',V' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
H15 : member (of M T) L
H16 : {eval' P' V'}
H17 : equiv_cc T K P V'
============================
sim_cc T K P P'
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_val_tm'.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M',V' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
H15 : member (of M T) L
H16 : {eval' P' V'}
H17 : equiv_cc T K P V'
============================
{val P}
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst_var_val to _ _ _ _ H11.
Subgoal 2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M',V' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
H15 : member (of M T) L
H16 : {eval' P' V'}
H17 : equiv_cc T K P V'
H18 : {val P}
============================
{val P}
Subgoal 3 is:
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search.
Subgoal 3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M1 : tm
P',M'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pred M1) T}
H11 : app_subst ML (pred M1) P
H12 : app_subst ML' (pred' M'1) P'
H13 : {cc Map Vs M1 M'1}*
============================
sim_cc T K P P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst_pred_comm to H11.
Subgoal 3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M'' : tm
P',M'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pred M1) T}
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) P'
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
============================
sim_cc T K (pred M'') P'
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst'_pred_comm to H12.
Subgoal 3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M'' : tm
M'1,M''1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pred M1) T}
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
============================
sim_cc T K (pred M'') (pred' M''1)
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H9.
Subgoal 3.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M'' : tm
M'1,M''1 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
H16 : {L |- of M1 tnat}
============================
sim_cc tnat K (pred M'') (pred' M''1)
Subgoal 3.2 is:
sim_cc T K (pred M'') (pred' M''1)
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc tnat K M'' M''1.
Subgoal 3.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M'' : tm
M'1,M''1 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
H16 : {L |- of M1 tnat}
============================
sim_cc tnat K M'' M''1
Subgoal 3.1 is:
sim_cc tnat K (pred M'') (pred' M''1)
Subgoal 3.2 is:
sim_cc T K (pred M'') (pred' M''1)
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH.
Subgoal 3.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M'' : tm
M'1,M''1 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
H16 : {L |- of M1 tnat}
H17 : sim_cc tnat K M'' M''1
============================
sim_cc tnat K (pred M'') (pred' M''1)
Subgoal 3.2 is:
sim_cc T K (pred M'') (pred' M''1)
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_pred.
Subgoal 3.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M1,M'' : tm
M'1,M''1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
H16 : {L, [F] |- of (pred M1) T}
H17 : member F L
============================
sim_cc T K (pred M'') (pred' M''1)
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H16.
Subgoal 3.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M1,M'' : tm
M'1,M''1 : tm'
T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
H16 : {L, [F] |- of (pred M1) T1}
H17 : member F L
H18 : name (pred M1)
============================
sim_cc T1 K (pred M'') (pred' M''1)
Subgoal 4 is:
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H18.
Subgoal 4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M2,M1 : tm
P',M2',M1' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (plus M1 M2) T}
H11 : app_subst ML (plus M1 M2) P
H12 : app_subst ML' (plus' M1' M2') P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
============================
sim_cc T K P P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst_plus_comm to H11.
Subgoal 4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
P',M2',M1' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (plus M1 M2) T}
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
============================
sim_cc T K (plus M1'1 M2'1) P'
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst'_plus_comm to H12.
Subgoal 4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (plus M1 M2) T}
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
============================
sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H9.
Subgoal 4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 tnat}
H20 : {L |- of M2 tnat}
============================
sim_cc tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 4.2 is:
sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc tnat K M1'1 M1'2.
Subgoal 4.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 tnat}
H20 : {L |- of M2 tnat}
============================
sim_cc tnat K M1'1 M1'2
Subgoal 4.1 is:
sim_cc tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 4.2 is:
sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH.
Subgoal 4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 tnat}
H20 : {L |- of M2 tnat}
H21 : sim_cc tnat K M1'1 M1'2
============================
sim_cc tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 4.2 is:
sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc tnat K M2'1 M2'2.
Subgoal 4.1.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 tnat}
H20 : {L |- of M2 tnat}
H21 : sim_cc tnat K M1'1 M1'2
============================
sim_cc tnat K M2'1 M2'2
Subgoal 4.1 is:
sim_cc tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 4.2 is:
sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH with M = M2, M' = M2'.
Subgoal 4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 tnat}
H20 : {L |- of M2 tnat}
H21 : sim_cc tnat K M1'1 M1'2
H22 : sim_cc tnat K M2'1 M2'2
============================
sim_cc tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 4.2 is:
sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_plus.
Subgoal 4.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L, [F] |- of (plus M1 M2) T}
H20 : member F L
============================
sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H19.
Subgoal 4.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L, [F] |- of (plus M1 M2) T1}
H20 : member F L
H21 : name (plus M1 M2)
============================
sim_cc T1 K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H21.
Subgoal 5:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M2,M1,M3 : tm
P',M2',M1',M'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (ifz M3 M1 M2) T}
H11 : app_subst ML (ifz M3 M1 M2) P
H12 : app_subst ML' (ifz' M'1 M1' M2') P'
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
============================
sim_cc T K P P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst_ifz_comm to H11.
Subgoal 5:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M'2,M1'1,M2'1 : tm
P',M2',M1',M'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (ifz M3 M1 M2) T}
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') P'
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
============================
sim_cc T K (ifz M'2 M1'1 M2'1) P'
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst'_ifz_comm to H12.
Subgoal 5:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (ifz M3 M1 M2) T}
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
============================
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H9.
Subgoal 5.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
============================
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc tnat K M'2 M'3.
Subgoal 5.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
============================
sim_cc tnat K M'2 M'3
Subgoal 5.1 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH.
Subgoal 5.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
============================
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc T K M1'1 M1'2.
Subgoal 5.1.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
============================
sim_cc T K M1'1 M1'2
Subgoal 5.1 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH.
Subgoal 5.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
H26 : sim_cc T K M1'1 M1'2
============================
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc T K M2'1 M2'2.
Subgoal 5.1.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
H26 : sim_cc T K M1'1 M1'2
============================
sim_cc T K M2'1 M2'2
Subgoal 5.1 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH with M = M2, M' = M2'.
Subgoal 5.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
H26 : sim_cc T K M1'1 M1'2
H27 : sim_cc T K M2'1 M2'2
============================
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_ifz.
Subgoal 5.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
H26 : sim_cc T K M1'1 M1'2
H27 : sim_cc T K M2'1 M2'2
============================
{is_sty T}
Subgoal 5.2 is:
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain of_is_sty with M = M1.
Subgoal 5.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L, [F] |- of (ifz M3 M1 M2) T}
H23 : member F L
============================
sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H22.
Subgoal 5.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M2,M1,M3,M'2,M1'1,M2'1 : tm
M2',M1',M'1,M'3,M1'2,M2'2 : tm'
T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L, [F] |- of (ifz M3 M1 M2) T1}
H23 : member F L
H24 : name (ifz M3 M1 M2)
============================
sim_cc T1 K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H24.
Subgoal 6:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P : tm
P' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of unit T}
H11 : app_subst ML unit P
H12 : app_subst ML' unit' P'
============================
sim_cc T K P P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply subst_closed_tm_eq to _ H11.
Subgoal 6:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of unit T}
H11 : app_subst ML unit unit
H12 : app_subst ML' unit' P'
============================
sim_cc T K unit P'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply subst'_closed_tm_eq to _ H12.
Subgoal 6:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of unit T}
H11 : app_subst ML unit unit
H12 : app_subst ML' unit' unit'
============================
sim_cc T K unit unit'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H9.
Subgoal 6.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML unit unit
H12 : app_subst ML' unit' unit'
============================
sim_cc tunit K unit unit'
Subgoal 6.2 is:
sim_cc T K unit unit'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_unit.
Subgoal 6.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML unit unit
H12 : app_subst ML' unit' unit'
H13 : {L, [F] |- of unit T}
H14 : member F L
============================
sim_cc T K unit unit'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H13.
Subgoal 6.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML unit unit
H12 : app_subst ML' unit' unit'
H13 : {L, [F] |- of unit T1}
H14 : member F L
H15 : name unit
============================
sim_cc T1 K unit unit'
Subgoal 7 is:
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H15.
Subgoal 7:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M2,M1 : tm
P',M2',M1' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pair M1 M2) T}
H11 : app_subst ML (pair M1 M2) P
H12 : app_subst ML' (pair' M1' M2') P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
============================
sim_cc T K P P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst_pair_comm to H11.
Subgoal 7:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
P',M2',M1' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pair M1 M2) T}
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
============================
sim_cc T K (pair M1'1 M2'1) P'
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst'_pair_comm to H12.
Subgoal 7:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pair M1 M2) T}
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
============================
sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H9.
Subgoal 7.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
============================
sim_cc (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 7.2 is:
sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc T1 K M1'1 M1'2.
Subgoal 7.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
============================
sim_cc T1 K M1'1 M1'2
Subgoal 7.1 is:
sim_cc (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 7.2 is:
sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH.
Subgoal 7.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
H21 : sim_cc T1 K M1'1 M1'2
============================
sim_cc (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 7.2 is:
sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc T2 K M2'1 M2'2.
Subgoal 7.1.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
H21 : sim_cc T1 K M1'1 M1'2
============================
sim_cc T2 K M2'1 M2'2
Subgoal 7.1 is:
sim_cc (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 7.2 is:
sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH with M = M2, M' = M2'.
Subgoal 7.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
H21 : sim_cc T1 K M1'1 M1'2
H22 : sim_cc T2 K M2'1 M2'2
============================
sim_cc (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 7.2 is:
sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_pair.
Subgoal 7.1.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
H21 : sim_cc T1 K M1'1 M1'2
H22 : sim_cc T2 K M2'1 M2'2
============================
{is_sty T1}
Subgoal 7.1.4 is:
{is_sty T2}
Subgoal 7.2 is:
sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain of_is_sty.
Subgoal 7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
H21 : sim_cc T1 K M1'1 M1'2
H22 : sim_cc T2 K M2'1 M2'2
============================
{is_sty T2}
Subgoal 7.2 is:
sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain of_is_sty.
Subgoal 7.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L, [F] |- of (pair M1 M2) T}
H20 : member F L
============================
sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H19.
Subgoal 7.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M2,M1,M1'1,M2'1 : tm
M2',M1',M1'2,M2'2 : tm'
T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L, [F] |- of (pair M1 M2) T1}
H20 : member F L
H21 : name (pair M1 M2)
============================
sim_cc T1 K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H21.
Subgoal 8:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M1 : tm
P',M'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fst M1) T}
H11 : app_subst ML (fst M1) P
H12 : app_subst ML' (fst' M'1) P'
H13 : {cc Map Vs M1 M'1}*
============================
sim_cc T K P P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst_fst_comm to H11.
Subgoal 8:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
P',M'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fst M1) T}
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) P'
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
============================
sim_cc T K (fst M1') P'
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst'_fst_comm to H12.
Subgoal 8:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
M'1,M1'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fst M1) T}
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
============================
sim_cc T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H9.
Subgoal 8.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
M'1,M1'1 : tm'
T,T2 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T T2)}
============================
sim_cc T K (fst M1') (fst' M1'1)
Subgoal 8.2 is:
sim_cc T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc (prod T T2) K M1' M1'1.
Subgoal 8.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
M'1,M1'1 : tm'
T,T2 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T T2)}
============================
sim_cc (prod T T2) K M1' M1'1
Subgoal 8.1 is:
sim_cc T K (fst M1') (fst' M1'1)
Subgoal 8.2 is:
sim_cc T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH.
Subgoal 8.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
M'1,M1'1 : tm'
T,T2 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T T2)}
H17 : sim_cc (prod T T2) K M1' M1'1
============================
sim_cc T K (fst M1') (fst' M1'1)
Subgoal 8.2 is:
sim_cc T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_fst.
Subgoal 8.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
M'1,M1'1 : tm'
T,T2 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T T2)}
H17 : sim_cc (prod T T2) K M1' M1'1
============================
{is_sty (prod T T2)}
Subgoal 8.2 is:
sim_cc T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain of_is_sty.
Subgoal 8.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M1,M1' : tm
M'1,M1'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L, [F] |- of (fst M1) T}
H17 : member F L
============================
sim_cc T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H16.
Subgoal 8.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M1,M1' : tm
M'1,M1'1 : tm'
T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L, [F] |- of (fst M1) T1}
H17 : member F L
H18 : name (fst M1)
============================
sim_cc T1 K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H18.
Subgoal 9:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M1 : tm
P',M'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (snd M1) T}
H11 : app_subst ML (snd M1) P
H12 : app_subst ML' (snd' M'1) P'
H13 : {cc Map Vs M1 M'1}*
============================
sim_cc T K P P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst_snd_comm to H11.
Subgoal 9:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
P',M'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (snd M1) T}
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) P'
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
============================
sim_cc T K (snd M1') P'
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply app_subst'_snd_comm to H12.
Subgoal 9:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
M'1,M1'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (snd M1) T}
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
============================
sim_cc T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H9.
Subgoal 9.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
M'1,M1'1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T1 T)}
============================
sim_cc T K (snd M1') (snd' M1'1)
Subgoal 9.2 is:
sim_cc T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc (prod T1 T) K M1' M1'1.
Subgoal 9.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
M'1,M1'1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T1 T)}
============================
sim_cc (prod T1 T) K M1' M1'1
Subgoal 9.1 is:
sim_cc T K (snd M1') (snd' M1'1)
Subgoal 9.2 is:
sim_cc T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH.
Subgoal 9.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
M'1,M1'1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T1 T)}
H17 : sim_cc (prod T1 T) K M1' M1'1
============================
sim_cc T K (snd M1') (snd' M1'1)
Subgoal 9.2 is:
sim_cc T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_snd with T1 = T1.
Subgoal 9.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M1' : tm
M'1,M1'1 : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T1 T)}
H17 : sim_cc (prod T1 T) K M1' M1'1
============================
{is_sty (prod T1 T)}
Subgoal 9.2 is:
sim_cc T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain of_is_sty.
Subgoal 9.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M1,M1' : tm
M'1,M1'1 : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L, [F] |- of (snd M1) T}
H17 : member F L
============================
sim_cc T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H16.
Subgoal 9.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M1,M1' : tm
M'1,M1'1 : tm'
T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L, [F] |- of (snd M1) T1}
H17 : member F L
H18 : name (snd M1)
============================
sim_cc T1 K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H18.
Subgoal 10:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M1 : tm
P',M'1 : tm'
T : ty
R : tm -> tm
R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) P
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
============================
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert exists M2 R1, P = let M2 R1 /\ app_subst ML M1 M2 /\
(nabla x, app_subst ML (R x) (R1 x)).
Subgoal 10.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M1 : tm
P',M'1 : tm'
T : ty
R : tm -> tm
R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) P
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
============================
exists M2 R1, P = let M2 R1 /\ app_subst ML M1 M2 /\
(nabla x, app_subst ML (R x) (R1 x))
Subgoal 10 is:
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain app_subst_let_comm.
Subgoal 10:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M1 : tm
P',M'1 : tm'
T : ty
R : tm -> tm
R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) P
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H15 : exists M2 R1, P = let M2 R1 /\ app_subst ML M1 M2 /\
(nabla x, app_subst ML (R x) (R1 x))
============================
sim_cc T K P P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H15.
Subgoal 10:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M2 : tm
P',M'1 : tm'
T : ty
R,R1 : tm -> tm
R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
============================
sim_cc T K (let M2 R1) P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert exists M'2 R'1, P' = let' M'2 R'1 /\ app_subst ML' M'1 M'2 /\
(nabla x, app_subst ML' (R' x) (R'1 x)).
Subgoal 10.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M2 : tm
P',M'1 : tm'
T : ty
R,R1 : tm -> tm
R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
============================
exists M'2 R'1, P' = let' M'2 R'1 /\ app_subst ML' M'1 M'2 /\
(nabla x, app_subst ML' (R' x) (R'1 x))
Subgoal 10 is:
sim_cc T K (let M2 R1) P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain app_subst'_let_comm.
Subgoal 10:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M2 : tm
P',M'1 : tm'
T : ty
R,R1 : tm -> tm
R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H18 : exists M'2 R'1, P' = let' M'2 R'1 /\ app_subst ML' M'1 M'2 /\
(nabla x, app_subst ML' (R' x) (R'1 x))
============================
sim_cc T K (let M2 R1) P'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H18.
Subgoal 10:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M2 : tm
M'1,M'2 : tm'
T : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
============================
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H9.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M2 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
============================
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc T1 K M2 M'2.
Subgoal 10.3.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M2 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
============================
sim_cc T1 K M2 M'2
Subgoal 10.3 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M2 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 K M2 M'2
============================
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < unfold.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M1,M2 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 K M2 M'2
============================
forall J V, le J K -> {nstep J (let M2 R1) V} -> {val V} ->
(exists V' N, {eval' (let' M'2 R'1) V'} /\ {add J N K} /\
equiv_cc T N V V')
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < intros.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K,J : nat
M1,M2,V : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 K M2 M'2
H24 : le J K
H25 : {nstep J (let M2 R1) V}
H26 : {val V}
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add J N K} /\ equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply nstep_let_inv to _ H25.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K,K1,K2,K3 : nat
M1,M2,V,V1 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 K M2 M'2
H24 : le (s K3) K
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N K} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H24.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K,K1,K2,K3,N : nat
M1,M2,V,V1 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 K M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H31 : {add (s K3) N K}
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N K} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H31.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3 : nat
M1,M2,V,V1 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply add_assoc to H27 H32.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert exists V1', {eval' M'2 V1'} /\ equiv_cc T1 (s N23) V1 V1'.
Subgoal 10.3.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
============================
exists V1', {eval' M'2 V1'} /\ equiv_cc T1 (s N23) V1 V1'
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_nstep.
Subgoal 10.3.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
============================
{add K1 (s N23) (s N3)}
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain add_s.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2 : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H35 : exists V1', {eval' M'2 V1'} /\ equiv_cc T1 (s N23) V1 V1'
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H35.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply of_is_sty to _ H21.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert {is_nat N23}.
Subgoal 10.3.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
============================
{is_nat N23}
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain add_arg2_isnat.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply equiv_cc_tm to _ _ H37.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply equiv_cc_tm' to _ _ H37.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc T (s N23) (R1 V1) (R'1 V1').
Subgoal 10.3.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
sim_cc T (s N23) (R1 V1) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH with L = of n1 T1 :: L, ML = map n1 V1 :: ML, ML' = map n2 V1' :: ML', Vs = n1 :: Vs, Vs' = n2 :: Vs', Map = map n1 n2 :: Map, T = T, M = R n1, M' = R' n2.
Subgoal 10.3.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
[n1 : tm]
|> ctx (of n1 T1 :: L)
Subgoal 10.3.4.2 is:
[n2 : tm']
|> subst' (map n2 V1' :: ML')
Subgoal 10.3.4.3 is:
[n1 : tm, n2 : tm']
|> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
(map n2 V1' :: ML')
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H1.
Subgoal 10.3.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : {is_nat N3}
============================
[n1 : tm]
|> ctx (of n1 T1 :: L)
Subgoal 10.3.4.2 is:
[n2 : tm']
|> subst' (map n2 V1' :: ML')
Subgoal 10.3.4.3 is:
[n1 : tm, n2 : tm']
|> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
(map n2 V1' :: ML')
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain ctx_extend.
Subgoal 10.3.4.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
[n2 : tm']
|> subst' (map n2 V1' :: ML')
Subgoal 10.3.4.3 is:
[n1 : tm, n2 : tm']
|> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
(map n2 V1' :: ML')
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst'_extend.
Subgoal 10.3.4.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
{val' V1'}
Subgoal 10.3.4.3 is:
[n1 : tm, n2 : tm']
|> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
(map n2 V1' :: ML')
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H36.
Subgoal 10.3.4.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23,N1 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : {nstep' N1 M'2 V1'}
H43 : {val' V1'}
============================
{val' V1'}
Subgoal 10.3.4.3 is:
[n1 : tm, n2 : tm']
|> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
(map n2 V1' :: ML')
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search.
Subgoal 10.3.4.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
[n1 : tm, n2 : tm']
|> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
(map n2 V1' :: ML')
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst_equiv_cc_extend.
Subgoal 10.3.4.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
subst_equiv_cc L (s N23) ML ML'
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst_equiv_cc_closed.
Subgoal 10.3.4.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
le (s N23) (s N3)
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < unfold.
Subgoal 10.3.4.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
exists N, {add (s N23) N (s N3)}
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < exists K1.
Subgoal 10.3.4.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
{add (s N23) K1 (s N3)}
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain add_comm.
Subgoal 10.3.4.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
{add K1 (s N23) (s N3)}
Subgoal 10.3.4.4 is:
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain add_s.
Subgoal 10.3.4.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
[n1 : tm]
|> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
Subgoal 10.3.4.5 is:
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain explct_meta_subst_comm with E = R1.
Subgoal 10.3.4.5:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
[n2 : tm']
|> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain explct_meta_subst'_comm with E = R'1.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert exists V', {eval' (R'1 V1') V'} /\ equiv_cc T (s N) V V'.
Subgoal 10.3.5:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
============================
exists V', {eval' (R'1 V1') V'} /\ equiv_cc T (s N) V V'
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_nstep.
Subgoal 10.3.5:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
============================
{add K2 (s N) (s N23)}
Subgoal 10.3 is:
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain add_s.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H43 : exists V', {eval' (R'1 V1') V'} /\ equiv_cc T (s N) V V'
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H43.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < exists V'.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
exists N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < exists N.
Subgoal 10.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
{eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\ equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < split.
Subgoal 10.3.6:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
{eval' (let' M'2 R'1) V'}
Subgoal 10.3.7 is:
{add (s K3) N (s N3)}
Subgoal 10.3.8 is:
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain eval'_let_fwd.
Subgoal 10.3.7:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
{add (s K3) N (s N3)}
Subgoal 10.3.8 is:
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search.
Subgoal 10.3.8:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert {is_nat N}.
Subgoal 10.3.8.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
{is_nat N}
Subgoal 10.3.8 is:
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain add_arg2_isnat.
Subgoal 10.3.8:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
H46 : {is_nat N}
============================
equiv_cc T N V V'
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain equiv_cc_closed with K = s N.
Subgoal 10.3.8.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
H46 : {is_nat N}
============================
{is_sty T}
Subgoal 10.3.8.3 is:
le N (s N)
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain of_is_sty.
Subgoal 10.3.8.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
H46 : {is_nat N}
============================
le N (s N)
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < unfold.
Subgoal 10.3.8.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
H46 : {is_nat N}
============================
exists N1, {add N N1 (s N)}
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < exists s z.
Subgoal 10.3.8.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K1,K2,K3,N,N3,N23 : nat
M1,M2,V,V1 : tm
M'1,M'2,V1',V' : tm'
T,T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
|> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
H46 : {is_nat N}
============================
{add N (s z) (s N)}
Subgoal 10.4 is:
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain add_comm.
Subgoal 10.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M1,M2 : tm
M'1,M'2 : tm'
T : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L, [F] |- of (let M1 R) T}
H22 : member F L
============================
sim_cc T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H21.
Subgoal 10.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M1,M2 : tm
M'1,M'2 : tm'
T1 : ty
R,R1 : tm -> tm
R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
|> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
|> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
|> app_subst ML' (R' n1) (R'1 n1)
H21 : {L, [F] |- of (let M1 R) T1}
H22 : member F L
H23 : name (let M1 R)
============================
sim_cc T1 K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H23.
Subgoal 11:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
============================
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert exists L', prune_ctx FVs L L' /\ {L' |- of (fix R) T}.
Subgoal 11.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
============================
exists L', prune_ctx FVs L L' /\ {L' |- of (fix R) T}
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain fvars_typing_pres with L = L, Vs = Vs, FVs = FVs.
Subgoal 11:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H17 : exists L', prune_ctx FVs L L' /\ {L' |- of (fix R) T}
============================
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H17.
Subgoal 11:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H19 : {L' |- of (fix R) T}
============================
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert ctx L'.
Subgoal 11.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H19 : {L' |- of (fix R) T}
============================
ctx L'
Subgoal 11 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain prune_ctx_pres.
Subgoal 11:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H19 : {L' |- of (fix R) T}
H20 : ctx L'
============================
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H19.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T2,T1 : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
============================
sim_cc (arr T1 T2) K P P'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert vars_of_ctx L' FVs.
Subgoal 11.3.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T2,T1 : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
============================
vars_of_ctx L' FVs
Subgoal 11.3 is:
sim_cc (arr T1 T2) K P P'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain prune_ctx_vars_of.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T2,T1 : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
============================
sim_cc (arr T1 T2) K P P'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply is_sty_str to _ H22.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T2,T1 : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
============================
sim_cc (arr T1 T2) K P P'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H24 (keep).
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T2,T1 : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
============================
sim_cc (arr T1 T2) K P P'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert exists R1, P = fix R1 /\ (nabla f x, app_subst ML (R f x) (R1 f x)).
Subgoal 11.3.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T2,T1 : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
============================
exists R1, P = fix R1 /\ (nabla f x, app_subst ML (R f x) (R1 f x))
Subgoal 11.3 is:
sim_cc (arr T1 T2) K P P'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain app_subst_fix_comm.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P : tm
P',E : tm'
T2,T1 : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H27 : exists R1, P = fix R1 /\ (nabla f x, app_subst ML (R f x) (R1 f x))
============================
sim_cc (arr T1 T2) K P P'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H27.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P',E : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
============================
sim_cc (arr T1 T2) K (fix R1) P'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert exists F' E', P' = clos' F' E' /\
app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F' /\
app_subst ML' E E'.
Subgoal 11.3.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P',E : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
============================
exists F' E', P' = clos' F' E' /\
app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F' /\
app_subst ML' E E'
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) P'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain app_subst'_clos_comm.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
P',E : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H29 : exists F' E', P' = clos' F' E' /\
app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
F' /\
app_subst ML' E E'
============================
sim_cc (arr T1 T2) K (fix R1) P'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H29.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
============================
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}.
Subgoal 11.3.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
============================
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}.
Subgoal 11.3.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
============================
[n3 : tm', n4 : tm', n5 : tm']
|> {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}
Subgoal 11.3.4 is:
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply reified_env_exists to H20.
Subgoal 11.3.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1,Ty : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
============================
[n3 : tm', n4 : tm', n5 : tm']
|> {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}
Subgoal 11.3.4 is:
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}.
Subgoal 11.3.4.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1,Ty : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
============================
[n3 : tm', n4 : tm', n5 : tm']
|> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
Subgoal 11.3.4.1 is:
[n3 : tm', n4 : tm', n5 : tm']
|> {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}
Subgoal 11.3.4 is:
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain cc_clos_code_typ_pres with SL = L', R = R, FVs = FVs, Map = NMap, x = n2, f = n1, y = n4, g = n3, e = n5.
Subgoal 11.3.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1,Ty : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
|> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
============================
[n3 : tm', n4 : tm', n5 : tm']
|> {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}
Subgoal 11.3.4 is:
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain of'_to_tm' with T = T2, L = of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil, Vs = n4 :: n3 :: n5 :: nil.
Subgoal 11.3.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1,Ty : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
|> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
============================
[n3 : tm', n4 : tm', n5 : tm']
|> ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
Subgoal 11.3.4 is:
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply sty_to_cty to H25.
Subgoal 11.3.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1,Ty : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
|> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H34 : {is_cty T1}
============================
[n3 : tm', n4 : tm', n5 : tm']
|> ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
Subgoal 11.3.4 is:
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply sty_to_cty to H26.
Subgoal 11.3.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1,Ty : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
|> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H34 : {is_cty T1}
H35 : {is_cty T2}
============================
[n3 : tm', n4 : tm', n5 : tm']
|> ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
Subgoal 11.3.4 is:
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply reified_env_sty to _ H32.
Subgoal 11.3.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1,Ty : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
|> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H34 : {is_cty T1}
H35 : {is_cty T2}
H36 : {is_sty Ty}
============================
[n3 : tm', n4 : tm', n5 : tm']
|> ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
Subgoal 11.3.4 is:
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply sty_to_cty to H36.
Subgoal 11.3.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1,Ty : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
|> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H34 : {is_cty T1}
H35 : {is_cty T2}
H36 : {is_sty Ty}
H37 : {is_cty Ty}
============================
[n3 : tm', n4 : tm', n5 : tm']
|> ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
Subgoal 11.3.4 is:
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search.
Subgoal 11.3.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : [n3 : tm', n4 : tm', n5 : tm']
|> {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}
============================
{tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search 7.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
============================
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))) =
F'.
Subgoal 11.3.5:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
============================
abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))) =
F'
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst'_closed_tm_eq.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,F',E' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
F'
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H33 : abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))) =
F'
============================
sim_cc (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H33.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
============================
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'.
Subgoal 11.3.6:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
============================
exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain mapenv_sem_pres.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H34 : exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'
============================
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H34.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE').
Subgoal 11.3.7:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert equiv_cc_arr (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE').
Subgoal 11.3.7.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
equiv_cc_arr (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < unfold.
Subgoal 11.3.7.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
{val' VE'}
Subgoal 11.3.7.1.2 is:
{tm (fix R1)}
Subgoal 11.3.7.1.3 is:
{tm'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.7.1.4 is:
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H35.
Subgoal 11.3.7.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,N : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : {nstep' N E' VE'}
H38 : {val' VE'}
============================
{val' VE'}
Subgoal 11.3.7.1.2 is:
{tm (fix R1)}
Subgoal 11.3.7.1.3 is:
{tm'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.7.1.4 is:
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search.
Subgoal 11.3.7.1.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
{tm (fix R1)}
Subgoal 11.3.7.1.3 is:
{tm'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.7.1.4 is:
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_to_tm_ctx to H2 H6.
Subgoal 11.3.7.1.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L',SL : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : tm_ctx SL
H38 : vars_of_tm_ctx SL Vs
============================
{tm (fix R1)}
Subgoal 11.3.7.1.3 is:
{tm'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.7.1.4 is:
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply of_to_tm to _ _ _ _ H9.
Subgoal 11.3.7.1.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L',SL : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : tm_ctx SL
H38 : vars_of_tm_ctx SL Vs
H39 : {SL |- tm (fix R)}
============================
{tm (fix R1)}
Subgoal 11.3.7.1.3 is:
{tm'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.7.1.4 is:
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply subst_equiv_cc_vars_in_subst to H5 _.
Subgoal 11.3.7.1.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L',SL : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : tm_ctx SL
H38 : vars_of_tm_ctx SL Vs
H39 : {SL |- tm (fix R)}
H40 : vars_in_subst Vs ML
============================
{tm (fix R1)}
Subgoal 11.3.7.1.3 is:
{tm'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.7.1.4 is:
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply subst_result_closed_tm_alt to _ _ H39 _ H40 H11.
Subgoal 11.3.7.1.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L',SL : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : tm_ctx SL
H38 : vars_of_tm_ctx SL Vs
H39 : {SL |- tm (fix R)}
H40 : vars_in_subst Vs ML
H41 : {tm (fix R1)}
============================
{tm (fix R1)}
Subgoal 11.3.7.1.3 is:
{tm'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.7.1.4 is:
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search.
Subgoal 11.3.7.1.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
{tm'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.7.1.4 is:
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert {tm' VE'}.
Subgoal 11.3.7.1.3.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
{tm' VE'}
Subgoal 11.3.7.1.3 is:
{tm'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.7.1.4 is:
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst_env_equiv_cc_tm' with L = L'.
Subgoal 11.3.7.1.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : {tm' VE'}
============================
{tm'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.7.1.4 is:
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search.
Subgoal 11.3.7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
equiv_cc (arr T1 T2) J V2 V2' ->
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < intros.
Subgoal 11.3.7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
============================
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert {is_nat J}.
Subgoal 11.3.7.1.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
============================
{is_nat J}
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H37.
Subgoal 11.3.7.1.4.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J,N : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {add J (s N) K}
============================
{is_nat J}
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain add_arg1_isnat.
Subgoal 11.3.7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
============================
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply equiv_cc_tm to _ _ H38.
Subgoal 11.3.7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
============================
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply equiv_cc_tm' to _ _ H38.
Subgoal 11.3.7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
============================
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply equiv_cc_tm to _ _ H39.
Subgoal 11.3.7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
============================
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply equiv_cc_tm' to _ _ H39.
Subgoal 11.3.7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE').
Subgoal 11.3.7.1.4.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain IH with L = of n2 T1 :: of n1 (arr T1 T2) :: L', M = R n1 n2, M' = R' n3 n4 n5, Vs = n2 :: n1 :: FVs, Vs' = n4 :: n3 :: n5 :: nil, Map = map n2 n4 :: map n1 n3 :: NMap n5, ML = map n2 V1 :: map n1 V2 :: ML, ML' = map n4 V1' :: map n3 V2' :: map n5 VE' :: nil.
Subgoal 11.3.7.1.4.2.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n1 : tm, n2 : tm]
|> ctx (of n2 T1 :: of n1 (arr T1 T2) :: L')
Subgoal 11.3.7.1.4.2.2 is:
[n1 : tm, n2 : tm]
|> subst (map n2 V1 :: map n1 V2 :: ML)
Subgoal 11.3.7.1.4.2.3 is:
[n3 : tm', n4 : tm', n5 : tm']
|> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain ctx_extend.
Subgoal 11.3.7.1.4.2.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n1 : tm]
|> ctx (of n1 (arr T1 T2) :: L')
Subgoal 11.3.7.1.4.2.2 is:
[n1 : tm, n2 : tm]
|> subst (map n2 V1 :: map n1 V2 :: ML)
Subgoal 11.3.7.1.4.2.3 is:
[n3 : tm', n4 : tm', n5 : tm']
|> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain ctx_extend.
Subgoal 11.3.7.1.4.2.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n1 : tm, n2 : tm]
|> subst (map n2 V1 :: map n1 V2 :: ML)
Subgoal 11.3.7.1.4.2.3 is:
[n3 : tm', n4 : tm', n5 : tm']
|> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst_extend.
Subgoal 11.3.7.1.4.2.2.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n1 : tm]
|> subst (map n1 V2 :: ML)
Subgoal 11.3.7.1.4.2.2.2 is:
{val V1}
Subgoal 11.3.7.1.4.2.3 is:
[n3 : tm', n4 : tm', n5 : tm']
|> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst_extend.
Subgoal 11.3.7.1.4.2.2.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
{val V2}
Subgoal 11.3.7.1.4.2.2.2 is:
{val V1}
Subgoal 11.3.7.1.4.2.3 is:
[n3 : tm', n4 : tm', n5 : tm']
|> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain equiv_cc_val with T = arr T1 T2, K = J.
Subgoal 11.3.7.1.4.2.2.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
{val V1}
Subgoal 11.3.7.1.4.2.3 is:
[n3 : tm', n4 : tm', n5 : tm']
|> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain equiv_cc_val with T = T1, K = J.
Subgoal 11.3.7.1.4.2.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n3 : tm', n4 : tm', n5 : tm']
|> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst'_extend.
Subgoal 11.3.7.1.4.2.3.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n3 : tm', n5 : tm']
|> subst' (map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.3.2 is:
{val' V1'}
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst'_extend.
Subgoal 11.3.7.1.4.2.3.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n5 : tm']
|> subst' (map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.3.1.2 is:
{val' V2'}
Subgoal 11.3.7.1.4.2.3.2 is:
{val' V1'}
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst'_extend.
Subgoal 11.3.7.1.4.2.3.1.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
{tm' VE'}
Subgoal 11.3.7.1.4.2.3.1.1.2 is:
{val' VE'}
Subgoal 11.3.7.1.4.2.3.1.2 is:
{val' V2'}
Subgoal 11.3.7.1.4.2.3.2 is:
{val' V1'}
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H35.
Subgoal 11.3.7.1.4.2.3.1.1.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J,N : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : {nstep' N E' VE'}
H46 : {val' VE'}
============================
{tm' VE'}
Subgoal 11.3.7.1.4.2.3.1.1.2 is:
{val' VE'}
Subgoal 11.3.7.1.4.2.3.1.2 is:
{val' V2'}
Subgoal 11.3.7.1.4.2.3.2 is:
{val' V1'}
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst_env_equiv_cc_tm' with L = L'.
Subgoal 11.3.7.1.4.2.3.1.1.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
{val' VE'}
Subgoal 11.3.7.1.4.2.3.1.2 is:
{val' V2'}
Subgoal 11.3.7.1.4.2.3.2 is:
{val' V1'}
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst_env_equiv_cc_val' with L = L'.
Subgoal 11.3.7.1.4.2.3.1.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
{val' V2'}
Subgoal 11.3.7.1.4.2.3.2 is:
{val' V1'}
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain equiv_cc_val' with T = arr T1 T2, K = J.
Subgoal 11.3.7.1.4.2.3.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
{val' V1'}
Subgoal 11.3.7.1.4.2.4 is:
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain equiv_cc_val' with T = T1, K = J.
Subgoal 11.3.7.1.4.2.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(map n2 V1 :: map n1 V2 :: ML)
(map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst_equiv_cc_extend.
Subgoal 11.3.7.1.4.2.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n1 : tm, n3 : tm', n5 : tm']
|> subst_equiv_cc (of n1 (arr T1 T2) :: L') J (map n1 V2 :: ML)
(map n3 V2' :: map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst_equiv_cc_extend.
Subgoal 11.3.7.1.4.2.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n5 : tm']
|> subst_equiv_cc L' J ML (map n5 VE' :: nil)
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < unfold.
Subgoal 11.3.7.1.4.2.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
subst_env_equiv_cc L' J ML VE'
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain subst_env_equiv_cc_closed.
Subgoal 11.3.7.1.4.2.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
le J K
Subgoal 11.3.7.1.4.2.5 is:
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain lt_to_le.
Subgoal 11.3.7.1.4.2.5:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n1 : tm, n2 : tm]
|> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain explct_meta_subst_comm with E = R1 V2.
Subgoal 11.3.7.1.4.2.5:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
[n1 : tm, n2 : tm]
|> app_subst (map n1 V2 :: ML) (R n1 n2) (R1 V2 n2)
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain explct_meta_subst_comm with E = x\R1 x n2.
Subgoal 11.3.7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
============================
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < assert exists N, {nstep' N
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
(e\R' g y e))))
(R' V2' V1' VE')}.
Subgoal 11.3.7.1.4.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
============================
exists N, {nstep' N
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
(e\R' g y e))))
(R' V2' V1' VE')}
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply equiv_cc_val' to _ _ H38.
Subgoal 11.3.7.1.4.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
H46 : {val' V1'}
============================
exists N, {nstep' N
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
(e\R' g y e))))
(R' V2' V1' VE')}
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply equiv_cc_val' to _ _ H39.
Subgoal 11.3.7.1.4.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
H46 : {val' V1'}
H47 : {val' V2'}
============================
exists N, {nstep' N
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
(e\R' g y e))))
(R' V2' V1' VE')}
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply subst_env_equiv_cc_val' to _ _ H36.
Subgoal 11.3.7.1.4.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
H46 : {val' V1'}
H47 : {val' V2'}
H48 : {val' VE'}
============================
exists N, {nstep' N
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
(e\R' g y e))))
(R' V2' V1' VE')}
Subgoal 11.3.7.1.4 is:
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search 11.
Subgoal 11.3.7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
H46 : exists N, {nstep' N
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
(e\R' g y e))))
(R' V2' V1' VE')}
============================
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H46.
Subgoal 11.3.7.1.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J,N : nat
V1,V2 : tm
E,E',VE',V1',V2' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
H47 : {nstep' N
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
(e\R' g y e))))
(R' V2' V1' VE')}
============================
sim_cc T2 J (R1 V2 V1)
(let' (fst' (pair' V2' (pair' V1' VE')))
(g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
(y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))
Subgoal 11.3.7 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain sim_cc_closed_nstep' with N = N, M' = R' V2' V1' VE'.
Subgoal 11.3.7:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc_arr (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
============================
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.3 is:
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain equiv_cc_arr_to_equiv_cc.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
============================
sim_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < unfold.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
============================
forall J V, le J K -> {nstep J (fix R1) V} -> {val V} ->
(exists V' N, {eval'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
V'} /\
{add J N K} /\ equiv_cc (arr T1 T2) N V V')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < intros.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K,J : nat
V : tm
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
H38 : le J K
H39 : {nstep J (fix R1) V}
H40 : {val V}
============================
exists V' N, {eval'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
V'} /\
{add J N K} /\ equiv_cc (arr T1 T2) N V V'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply nstep_val_inv to _ H39.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
exists V' N, {eval'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
V'} /\
{add z N K} /\ equiv_cc (arr T1 T2) N (fix R1) V'
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < exists clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE'.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
exists N, {eval'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')} /\
{add z N K} /\
equiv_cc (arr T1 T2) N (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < exists K.
Subgoal 11.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
{eval'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')} /\
{add z K K} /\
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < split.
Subgoal 11.3.8:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
{eval'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')}
Subgoal 11.3.9 is:
{add z K K}
Subgoal 11.3.10 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain eval'_clos_fwd.
Subgoal 11.3.9:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
{add z K K}
Subgoal 11.3.10 is:
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search.
Subgoal 11.3.10:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
E,E',VE' : tm'
T2,T1 : ty
R,R1 : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
|> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
|> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
equiv_cc (arr T1 T2) K (fix R1)
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
VE')
Subgoal 11.4 is:
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < search.
Subgoal 11.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
F : o
P : tm
P',E : tm'
T : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {L', [F] |- of (fix R) T}
H22 : member F L'
============================
sim_cc T K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H21.
Subgoal 11.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L,L' : list o
Vs,FVs : list tm
Vs' : list tm'
K : nat
F : o
P : tm
P',E : tm'
T1 : ty
R : tm -> tm -> tm
NMap : tm' -> (list (map tm tm'))
R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T1}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
(clos'
(abs'
(p\let' (fst' p)
(g\let' (fst' (snd' p))
(y\let' (snd' (snd' p)) (e\R' g y e)))))
E)
P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
|> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
(R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {L', [F] |- of (fix R) T1}
H22 : member F L'
H23 : name (fix R)
============================
sim_cc T1 K P P'
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < case H23.
Subgoal 12:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M2,M1 : tm
P',M2',M1' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) P
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
============================
sim_cc T K P P'
cc_sem_pres < assert exists M3 M4, P = app M3 M4 /\ app_subst ML M1 M3 /\ app_subst ML M2 M4.
Subgoal 12.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M2,M1 : tm
P',M2',M1' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) P
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
============================
exists M3 M4, P = app M3 M4 /\ app_subst ML M1 M3 /\ app_subst ML M2 M4
Subgoal 12 is:
sim_cc T K P P'
cc_sem_pres < backchain app_subst_app_comm.
Subgoal 12:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M2,M1 : tm
P',M2',M1' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) P
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : exists M3 M4, P = app M3 M4 /\ app_subst ML M1 M3 /\ app_subst ML M2 M4
============================
sim_cc T K P P'
cc_sem_pres < case H15.
Subgoal 12:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
P',M2',M1' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
============================
sim_cc T K (app M3 M4) P'
cc_sem_pres < assert exists M3' M4', P' =
let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
app_subst ML' M1' M3' /\ app_subst ML' M2' M4'.
Subgoal 12.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
P',M2',M1' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
============================
exists M3' M4', P' =
let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
app_subst ML' M1' M3' /\ app_subst ML' M2' M4'
Subgoal 12 is:
sim_cc T K (app M3 M4) P'
cc_sem_pres < apply app_subst'_let_comm to H12.
Subgoal 12.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M5 : tm'
T : ty
R1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M5 R1)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : app_subst ML' M1' M5
H19 : [n1 : tm']
|> app_subst ML' (open' n1 (f\e\app' f (pair' n1 (pair' M2' e))))
(R1 n1)
============================
exists M3' M4', let' M5 R1 =
let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
app_subst ML' M1' M3' /\ app_subst ML' M2' M4'
Subgoal 12 is:
sim_cc T K (app M3 M4) P'
cc_sem_pres < apply app_subst'_open_comm to H19.
Subgoal 12.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M5 : tm'
T : ty
M1'1,M2'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M5
(z1\open' (M1'1 z1)
(f\e\app' f (pair' (M1'1 z1) (pair' (M2'1 z1) e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : app_subst ML' M1' M5
H19 : [n1 : tm']
|> app_subst ML' (open' n1 (f\e\app' f (pair' n1 (pair' M2' e))))
(open' (M1'1 n1)
(f\e\app' f (pair' (M1'1 n1) (pair' (M2'1 n1) e))))
H20 : [n1 : tm']
|> app_subst ML' n1 (M1'1 n1)
H21 : [n1 : tm']
|> app_subst ML' M2' (M2'1 n1)
============================
exists M3' M4', let' M5
(z1\open' (M1'1 z1)
(f\e\app' f (pair' (M1'1 z1) (pair' (M2'1 z1) e)))) =
let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
app_subst ML' M1' M3' /\ app_subst ML' M2' M4'
Subgoal 12 is:
sim_cc T K (app M3 M4) P'
cc_sem_pres < apply app_subst_prune to H21.
Subgoal 12.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M5,M'' : tm'
T : ty
M1'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M5
(z1\open' (M1'1 z1) (f\e\app' f (pair' (M1'1 z1) (pair' M'' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : app_subst ML' M1' M5
H19 : [n1 : tm']
|> app_subst ML' (open' n1 (f\e\app' f (pair' n1 (pair' M2' e))))
(open' (M1'1 n1) (f\e\app' f (pair' (M1'1 n1) (pair' M'' e))))
H20 : [n1 : tm']
|> app_subst ML' n1 (M1'1 n1)
H21 : app_subst ML' M2' M''
============================
exists M3' M4', let' M5
(z1\open' (M1'1 z1)
(f\e\app' f (pair' (M1'1 z1) (pair' M'' e)))) =
let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
app_subst ML' M1' M3' /\ app_subst ML' M2' M4'
Subgoal 12 is:
sim_cc T K (app M3 M4) P'
cc_sem_pres < apply subst'_nabla to H4 with x = n1.
Subgoal 12.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M5,M'' : tm'
T : ty
M1'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M5
(z1\open' (M1'1 z1) (f\e\app' f (pair' (M1'1 z1) (pair' M'' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : app_subst ML' M1' M5
H19 : [n1 : tm']
|> app_subst ML' (open' n1 (f\e\app' f (pair' n1 (pair' M2' e))))
(open' (M1'1 n1) (f\e\app' f (pair' (M1'1 n1) (pair' M'' e))))
H20 : [n1 : tm']
|> app_subst ML' n1 (M1'1 n1)
H21 : app_subst ML' M2' M''
H22 : [n1 : tm']
|> app_subst ML' n1 n1
============================
exists M3' M4', let' M5
(z1\open' (M1'1 z1)
(f\e\app' f (pair' (M1'1 z1) (pair' M'' e)))) =
let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
app_subst ML' M1' M3' /\ app_subst ML' M2' M4'
Subgoal 12 is:
sim_cc T K (app M3 M4) P'
cc_sem_pres < apply app_subst_det to H20 H22.
Subgoal 12.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M5,M'' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M5 (z1\open' z1 (f\e\app' f (pair' z1 (pair' M'' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : app_subst ML' M1' M5
H19 : [n1 : tm']
|> app_subst ML' (open' n1 (f\e\app' f (pair' n1 (pair' M2' e))))
(open' n1 (f\e\app' f (pair' n1 (pair' M'' e))))
H20 : [n1 : tm']
|> app_subst ML' n1 n1
H21 : app_subst ML' M2' M''
H22 : [n1 : tm']
|> app_subst ML' n1 n1
============================
exists M3' M4', let' M5 (z1\open' z1 (f\e\app' f (pair' z1 (pair' M'' e)))) =
let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
app_subst ML' M1' M3' /\ app_subst ML' M2' M4'
Subgoal 12 is:
sim_cc T K (app M3 M4) P'
cc_sem_pres < search.
Subgoal 12:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
P',M2',M1' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : exists M3' M4', P' =
let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
app_subst ML' M1' M3' /\ app_subst ML' M2' M4'
============================
sim_cc T K (app M3 M4) P'
cc_sem_pres < case H18.
Subgoal 12:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M3',M4' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
============================
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < case H9.
Subgoal 12.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M3',M4' : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
============================
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < assert sim_cc (arr T1 T) K M3 M3'.
Subgoal 12.3.1:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M3',M4' : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
============================
sim_cc (arr T1 T) K M3 M3'
Subgoal 12.3 is:
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < backchain IH.
Subgoal 12.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M3',M4' : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
H23 : sim_cc (arr T1 T) K M3 M3'
============================
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < assert sim_cc T1 K M4 M4'.
Subgoal 12.3.2:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M3',M4' : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
H23 : sim_cc (arr T1 T) K M3 M3'
============================
sim_cc T1 K M4 M4'
Subgoal 12.3 is:
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < backchain IH.
Subgoal 12.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M3',M4' : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
H23 : sim_cc (arr T1 T) K M3 M3'
H24 : sim_cc T1 K M4 M4'
============================
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < apply of_is_sty to _ H21.
Subgoal 12.3:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
M2,M1,M3,M4 : tm
M2',M1',M3',M4' : tm'
T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
H23 : sim_cc (arr T1 T) K M3 M3'
H24 : sim_cc T1 K M4 M4'
H25 : {is_sty (arr T1 T)}
============================
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < backchain sim_cc_app.
Subgoal 12.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M2,M1,M3,M4 : tm
M2',M1',M3',M4' : tm'
T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L, [F] |- of (app M1 M2) T}
H22 : member F L
============================
sim_cc T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < apply ctx_focus_inv to _ _ H21.
Subgoal 12.4:
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
F : o
M2,M1,M3,M4 : tm
M2',M1',M3',M4' : tm'
T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L, [F] |- of (app M1 M2) T1}
H22 : member F L
H23 : name (app M1 M2)
============================
sim_cc T1 K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < case H23.
Proof completed.
Abella < Define sim_cc' : ty -> tm -> tm' -> prop by
sim_cc' T M M' := forall K, {is_nat K} -> sim_cc T K M M'.
Abella < Define equiv_cc' : ty -> tm -> tm' -> prop by
equiv_cc' T M M' := forall K, {is_nat K} -> equiv_cc T K M M'.
Abella < Define subst_equiv_cc' : (list o) -> (list (map tm tm)) -> (list (map tm' tm')) -> prop by
subst_equiv_cc' L ML ML' := forall K, {is_nat K} -> subst_equiv_cc L K ML ML'.
Abella < Theorem cc_sem_pres' :
forall L ML ML' Vs Vs' Map T P P' M M', ctx L -> subst ML -> subst' ML' ->
subst_equiv_cc' L ML ML' -> vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map -> {L |- of M T} -> {cc Map Vs M M'} ->
app_subst ML M P -> app_subst ML' M' P' -> sim_cc' T P P'.
============================
forall L ML ML' Vs Vs' Map T P P' M M', ctx L -> subst ML -> subst' ML' ->
subst_equiv_cc' L ML ML' -> vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map -> {L |- of M T} -> {cc Map Vs M M'} ->
app_subst ML M P -> app_subst ML' M' P' -> sim_cc' T P P'
cc_sem_pres' < intros.
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
P,M : tm
P',M' : tm'
T : ty
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv_cc' L ML ML'
H5 : vars_of_ctx L Vs
H6 : vars_of_subst' ML' Vs'
H7 : to_mapping Vs Vs' Map
H8 : {L |- of M T}
H9 : {cc Map Vs M M'}
H10 : app_subst ML M P
H11 : app_subst ML' M' P'
============================
sim_cc' T P P'
cc_sem_pres' < unfold.
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
P,M : tm
P',M' : tm'
T : ty
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv_cc' L ML ML'
H5 : vars_of_ctx L Vs
H6 : vars_of_subst' ML' Vs'
H7 : to_mapping Vs Vs' Map
H8 : {L |- of M T}
H9 : {cc Map Vs M M'}
H10 : app_subst ML M P
H11 : app_subst ML' M' P'
============================
forall K, {is_nat K} -> sim_cc T K P P'
cc_sem_pres' < intros.
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M' : tm'
T : ty
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv_cc' L ML ML'
H5 : vars_of_ctx L Vs
H6 : vars_of_subst' ML' Vs'
H7 : to_mapping Vs Vs' Map
H8 : {L |- of M T}
H9 : {cc Map Vs M M'}
H10 : app_subst ML M P
H11 : app_subst ML' M' P'
H12 : {is_nat K}
============================
sim_cc T K P P'
cc_sem_pres' < backchain cc_sem_pres.
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M' : tm'
T : ty
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv_cc' L ML ML'
H5 : vars_of_ctx L Vs
H6 : vars_of_subst' ML' Vs'
H7 : to_mapping Vs Vs' Map
H8 : {L |- of M T}
H9 : {cc Map Vs M M'}
H10 : app_subst ML M P
H11 : app_subst ML' M' P'
H12 : {is_nat K}
============================
subst_equiv_cc L K ML ML'
cc_sem_pres' < case H4.
Variables:
ML : list (map tm tm)
Map : list (map tm tm')
ML' : list (map tm' tm')
L : list o
Vs : list tm
Vs' : list tm'
K : nat
P,M : tm
P',M' : tm'
T : ty
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H5 : vars_of_ctx L Vs
H6 : vars_of_subst' ML' Vs'
H7 : to_mapping Vs Vs' Map
H8 : {L |- of M T}
H9 : {cc Map Vs M M'}
H10 : app_subst ML M P
H11 : app_subst ML' M' P'
H12 : {is_nat K}
H13 : forall K, {is_nat K} -> subst_equiv_cc L K ML ML'
============================
subst_equiv_cc L K ML ML'
cc_sem_pres' < backchain H13.
Proof completed.
Abella < Theorem cc_nat_sem_pres :
forall M M' N, {of M tnat} -> {cc' M M'} -> {eval M (nat N)} ->
{eval' M' (nat' N)}.
============================
forall M M' N, {of M tnat} -> {cc' M M'} -> {eval M (nat N)} ->
{eval' M' (nat' N)}
cc_nat_sem_pres < intros.
Variables:
N : nat
M : tm
M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H3 : {eval M (nat N)}
============================
{eval' M' (nat' N)}
cc_nat_sem_pres < case H3.
Variables:
N,N1 : nat
M : tm
M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
============================
{eval' M' (nat' N)}
cc_nat_sem_pres < apply nstep_is_nat to H4.
Variables:
N,N1 : nat
M : tm
M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
============================
{eval' M' (nat' N)}
cc_nat_sem_pres < assert sim_cc tnat N1 M M'.
Subgoal 1:
Variables:
N,N1 : nat
M : tm
M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
============================
sim_cc tnat N1 M M'
Subgoal is:
{eval' M' (nat' N)}
cc_nat_sem_pres < backchain cc_sem_pres with L = nil, ML = nil, ML' = map n1 unit' :: nil, Vs = nil, Vs' = n1 :: nil, Map = nil, M = M, M' = M'.
Subgoal 1:
Variables:
N,N1 : nat
M : tm
M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
============================
{cc nil nil M M'}
Subgoal is:
{eval' M' (nat' N)}
cc_nat_sem_pres < case H2.
Subgoal 1:
Variables:
N,N1 : nat
M : tm
M' : tm'
H1 : {of M tnat}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H7 : {cc nil nil M M'}
============================
{cc nil nil M M'}
Subgoal is:
{eval' M' (nat' N)}
cc_nat_sem_pres < search.
Variables:
N,N1 : nat
M : tm
M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H7 : sim_cc tnat N1 M M'
============================
{eval' M' (nat' N)}
cc_nat_sem_pres < case H7.
Variables:
N,N1 : nat
M : tm
M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H8 : forall J V, le J N1 -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N N1} /\ equiv_cc tnat N V V')
============================
{eval' M' (nat' N)}
cc_nat_sem_pres < apply H8 to _ H4 H5 with J = N1.
Subgoal 2:
Variables:
N,N1 : nat
M : tm
M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H8 : forall J V, le J N1 -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N N1} /\ equiv_cc tnat N V V')
============================
le N1 N1
Subgoal is:
{eval' M' (nat' N)}
cc_nat_sem_pres < backchain le_refl.
Variables:
N,N1,N2 : nat
M : tm
M',V' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H8 : forall J V, le J N1 -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N N1} /\ equiv_cc tnat N V V')
H9 : {eval' M' V'}
H10 : {add N1 N2 N1}
H11 : equiv_cc tnat N2 (nat N) V'
============================
{eval' M' (nat' N)}
cc_nat_sem_pres < case H11.
Variables:
N,N1,N2 : nat
M : tm
M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H8 : forall J V, le J N1 -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N N1} /\ equiv_cc tnat N V V')
H9 : {eval' M' (nat' N)}
H10 : {add N1 N2 N1}
============================
{eval' M' (nat' N)}
cc_nat_sem_pres < search.
Proof completed.
Abella <