Welcome to Abella 2.0.4-dev
Abella < Specification "trans".
Reading specification "trans"
Abella < Import "eval".
Importing from eval
Abella < Import "cc_typ_pres".
Importing from cc_typ_pres
Abella < Import "subst".
Importing from subst
Abella < Define sim : ty -> nat -> tm -> tm' -> prop,
equiv : ty -> nat -> tm -> tm' -> prop by
sim 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 T N V V');
equiv tnat K (nat N) (nat' N);
equiv tunit K unit unit';
equiv (prod T1 T2) K (pair V1 V2) (pair' V1' V2') := equiv T1 K V1 V1' /\ equiv T2 K V2 V2';
equiv (arr T1 T2) z (fix R) (clos' (abs' R') VE) := {val' VE} /\ {tm (fix R)} /\ {tm' (clos' (abs' R') VE)};
equiv (arr T1 T2) (s K) (fix R) (clos' (abs' R') VE) := equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) /\
(forall V1 V1' V2 V2', equiv T1 K V1 V1' -> equiv (arr T1 T2) K V2 V2' ->
sim T2 K (R V2 V1) (R' (pair' V2' (pair' V1' VE)))).
Warning: Definition might not be stratified
("equiv" occurs to the left of ->)
Abella < Theorem equiv_val :
forall T K V V', {is_sty T} -> {is_nat K} -> equiv T K V V' -> {val V}.
============================
forall T K V V', {is_sty T} -> {is_nat K} -> equiv T K V V' -> {val V}
equiv_val < induction on 1.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
============================
forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv T K V V' -> {val V}
equiv_val < induction on 2.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val V}
============================
forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv T K V V' -> {val V}
equiv_val < intros.
Variables: T K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val V}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv T K V V'
============================
{val V}
equiv_val < case H1 (keep).
Subgoal 1:
Variables: K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val V}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv tnat K V V'
============================
{val V}
Subgoal 2 is:
{val V}
Subgoal 3 is:
{val V}
Subgoal 4 is:
{val V}
equiv_val < case H3.
Subgoal 1:
Variables: K N
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_val < search.
Subgoal 2:
Variables: K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val V}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv tunit K V V'
============================
{val V}
Subgoal 3 is:
{val V}
Subgoal 4 is:
{val V}
equiv_val < case H3.
Subgoal 2:
Variables: K
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_val < search.
Subgoal 3:
Variables: K V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val V}
Subgoal 4 is:
{val V}
equiv_val < case H3.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
============================
{val (pair V1 V2)}
Subgoal 4 is:
{val V}
equiv_val < apply IH to H4 H2 _.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
H8 : {val V1}
============================
{val (pair V1 V2)}
Subgoal 4 is:
{val V}
equiv_val < apply IH to H5 H2 _.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
H8 : {val V1}
H9 : {val V2}
============================
{val (pair V1 V2)}
Subgoal 4 is:
{val V}
equiv_val < search.
Subgoal 4:
Variables: K V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val V}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val V}
equiv_val < case H2.
Subgoal 4.1:
Variables: V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val V}
Subgoal 4.2 is:
{val V}
equiv_val < case H3.
Subgoal 4.1:
Variables: T2 T1 VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_val < search.
Subgoal 4.2:
Variables: V V' T2 T1 N
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
{val V}
equiv_val < case H3.
Subgoal 4.2:
Variables: T2 T1 N VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{val (fix R)}
equiv_val < apply IH1 to H1 H6 H7.
Subgoal 4.2:
Variables: T2 T1 N VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {val (fix R)}
============================
{val (fix R)}
equiv_val < search.
Proof completed.
Abella < Theorem equiv_val' :
forall T K V V', {is_sty T} -> {is_nat K} -> equiv T K V V' -> {val' V'}.
============================
forall T K V V', {is_sty T} -> {is_nat K} -> equiv T K V V' -> {val' V'}
equiv_val' < induction on 1.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
============================
forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv T K V V' -> {val' V'}
equiv_val' < induction on 2.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val' V'}
============================
forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv T K V V' -> {val' V'}
equiv_val' < intros.
Variables: T K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val' V'}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv T K V V'
============================
{val' V'}
equiv_val' < case H1 (keep).
Subgoal 1:
Variables: K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val' V'}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv tnat K V V'
============================
{val' V'}
Subgoal 2 is:
{val' V'}
Subgoal 3 is:
{val' V'}
Subgoal 4 is:
{val' V'}
equiv_val' < case H3.
Subgoal 1:
Variables: K N
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_val' < search.
Subgoal 2:
Variables: K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val' V'}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv tunit K V V'
============================
{val' V'}
Subgoal 3 is:
{val' V'}
Subgoal 4 is:
{val' V'}
equiv_val' < case H3.
Subgoal 2:
Variables: K
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_val' < search.
Subgoal 3:
Variables: K V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val' V'}
Subgoal 4 is:
{val' V'}
equiv_val' < case H3.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
============================
{val' (pair' V1' V2')}
Subgoal 4 is:
{val' V'}
equiv_val' < apply IH to H4 H2 _.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
H8 : {val' V1'}
============================
{val' (pair' V1' V2')}
Subgoal 4 is:
{val' V'}
equiv_val' < apply IH to H5 H2 _.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
H8 : {val' V1'}
H9 : {val' V2'}
============================
{val' (pair' V1' V2')}
Subgoal 4 is:
{val' V'}
equiv_val' < search.
Subgoal 4:
Variables: K V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val' V'}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val' V'}
equiv_val' < case H2.
Subgoal 4.1:
Variables: V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{val' V'}
Subgoal 4.2 is:
{val' V'}
equiv_val' < case H3.
Subgoal 4.1:
Variables: T2 T1 VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_val' < search.
Subgoal 4.2:
Variables: V V' T2 T1 N
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{val' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
{val' V'}
equiv_val' < case H3.
Subgoal 4.2:
Variables: T2 T1 N VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{val' (clos' (abs' R') VE)}
equiv_val' < apply IH1 to H1 H6 H7.
Subgoal 4.2:
Variables: T2 T1 N VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
{val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {val' (clos' (abs' R') VE)}
============================
{val' (clos' (abs' R') VE)}
equiv_val' < search.
Proof completed.
Abella < Theorem equiv_tm :
forall T K V V', {is_sty T} -> {is_nat K} -> equiv T K V V' -> {tm V}.
============================
forall T K V V', {is_sty T} -> {is_nat K} -> equiv T K V V' -> {tm V}
equiv_tm < induction on 1.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
============================
forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv T K V V' -> {tm V}
equiv_tm < induction on 2.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm V}
============================
forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv T K V V' -> {tm V}
equiv_tm < intros.
Variables: T K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm V}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv T K V V'
============================
{tm V}
equiv_tm < case H1 (keep).
Subgoal 1:
Variables: K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm V}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv tnat K V V'
============================
{tm V}
Subgoal 2 is:
{tm V}
Subgoal 3 is:
{tm V}
Subgoal 4 is:
{tm V}
equiv_tm < case H3.
Subgoal 1:
Variables: K N
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_tm < search.
Subgoal 2:
Variables: K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm V}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv tunit K V V'
============================
{tm V}
Subgoal 3 is:
{tm V}
Subgoal 4 is:
{tm V}
equiv_tm < case H3.
Subgoal 2:
Variables: K
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_tm < search.
Subgoal 3:
Variables: K V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm V}
Subgoal 4 is:
{tm V}
equiv_tm < case H3.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
============================
{tm (pair V1 V2)}
Subgoal 4 is:
{tm V}
equiv_tm < apply IH to H4 H2 _.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
H8 : {tm V1}
============================
{tm (pair V1 V2)}
Subgoal 4 is:
{tm V}
equiv_tm < apply IH to H5 H2 _.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
H8 : {tm V1}
H9 : {tm V2}
============================
{tm (pair V1 V2)}
Subgoal 4 is:
{tm V}
equiv_tm < search.
Subgoal 4:
Variables: K V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm V}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm V}
equiv_tm < case H2.
Subgoal 4.1:
Variables: V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm V}
Subgoal 4.2 is:
{tm V}
equiv_tm < case H3.
Subgoal 4.1:
Variables: T2 T1 VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_tm < search.
Subgoal 4.2:
Variables: V V' T2 T1 N
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
{tm V}
equiv_tm < case H3.
Subgoal 4.2:
Variables: T2 T1 N VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{tm (fix R)}
equiv_tm < apply IH1 to H1 H6 H7.
Subgoal 4.2:
Variables: T2 T1 N VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {tm (fix R)}
============================
{tm (fix R)}
equiv_tm < search.
Proof completed.
Abella < Theorem equiv_tm' :
forall T K V V', {is_sty T} -> {is_nat K} -> equiv T K V V' -> {tm' V'}.
============================
forall T K V V', {is_sty T} -> {is_nat K} -> equiv T K V V' -> {tm' V'}
equiv_tm' < induction on 1.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
============================
forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv T K V V' -> {tm' V'}
equiv_tm' < induction on 2.
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm' V'}
============================
forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv T K V V' -> {tm' V'}
equiv_tm' < intros.
Variables: T K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm' V'}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv T K V V'
============================
{tm' V'}
equiv_tm' < case H1 (keep).
Subgoal 1:
Variables: K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm' V'}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv tnat K V V'
============================
{tm' V'}
Subgoal 2 is:
{tm' V'}
Subgoal 3 is:
{tm' V'}
Subgoal 4 is:
{tm' V'}
equiv_tm' < case H3.
Subgoal 1:
Variables: K N
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_tm' < search.
Subgoal 2:
Variables: K V V'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm' V'}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv tunit K V V'
============================
{tm' V'}
Subgoal 3 is:
{tm' V'}
Subgoal 4 is:
{tm' V'}
equiv_tm' < case H3.
Subgoal 2:
Variables: K
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_tm' < search.
Subgoal 3:
Variables: K V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm' V'}
Subgoal 4 is:
{tm' V'}
equiv_tm' < case H3.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
============================
{tm' (pair' V1' V2')}
Subgoal 4 is:
{tm' V'}
equiv_tm' < apply IH to H4 H2 _.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
H8 : {tm' V1'}
============================
{tm' (pair' V1' V2')}
Subgoal 4 is:
{tm' V'}
equiv_tm' < apply IH to H5 H2 _.
Subgoal 3:
Variables: K T2 T1 V2' V1' V2 V1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 T1 K V1 V1'
H7 : equiv T2 K V2 V2'
H8 : {tm' V1'}
H9 : {tm' V2'}
============================
{tm' (pair' V1' V2')}
Subgoal 4 is:
{tm' V'}
equiv_tm' < search.
Subgoal 4:
Variables: K V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm' V'}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm' V'}
equiv_tm' < case H2.
Subgoal 4.1:
Variables: V V' T2 T1
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
{tm' V'}
Subgoal 4.2 is:
{tm' V'}
equiv_tm' < case H3.
Subgoal 4.1:
Variables: T2 T1 VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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_tm' < search.
Subgoal 4.2:
Variables: V V' T2 T1 N
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
{tm' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
{tm' V'}
equiv_tm' < case H3.
Subgoal 4.2:
Variables: T2 T1 N VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
{tm' (clos' (abs' R') VE)}
equiv_tm' < apply IH1 to H1 H6 H7.
Subgoal 4.2:
Variables: T2 T1 N VE R' R
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' -> {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv 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 (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {tm' (clos' (abs' R') VE)}
============================
{tm' (clos' (abs' R') VE)}
equiv_tm' < search.
Proof completed.
Abella < Theorem equiv_arr_val' :
forall T1 T K R V, {is_nat K} -> equiv (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 (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
equiv_arr_val' < induction on 1.
IH : forall T1 T K R V, {is_nat K}* -> equiv (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 (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
equiv_arr_val' < intros.
Variables: T1 T K R V
IH : forall T1 T K R V, {is_nat K}* -> equiv (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H1 : {is_nat K}@
H2 : equiv (arr T1 T) K (fix R) V
============================
exists R' VE, V = clos' (abs' R') VE /\ {val' VE}
equiv_arr_val' < case H1.
Subgoal 1:
Variables: T1 T R V
IH : forall T1 T K R V, {is_nat K}* -> equiv (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H2 : equiv (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_arr_val' < case H2.
Subgoal 1:
Variables: T1 T R VE R'
IH : forall T1 T K R V, {is_nat K}* -> equiv (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_arr_val' < search.
Subgoal 2:
Variables: T1 T R V N
IH : forall T1 T K R V, {is_nat K}* -> equiv (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H2 : equiv (arr T1 T) (s N) (fix R) V
H3 : {is_nat N}*
============================
exists R' VE, V = clos' (abs' R') VE /\ {val' VE}
equiv_arr_val' < case H2.
Subgoal 2:
Variables: T1 T R N VE R'
IH : forall T1 T K R V, {is_nat K}* -> equiv (arr T1 T) K (fix R) V ->
(exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H3 : {is_nat N}*
H4 : equiv (arr T1 T) N (fix R) (clos' (abs' R') VE)
H5 : forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T) N V2 V2' ->
sim 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_arr_val' < backchain IH.
Proof completed.
Abella < Theorem equiv_closed :
forall T K J V V', {is_sty T} -> {is_nat K} -> equiv T K V V' -> le J K ->
equiv T J V V'.
============================
forall T K J V V', {is_sty T} -> {is_nat K} -> equiv T K V V' -> le J K ->
equiv T J V V'
equiv_closed < induction on 1.
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
============================
forall T K J V V', {is_sty T}@ -> {is_nat K} -> equiv T K V V' -> le J K ->
equiv T J V V'
equiv_closed < induction on 2.
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
============================
forall T K J V V', {is_sty T}@ -> {is_nat K}@@ -> equiv T K V V' ->
le J K -> equiv T J V V'
equiv_closed < intros.
Variables: T K J V V'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv T K V V'
H4 : le J K
============================
equiv T J V V'
equiv_closed < case H1 (keep).
Subgoal 1:
Variables: K J V V'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv tnat K V V'
H4 : le J K
============================
equiv tnat J V V'
Subgoal 2 is:
equiv tunit J V V'
Subgoal 3 is:
equiv (prod T1 T2) J V V'
Subgoal 4 is:
equiv (arr T1 T2) J V V'
equiv_closed < case H3.
Subgoal 1:
Variables: K J N
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H4 : le J K
============================
equiv tnat J (nat N) (nat' N)
Subgoal 2 is:
equiv tunit J V V'
Subgoal 3 is:
equiv (prod T1 T2) J V V'
Subgoal 4 is:
equiv (arr T1 T2) J V V'
equiv_closed < search.
Subgoal 2:
Variables: K J V V'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv tunit K V V'
H4 : le J K
============================
equiv tunit J V V'
Subgoal 3 is:
equiv (prod T1 T2) J V V'
Subgoal 4 is:
equiv (arr T1 T2) J V V'
equiv_closed < case H3.
Subgoal 2:
Variables: K J
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H4 : le J K
============================
equiv tunit J unit unit'
Subgoal 3 is:
equiv (prod T1 T2) J V V'
Subgoal 4 is:
equiv (arr T1 T2) J V V'
equiv_closed < search.
Subgoal 3:
Variables: K J V V' T2 T1
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (prod T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
============================
equiv (prod T1 T2) J V V'
Subgoal 4 is:
equiv (arr T1 T2) J V V'
equiv_closed < case H3.
Subgoal 3:
Variables: K J T2 T1 V2' V1' V2 V1
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv 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 T1 K V1 V1'
H8 : equiv T2 K V2 V2'
============================
equiv (prod T1 T2) J (pair V1 V2) (pair' V1' V2')
Subgoal 4 is:
equiv (arr T1 T2) J V V'
equiv_closed < unfold.
Subgoal 3.1:
Variables: K J T2 T1 V2' V1' V2 V1
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv 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 T1 K V1 V1'
H8 : equiv T2 K V2 V2'
============================
equiv T1 J V1 V1'
Subgoal 3.2 is:
equiv T2 J V2 V2'
Subgoal 4 is:
equiv (arr T1 T2) J V V'
equiv_closed < backchain IH.
Subgoal 3.2:
Variables: K J T2 T1 V2' V1' V2 V1
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv 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 T1 K V1 V1'
H8 : equiv T2 K V2 V2'
============================
equiv T2 J V2 V2'
Subgoal 4 is:
equiv (arr T1 T2) J V V'
equiv_closed < backchain IH.
Subgoal 4:
Variables: K J V V' T2 T1
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (arr T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
============================
equiv (arr T1 T2) J V V'
equiv_closed < apply le_to_lt to _ H4.
Subgoal 4:
Variables: K J V V' T2 T1
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (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 (arr T1 T2) J V V'
equiv_closed < case H7.
Subgoal 4.1:
Variables: K V V' T2 T1
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (arr T1 T2) K V V'
H4 : le K K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
============================
equiv (arr T1 T2) K V V'
Subgoal 4.2 is:
equiv (arr T1 T2) J V V'
equiv_closed < search.
Subgoal 4.2:
Variables: K J V V' T2 T1
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv (arr T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J K
============================
equiv (arr T1 T2) J V V'
equiv_closed < case H2 (keep).
Subgoal 4.2.1:
Variables: J V V' T2 T1
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat z}@@
H3 : equiv (arr T1 T2) z V V'
H4 : le J z
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J z
============================
equiv (arr T1 T2) J V V'
Subgoal 4.2.2 is:
equiv (arr T1 T2) J V V'
equiv_closed < apply lt_z_absurd to H8.
Subgoal 4.2.2:
Variables: J V V' T2 T1 N
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H3 : equiv (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 (arr T1 T2) J V V'
equiv_closed < apply lt_pred_le to _ H8.
Subgoal 4.2.2:
Variables: J V V' T2 T1 N
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H3 : equiv (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 (arr T1 T2) J V V'
equiv_closed < case H3.
Subgoal 4.2.2:
Variables: J T2 T1 N VE R' R
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv 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 (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H12 : forall V1 V1' V2 V2', equiv T1 N V1 V1' ->
equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
equiv (arr T1 T2) J (fix R) (clos' (abs' R') VE)
equiv_closed < apply IH1 to H1 H9 H11 H10.
Subgoal 4.2.2:
Variables: J T2 T1 N VE R' R
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv T K V V' ->
le J K -> equiv T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv T K V V' ->
le J K -> equiv 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 (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H12 : forall V1 V1' V2 V2', equiv T1 N V1 V1' ->
equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H13 : equiv (arr T1 T2) J (fix R) (clos' (abs' R') VE)
============================
equiv (arr T1 T2) J (fix R) (clos' (abs' R') VE)
equiv_closed < search.
Proof completed.
Abella < Theorem equiv_arr_cond :
forall K T1 T2 R R' VE, {is_nat K} ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))).
============================
forall K T1 T2 R R' VE, {is_nat K} ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
equiv_arr_cond < induction on 1.
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
============================
forall K T1 T2 R R' VE, {is_nat K}@ ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
equiv_arr_cond < intros.
Variables: K T1 T2 R R' VE J V1 V1' V2 V2'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H1 : {is_nat K}@
H2 : equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE)
H3 : lt J K
H4 : equiv T1 J V1 V1'
H5 : equiv (arr T1 T2) J V2 V2'
============================
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_cond < case H1.
Subgoal 1:
Variables: T1 T2 R R' VE J V1 V1' V2 V2'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv (arr T1 T2) z (fix R) (clos' (abs' R') VE)
H3 : lt J z
H4 : equiv T1 J V1 V1'
H5 : equiv (arr T1 T2) J V2 V2'
============================
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
Subgoal 2 is:
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_cond < apply lt_z_absurd to H3.
Subgoal 2:
Variables: T1 T2 R R' VE J V1 V1' V2 V2' N
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv T1 J V1 V1'
H5 : equiv (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
============================
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_cond < apply lt_pred_le to _ H3.
Subgoal 2:
Variables: T1 T2 R R' VE J V1 V1' V2 V2' N
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv T1 J V1 V1'
H5 : equiv (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
============================
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_cond < apply le_to_lt to _ H7.
Subgoal 2:
Variables: T1 T2 R R' VE J V1 V1' V2 V2' N
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv T1 J V1 V1'
H5 : equiv (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H8 : J = N \/ lt J N
============================
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_cond < case H8.
Subgoal 2.1:
Variables: T1 T2 R R' VE V1 V1' V2 V2' N
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt N (s N)
H4 : equiv T1 N V1 V1'
H5 : equiv (arr T1 T2) N V2 V2'
H6 : {is_nat N}*
H7 : le N N
============================
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
Subgoal 2.2 is:
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_cond < case H2.
Subgoal 2.1:
Variables: T1 T2 R R' VE V1 V1' V2 V2' N
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H3 : lt N (s N)
H4 : equiv T1 N V1 V1'
H5 : equiv (arr T1 T2) N V2 V2'
H6 : {is_nat N}*
H7 : le N N
H9 : equiv (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H10 : forall V1 V1' V2 V2', equiv T1 N V1 V1' ->
equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
Subgoal 2.2 is:
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_cond < backchain H10.
Subgoal 2.2:
Variables: T1 T2 R R' VE J V1 V1' V2 V2' N
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv T1 J V1 V1'
H5 : equiv (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H9 : lt J N
============================
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_cond < case H2.
Subgoal 2.2:
Variables: T1 T2 R R' VE J V1 V1' V2 V2' N
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H3 : lt J (s N)
H4 : equiv T1 J V1 V1'
H5 : equiv (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H9 : lt J N
H10 : equiv (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H11 : forall V1 V1' V2 V2', equiv T1 N V1 V1' ->
equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_cond < apply IH to H6 H10.
Subgoal 2.2:
Variables: T1 T2 R R' VE J V1 V1' V2 V2' N
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
(forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H3 : lt J (s N)
H4 : equiv T1 J V1 V1'
H5 : equiv (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H9 : lt J N
H10 : equiv (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H11 : forall V1 V1' V2 V2', equiv T1 N V1 V1' ->
equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H12 : forall J V1 V1' V2 V2', lt J N -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_cond < backchain H12.
Proof completed.
Abella < Theorem app_equiv_arr :
forall T1 T R F VE N1 N2 V1 V1' K, {is_sty (arr T1 T)} -> {is_nat N1} ->
{is_nat N2} -> equiv (arr T1 T) N1 (fix R) (clos' (abs' F) VE) ->
equiv T1 N2 V1 V1' -> lt K N1 -> lt K N2 ->
sim 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 (arr T1 T) N1 (fix R) (clos' (abs' F) VE) ->
equiv T1 N2 V1 V1' -> lt K N1 -> lt K N2 ->
sim T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))
app_equiv_arr < intros.
Variables: T1 T R F VE N1 N2 V1 V1' K
H1 : {is_sty (arr T1 T)}
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
============================
sim T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))
app_equiv_arr < case H1.
Variables: T1 T R F VE N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
============================
sim T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))
app_equiv_arr < apply equiv_arr_cond to _ H4.
Variables: T1 T R F VE N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv 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 T1 J V1 V1' ->
equiv (arr T1 T) J V2 V2' ->
sim T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
sim T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))
app_equiv_arr < backchain H10.
Subgoal 1:
Variables: T1 T R F VE N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv 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 T1 J V1 V1' ->
equiv (arr T1 T) J V2 V2' ->
sim T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
equiv T1 K V1 V1'
Subgoal 2 is:
equiv (arr T1 T) K (fix R) (clos' (abs' F) VE)
app_equiv_arr < backchain equiv_closed with K = N2.
Subgoal 1:
Variables: T1 T R F VE N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv 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 T1 J V1 V1' ->
equiv (arr T1 T) J V2 V2' ->
sim T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
le K N2
Subgoal 2 is:
equiv (arr T1 T) K (fix R) (clos' (abs' F) VE)
app_equiv_arr < backchain lt_to_le.
Subgoal 2:
Variables: T1 T R F VE N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv 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 T1 J V1 V1' ->
equiv (arr T1 T) J V2 V2' ->
sim T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
equiv (arr T1 T) K (fix R) (clos' (abs' F) VE)
app_equiv_arr < backchain equiv_closed with K = N1.
Subgoal 2:
Variables: T1 T R F VE N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv 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 T1 J V1 V1' ->
equiv (arr T1 T) J V2 V2' ->
sim T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
le K N1
app_equiv_arr < backchain lt_to_le.
Proof completed.
Abella < Define equiv_arr : ty -> nat -> tm -> tm' -> prop by
equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))).
Abella < Theorem equiv_arr_closed :
forall J K T M M', {is_nat K} -> le J K -> equiv_arr T K M M' ->
equiv_arr T J M M'.
============================
forall J K T M M', {is_nat K} -> le J K -> equiv_arr T K M M' ->
equiv_arr T J M M'
equiv_arr_closed < intros.
Variables: J K T M M'
H1 : {is_nat K}
H2 : le J K
H3 : equiv_arr T K M M'
============================
equiv_arr T J M M'
equiv_arr_closed < case H3.
Variables: J K VE R' R T2 T1
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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
equiv_arr (arr T1 T2) J (fix R) (clos' (abs' R') VE)
equiv_arr_closed < unfold.
Subgoal 1:
Variables: J K VE R' R T2 T1
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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 T1 J1 V1 V1' ->
equiv (arr T1 T2) J1 V2 V2' ->
sim T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_closed < search.
Subgoal 2:
Variables: J K VE R' R T2 T1
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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 T1 J1 V1 V1' ->
equiv (arr T1 T2) J1 V2 V2' ->
sim T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_closed < search.
Subgoal 3:
Variables: J K VE R' R T2 T1
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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 T1 J1 V1 V1' ->
equiv (arr T1 T2) J1 V2 V2' ->
sim T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_closed < search.
Subgoal 4:
Variables: J K VE R' R T2 T1
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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
forall J1 V1 V1' V2 V2', lt J1 J -> equiv T1 J1 V1 V1' ->
equiv (arr T1 T2) J1 V2 V2' ->
sim T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_closed < intros.
Subgoal 4:
Variables: J K VE R' R T2 T1 J1 V1 V1' V2 V2'
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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : lt J1 J
H9 : equiv T1 J1 V1 V1'
H10 : equiv (arr T1 T2) J1 V2 V2'
============================
sim T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_closed < apply lt_le_compose to H8 H2.
Subgoal 4:
Variables: J K VE R' R T2 T1 J1 V1 V1' V2 V2'
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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : lt J1 J
H9 : equiv T1 J1 V1 V1'
H10 : equiv (arr T1 T2) J1 V2 V2'
H11 : lt J1 K
============================
sim T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_closed < apply H7 to _ H9 H10.
Subgoal 4:
Variables: J K VE R' R T2 T1 J1 V1 V1' V2 V2'
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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : lt J1 J
H9 : equiv T1 J1 V1 V1'
H10 : equiv (arr T1 T2) J1 V2 V2'
H11 : lt J1 K
H12 : sim T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
sim T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_closed < search.
Proof completed.
Abella < Theorem equiv_arr_to_equiv :
forall T K M M', {is_nat K} -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'.
============================
forall T K M M', {is_nat K} -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
equiv_arr_to_equiv < induction on 1.
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
============================
forall T K M M', {is_nat K}@ -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
equiv_arr_to_equiv < intros.
Variables: T K M M'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H1 : {is_nat K}@
H2 : {is_sty T}
H3 : equiv_arr T K M M'
============================
equiv T K M M'
equiv_arr_to_equiv < case H3 (keep).
Variables: K VE R' R T2 T1
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H1 : {is_nat K}@
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
equiv (arr T1 T2) K (fix R) (clos' (abs' R') VE)
equiv_arr_to_equiv < case H1.
Subgoal 1:
Variables: VE R' R T2 T1
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
equiv (arr T1 T2) z (fix R) (clos' (abs' R') VE)
Subgoal 2 is:
equiv (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
equiv_arr_to_equiv < search.
Subgoal 2:
Variables: VE R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
equiv (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
equiv_arr_to_equiv < unfold.
Subgoal 2.1:
Variables: VE R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
equiv (arr T1 T2) N (fix R) (clos' (abs' R') VE)
Subgoal 2.2 is:
forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_to_equiv < apply equiv_arr_closed to _ _ H3 with J = N.
Subgoal 2.1.1:
Variables: VE R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
le N (s N)
Subgoal 2.1 is:
equiv (arr T1 T2) N (fix R) (clos' (abs' R') VE)
Subgoal 2.2 is:
forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_to_equiv < backchain le_succ.
Subgoal 2.1.1:
Variables: VE R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
le N N
Subgoal 2.1 is:
equiv (arr T1 T2) N (fix R) (clos' (abs' R') VE)
Subgoal 2.2 is:
forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_to_equiv < backchain le_refl.
Subgoal 2.1:
Variables: VE R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_arr (arr T1 T2) N (fix R) (clos' (abs' R') VE)
============================
equiv (arr T1 T2) N (fix R) (clos' (abs' R') VE)
Subgoal 2.2 is:
forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_to_equiv < apply IH to H8 _ H9.
Subgoal 2.1:
Variables: VE R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_arr (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H10 : equiv (arr T1 T2) N (fix R) (clos' (abs' R') VE)
============================
equiv (arr T1 T2) N (fix R) (clos' (abs' R') VE)
Subgoal 2.2 is:
forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_to_equiv < search.
Subgoal 2.2:
Variables: VE R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
forall V1 V1' V2 V2', equiv T1 N V1 V1' -> equiv (arr T1 T2) N V2 V2' ->
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_to_equiv < intros.
Subgoal 2.2:
Variables: VE R' R T2 T1 N V1 V1' V2 V2'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv T1 N V1 V1'
H10 : equiv (arr T1 T2) N V2 V2'
============================
sim T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
equiv_arr_to_equiv < backchain H7.
Subgoal 2.2:
Variables: VE R' R T2 T1 N V1 V1' V2 V2'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv T1 N V1 V1'
H10 : equiv (arr T1 T2) N V2 V2'
============================
lt N (s N)
equiv_arr_to_equiv < unfold.
Subgoal 2.2:
Variables: VE R' R T2 T1 N V1 V1' V2 V2'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv T1 N V1 V1'
H10 : equiv (arr T1 T2) N V2 V2'
============================
exists N1, {add N (s N1) (s N)}
equiv_arr_to_equiv < exists z.
Subgoal 2.2:
Variables: VE R' R T2 T1 N V1 V1' V2 V2'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_arr T K M M' ->
equiv T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv T1 N V1 V1'
H10 : equiv (arr T1 T2) N V2 V2'
============================
{add N (s z) (s N)}
equiv_arr_to_equiv < backchain add_comm.
Proof completed.
Abella < Theorem sim_val_tm' :
forall V T K M' V', {val V} -> {eval' M' V'} -> equiv T K V V' ->
sim T K V M'.
============================
forall V T K M' V', {val V} -> {eval' M' V'} -> equiv T K V V' ->
sim T K V M'
sim_val_tm' < intros.
Variables: V T K M' V'
H1 : {val V}
H2 : {eval' M' V'}
H3 : equiv T K V V'
============================
sim T K V M'
sim_val_tm' < unfold.
Variables: V T K M' V'
H1 : {val V}
H2 : {eval' M' V'}
H3 : equiv 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 T N V1 V')
sim_val_tm' < intros.
Variables: V T K M' V' J V1
H1 : {val V}
H2 : {eval' M' V'}
H3 : equiv 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 T N V1 V'
sim_val_tm' < apply nstep_val_inv to H1 H5.
Variables: T K M' V' V1
H1 : {val V1}
H2 : {eval' M' V'}
H3 : equiv 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 T N V1 V'
sim_val_tm' < search.
Proof completed.
Abella < Theorem sim_nat :
forall K N, sim tnat K (nat N) (nat' N).
============================
forall K N, sim tnat K (nat N) (nat' N)
sim_nat < intros.
Variables: K N
============================
sim tnat K (nat N) (nat' N)
sim_nat < unfold.
Variables: K N
============================
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 tnat N1 V V')
sim_nat < intros.
Variables: K N J V
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 tnat N1 V V'
sim_nat < apply nstep_val_inv to _ H2.
Variables: K N
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 tnat N1 (nat N) V'
sim_nat < search.
Proof completed.
Abella < Theorem sim_pred :
forall K M M', sim tnat K M M' -> sim tnat K (pred M) (pred' M').
============================
forall K M M', sim tnat K M M' -> sim tnat K (pred M) (pred' M')
sim_pred < intros.
Variables: K M M'
H1 : sim tnat K M M'
============================
sim tnat K (pred M) (pred' M')
sim_pred < case H1.
Variables: K M M'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv tnat N V V')
============================
sim tnat K (pred M) (pred' M')
sim_pred < unfold.
Variables: K M M'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv 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 tnat N V V')
sim_pred < intros.
Variables: K M M' J V
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv 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 tnat N V V'
sim_pred < apply nstep_pred_inv to H5 H4.
Variables: K M M' J1 N N'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv 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 tnat N (nat N') V'
sim_pred < case H3.
Variables: K M M' J1 N N' N1
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
(exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv 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 tnat N (nat N') V'
sim_pred < case H8.
Variables: M M' J1 N N' N1 N3
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 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 tnat N (nat N') V'
sim_pred < assert {add J1 (s N1) (s N3)}.
Subgoal 1:
Variables: M M' J1 N N' N1 N3
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 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 tnat N (nat N') V'
sim_pred < backchain add_s.
Variables: M M' J1 N N' N1 N3
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 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 tnat N (nat N') V'
sim_pred < apply H2 to _ H6 _ with J = J1.
Variables: M M' J1 N N' N1 N3 V' N2
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 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 tnat N2 (nat N) V'
============================
exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
equiv tnat N (nat N') V'
sim_pred < case H13.
Variables: M M' J1 N N' N1 N3 N2
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 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 tnat N (nat N') V'
sim_pred < exists nat' N'.
Variables: M M' J1 N N' N1 N3 N2
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 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 tnat N (nat N') (nat' N')
sim_pred < exists N1.
Variables: M M' J1 N N' N1 N3 N2
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 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 tnat N1 (nat N') (nat' N')
sim_pred < split.
Subgoal 2:
Variables: M M' J1 N N' N1 N3 N2
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 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 tnat N1 (nat N') (nat' N')
sim_pred < backchain eval'_pred_fwd.
Subgoal 3:
Variables: M M' J1 N N' N1 N3 N2
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 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 tnat N1 (nat N') (nat' N')
sim_pred < search.
Subgoal 4:
Variables: M M' J1 N N' N1 N3 N2
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 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 tnat N1 (nat N') (nat' N')
sim_pred < search.
Proof completed.
Abella < Theorem sim_plus :
forall K M1 M2 M1' M2', {is_nat K} -> sim tnat K M1 M1' ->
sim tnat K M2 M2' -> sim tnat K (plus M1 M2) (plus' M1' M2').
============================
forall K M1 M2 M1' M2', {is_nat K} -> sim tnat K M1 M1' ->
sim tnat K M2 M2' -> sim tnat K (plus M1 M2) (plus' M1' M2')
sim_plus < intros.
Variables: K M1 M2 M1' M2'
H1 : {is_nat K}
H2 : sim tnat K M1 M1'
H3 : sim tnat K M2 M2'
============================
sim tnat K (plus M1 M2) (plus' M1' M2')
sim_plus < unfold.
Variables: K M1 M2 M1' M2'
H1 : {is_nat K}
H2 : sim tnat K M1 M1'
H3 : sim 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 tnat N V V')
sim_plus < intros.
Variables: K M1 M2 M1' M2' J V
H1 : {is_nat K}
H2 : sim tnat K M1 M1'
H3 : sim 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 tnat N V V'
sim_plus < apply nstep_plus_inv to H6 H5.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H2 : sim tnat K M1 M1'
H3 : sim 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 tnat N (nat N3) V'
sim_plus < assert le J1 K.
Subgoal 1:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H2 : sim tnat K M1 M1'
H3 : sim 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 tnat N (nat N3) V'
sim_plus < apply add_s to H7.
Subgoal 1:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H2 : sim tnat K M1 M1'
H3 : sim 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 tnat N (nat N3) V'
sim_plus < apply le_trans to _ H4.
Subgoal 1:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H2 : sim tnat K M1 M1'
H3 : sim 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 tnat N (nat N3) V'
sim_plus < search.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H2 : sim tnat K M1 M1'
H3 : sim 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 tnat N (nat N3) V'
sim_plus < case H2.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H3 : sim 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 tnat N V V')
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv tnat N (nat N3) V'
sim_plus < apply H12 to H11 H8 _.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 V' N
H1 : {is_nat K}
H3 : sim 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 tnat N V V')
H13 : {eval' M1' V'}
H14 : {add J1 N K}
H15 : equiv tnat N (nat N1) V'
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv tnat N (nat N3) V'
sim_plus < case H15.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim 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 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 tnat N (nat N3) V'
sim_plus < assert le J2 K.
Subgoal 2:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim 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 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 tnat N (nat N3) V'
sim_plus < apply add_comm to _ H7.
Subgoal 2.1:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim 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 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 tnat N (nat N3) V'
sim_plus < case H4.
Subgoal 2.1:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N N4
H1 : {is_nat K}
H3 : sim 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 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 tnat N (nat N3) V'
sim_plus < apply add_arg1_isnat to H16.
Subgoal 2.1:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N N4
H1 : {is_nat K}
H3 : sim 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 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 tnat N (nat N3) V'
sim_plus < case H17.
Subgoal 2.1:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N N4
H1 : {is_nat K}
H3 : sim 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 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 tnat N (nat N3) V'
sim_plus < search.
Subgoal 2:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim 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 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 tnat N (nat N3) V'
sim_plus < apply add_s to H16.
Subgoal 2:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim 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 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 tnat N (nat N3) V'
sim_plus < apply le_trans to _ H4.
Subgoal 2:
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim 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 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 tnat N (nat N3) V'
sim_plus < search.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim 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 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 tnat N (nat N3) V'
sim_plus < case H3.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N
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 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 tnat N V V')
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv tnat N (nat N3) V'
sim_plus < apply H17 to H16 H9 _.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N V'1 N4
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 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 tnat N V V')
H18 : {eval' M2' V'1}
H19 : {add J2 N4 K}
H20 : equiv tnat N4 (nat N2) V'1
============================
exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
equiv tnat N (nat N3) V'
sim_plus < case H20.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N N4
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 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 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 tnat N (nat N3) V'
sim_plus < apply eval'_plus_fwd to H13 H18 H10.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N N4
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 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 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 tnat N (nat N3) V'
sim_plus < case H4.
Variables: K M1 M2 M1' M2' J1 J2 J12 N1 N2 N3 N N4 N5
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 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 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 tnat N (nat N3) V'
sim_plus < search.
Proof completed.
Abella < Theorem sim_ifz :
forall K T M M1 M2 M' M1' M2', {is_nat K} -> {is_sty T} -> sim tnat K M M' ->
sim T K M1 M1' -> sim T K M2 M2' -> sim 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 tnat K M M' -> sim T K M1 M1' -> sim T K M2 M2' ->
sim T K (ifz M M1 M2) (ifz' M' M1' M2')
sim_ifz < intros.
Variables: K T M M1 M2 M' M1' M2'
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim tnat K M M'
H4 : sim T K M1 M1'
H5 : sim T K M2 M2'
============================
sim T K (ifz M M1 M2) (ifz' M' M1' M2')
sim_ifz < unfold.
Variables: K T M M1 M2 M' M1' M2'
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim tnat K M M'
H4 : sim T K M1 M1'
H5 : sim 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 T N V V')
sim_ifz < intros.
Variables: K T M M1 M2 M' M1' M2' J V
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim tnat K M M'
H4 : sim T K M1 M1'
H5 : sim 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 T N V V'
sim_ifz < apply nstep_ifz_inv to _ _ H7.
Subgoal 1:
Variables: K T M M1 M2 M' M1' M2' J V
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim tnat K M M'
H4 : sim T K M1 M1'
H5 : sim 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 T N V V'
sim_ifz < case H6.
Subgoal 1:
Variables: K T M M1 M2 M' M1' M2' J V N
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim tnat K M M'
H4 : sim T K M1 M1'
H5 : sim 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 T N V V'
sim_ifz < backchain add_arg1_isnat.
Variables: K T M M1 M2 M' M1' M2' J V I J1 N
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim tnat K M M'
H4 : sim T K M1 M1'
H5 : sim 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 T N V V'
sim_ifz < case H11.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim tnat K M M'
H4 : sim T K M1 M1'
H5 : sim 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 T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < apply le_trans to H9 H6.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim tnat K M M'
H4 : sim T K M1 M1'
H5 : sim 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 T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < case H3.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim T K M1 M1'
H5 : sim 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 tnat N V V')
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < apply H15 to _ H12 _.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim T K M1 M1'
H5 : sim 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 tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv tnat N1 (nat z) V'
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < apply le_trans to H10 H6.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim T K M1 M1'
H5 : sim 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 tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv tnat N1 (nat z) V'
H19 : le I K
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < case H4.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv 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 T N V V')
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < apply H20 to _ H13 _.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < case H18.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < case H6.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < exists V'1.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
exists N, {eval' (ifz' M' M1' M2') V'1} /\ {add J N K} /\ equiv T N V V'1
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < exists N3.
Subgoal 2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
{eval' (ifz' M' M1' M2') V'1} /\ {add J N3 K} /\ equiv T N3 V V'1
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < split.
Subgoal 2.1:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv 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 T N3 V V'1
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < backchain eval'_ifz_fwd1.
Subgoal 2.2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
{add J N3 K}
Subgoal 2.3 is:
equiv T N3 V V'1
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < search.
Subgoal 2.3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
equiv T N3 V V'1
Subgoal 3 is:
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < backchain equiv_closed with K = N2.
Subgoal 2.3.1:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv 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 T N V V'
sim_ifz < backchain add_arg2_isnat.
Subgoal 2.3.2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv 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 T N V V'
sim_ifz < backchain add_le_complement with N = K, N1 = I, N1' = J.
Subgoal 2.3.2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim 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 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 T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv 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 T N V V'
sim_ifz < backchain add_arg2_isnat.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim tnat K M M'
H4 : sim T K M1 M1'
H5 : sim 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 T N V V'
sim_ifz < apply le_trans to H9 H6.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim tnat K M M'
H4 : sim T K M1 M1'
H5 : sim 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 T N V V'
sim_ifz < case H3.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim T K M1 M1'
H5 : sim 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 tnat N V V')
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < apply H15 to _ H12 _.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim T K M1 M1'
H5 : sim 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 tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv tnat N1 (nat (s N)) V'
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < apply le_trans to H10 H6.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim T K M1 M1'
H5 : sim 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 tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv tnat N1 (nat (s N)) V'
H19 : le I K
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < case H5.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv 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 T N V V')
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < apply H20 to _ H13 _.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < case H18.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < case H6.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\ equiv T N V V'
sim_ifz < exists V'1.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
exists N, {eval' (ifz' M' M1' M2') V'1} /\ {add J N K} /\ equiv T N V V'1
sim_ifz < exists N3.
Subgoal 3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
{eval' (ifz' M' M1' M2') V'1} /\ {add J N3 K} /\ equiv T N3 V V'1
sim_ifz < split.
Subgoal 3.1:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv 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 T N3 V V'1
sim_ifz < backchain eval'_ifz_fwd2.
Subgoal 3.2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
{add J N3 K}
Subgoal 3.3 is:
equiv T N3 V V'1
sim_ifz < search.
Subgoal 3.3:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
equiv T N3 V V'1
sim_ifz < backchain equiv_closed with K = N2.
Subgoal 3.3.1:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
{is_nat N2}
Subgoal 3.3.2 is:
le N3 N2
sim_ifz < backchain add_arg2_isnat.
Subgoal 3.3.2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
le N3 N2
sim_ifz < backchain add_le_complement with N = K, N1 = I, N1' = J.
Subgoal 3.3.2:
Variables: K T M M1 M2 M' M1' M2' J V I J1 N N1 V'1 N2 N3
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim 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 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 T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv T N2 V V'1
H24 : {add J N3 K}
============================
{is_nat N2}
sim_ifz < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_unit :
forall K, sim tunit K unit unit'.
============================
forall K, sim tunit K unit unit'
sim_unit < intros.
Variables: K
============================
sim tunit K unit unit'
sim_unit < unfold.
Variables: K
============================
forall J V, le J K -> {nstep J unit V} -> {val V} ->
(exists V' N, {eval' unit' V'} /\ {add J N K} /\ equiv tunit N V V')
sim_unit < intros.
Variables: K J V
H1 : le J K
H2 : {nstep J unit V}
H3 : {val V}
============================
exists V' N, {eval' unit' V'} /\ {add J N K} /\ equiv tunit N V V'
sim_unit < apply nstep_val_inv to _ H2.
Variables: K
H1 : le z K
H2 : {nstep z unit unit}
H3 : {val unit}
============================
exists V' N, {eval' unit' V'} /\ {add z N K} /\ equiv tunit N unit V'
sim_unit < search.
Proof completed.
Abella < Theorem sim_pair :
forall T1 T2 K M1 M2 M1' M2', {is_nat K} -> {is_sty T1} -> {is_sty T2} ->
sim T1 K M1 M1' -> sim T2 K M2 M2' ->
sim (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 T1 K M1 M1' -> sim T2 K M2 M2' ->
sim (prod T1 T2) K (pair M1 M2) (pair' M1' M2')
sim_pair < intros.
Variables: T1 T2 K M1 M2 M1' M2'
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim T1 K M1 M1'
H5 : sim T2 K M2 M2'
============================
sim (prod T1 T2) K (pair M1 M2) (pair' M1' M2')
sim_pair < unfold.
Variables: T1 T2 K M1 M2 M1' M2'
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim T1 K M1 M1'
H5 : sim 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 (prod T1 T2) N V V')
sim_pair < intros.
Variables: T1 T2 K M1 M2 M1' M2' J V
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim T1 K M1 M1'
H5 : sim 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 (prod T1 T2) N V V'
sim_pair < apply nstep_pair_inv to _ H7.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim T1 K M1 M1'
H5 : sim 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 (prod T1 T2) N (pair V1 V2) V'
sim_pair < case H8.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim T1 K M1 M1'
H5 : sim 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 (prod T1 T2) N (pair V1 V2) V'
sim_pair < case H6 (keep).
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim T1 K M1 M1'
H5 : sim 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 (prod T1 T2) N (pair V1 V2) V'
sim_pair < apply le_trans to _ H6.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim T1 K M1 M1'
H5 : sim 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 (prod T1 T2) N (pair V1 V2) V'
sim_pair < case H4.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim 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 T1 N V V')
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv (prod T1 T2) N (pair V1 V2) V'
sim_pair < apply H16 to _ H10 _.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim 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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv T1 N1 V1 V'
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv (prod T1 T2) N (pair V1 V2) V'
sim_pair < assert le J1 J.
Subgoal 1:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim 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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv T1 N1 V1 V'
============================
le J1 J
Subgoal is:
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv (prod T1 T2) N (pair V1 V2) V'
sim_pair < unfold.
Subgoal 1:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim 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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 (prod T1 T2) N (pair V1 V2) V'
sim_pair < exists I.
Subgoal 1:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim 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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv T1 N1 V1 V'
============================
{add J1 I J}
Subgoal is:
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv (prod T1 T2) N (pair V1 V2) V'
sim_pair < backchain add_comm.
Subgoal 1:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim 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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv T1 N1 V1 V'
============================
{is_nat J}
Subgoal is:
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv (prod T1 T2) N (pair V1 V2) V'
sim_pair < backchain add_arg1_isnat.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim 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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv T1 N1 V1 V'
H20 : le J1 J
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv (prod T1 T2) N (pair V1 V2) V'
sim_pair < apply le_trans to H20 H6.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim 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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 (prod T1 T2) N (pair V1 V2) V'
sim_pair < case H5.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv (prod T1 T2) N (pair V1 V2) V'
sim_pair < apply H22 to _ H11 _.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
equiv (prod T1 T2) N (pair V1 V2) V'
sim_pair < exists pair' V' V'1.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
exists N, {eval' (pair' M1' M2') (pair' V' V'1)} /\ {add J N K} /\
equiv (prod T1 T2) N (pair V1 V2) (pair' V' V'1)
sim_pair < exists N.
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
{eval' (pair' M1' M2') (pair' V' V'1)} /\ {add J N K} /\
equiv (prod T1 T2) N (pair V1 V2) (pair' V' V'1)
sim_pair < split.
Subgoal 2:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
{eval' (pair' M1' M2') (pair' V' V'1)}
Subgoal 3 is:
{add J N K}
Subgoal 4 is:
equiv (prod T1 T2) N (pair V1 V2) (pair' V' V'1)
sim_pair < backchain eval'_pair_fwd.
Subgoal 3:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
{add J N K}
Subgoal 4 is:
equiv (prod T1 T2) N (pair V1 V2) (pair' V' V'1)
sim_pair < search.
Subgoal 4:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
equiv (prod T1 T2) N (pair V1 V2) (pair' V' V'1)
sim_pair < unfold.
Subgoal 4.1:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
equiv T1 N V1 V'
Subgoal 4.2 is:
equiv T2 N V2 V'1
sim_pair < backchain equiv_closed with K = N1.
Subgoal 4.1.1:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
{is_nat N1}
Subgoal 4.1.2 is:
le N N1
Subgoal 4.2 is:
equiv T2 N V2 V'1
sim_pair < backchain add_arg2_isnat.
Subgoal 4.1.2:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
le N N1
Subgoal 4.2 is:
equiv T2 N V2 V'1
sim_pair < backchain add_le_complement with N = K, N1 = I, N1' = J.
Subgoal 4.1.2:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
{is_nat N1}
Subgoal 4.2 is:
equiv T2 N V2 V'1
sim_pair < backchain add_arg2_isnat.
Subgoal 4.2:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
equiv T2 N V2 V'1
sim_pair < backchain equiv_closed with K = N2.
Subgoal 4.2.1:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
{is_nat N2}
Subgoal 4.2.2 is:
le N N2
sim_pair < backchain add_arg2_isnat.
Subgoal 4.2.2:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
le N N2
sim_pair < backchain add_le_complement with N = K, N1 = J1, N1' = J.
Subgoal 4.2.2:
Variables: T1 T2 K M1 M2 M1' M2' J I J1 V1 V2 N V' N1 V'1 N2
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 T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv 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 T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv T2 N2 V2 V'1
============================
{is_nat N2}
sim_pair < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_fst :
forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
sim (prod T1 T2) K M M' -> sim T1 K (fst M) (fst' M').
============================
forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
sim (prod T1 T2) K M M' -> sim T1 K (fst M) (fst' M')
sim_fst < intros.
Variables: T1 T2 K M M'
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim (prod T1 T2) K M M'
============================
sim T1 K (fst M) (fst' M')
sim_fst < unfold.
Variables: T1 T2 K M M'
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim (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 T1 N V V')
sim_fst < intros.
Variables: T1 T2 K M M' J V
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim (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 T1 N V V'
sim_fst < apply nstep_fst_inv to H6 H5.
Variables: T1 T2 K M M' V K' V'
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim (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 T1 N V V'
sim_fst < case H3.
Variables: T1 T2 K M M' V K' V'
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 (prod T1 T2) N V V')
============================
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv T1 N V V'
sim_fst < apply H9 to _ H8 _.
Subgoal 1:
Variables: T1 T2 K M M' V K' V'
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 (prod T1 T2) N V V')
============================
le K' K
Subgoal is:
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv T1 N V V'
sim_fst < case H4.
Subgoal 1:
Variables: T1 T2 K M M' V K' V' N
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 (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 T1 N V V'
sim_fst < case H10.
Subgoal 1:
Variables: T1 T2 M M' V K' V' N N3
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 (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 T1 N V V'
sim_fst < apply add_s to H11.
Subgoal 1:
Variables: T1 T2 M M' V K' V' N N3
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 (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 T1 N V V'
sim_fst < search.
Variables: T1 T2 K M M' V K' V' V'1 N
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 (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv (prod T1 T2) N (pair V V') V'1
============================
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv T1 N V V'
sim_fst < case H4.
Variables: T1 T2 K M M' V K' V' V'1 N N1
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 (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv (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 T1 N V V'
sim_fst < case H12.
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
============================
exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv T1 N V V'
sim_fst < exists V1'.
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
============================
exists N, {eval' (fst' M') V1'} /\ {add (s K') N K} /\ equiv T1 N V V1'
sim_fst < exists N1.
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
============================
{eval' (fst' M') V1'} /\ {add (s K') N1 K} /\ equiv T1 N1 V V1'
sim_fst < split.
Subgoal 2:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
============================
{eval' (fst' M') V1'}
Subgoal 3 is:
{add (s K') N1 K}
Subgoal 4 is:
equiv T1 N1 V V1'
sim_fst < backchain eval'_fst_fwd.
Subgoal 3:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
============================
{add (s K') N1 K}
Subgoal 4 is:
equiv T1 N1 V V1'
sim_fst < search.
Subgoal 4:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
============================
equiv T1 N1 V V1'
sim_fst < apply add_le_complement to _ _ H11 H13.
Subgoal 4.1:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
============================
le K' (s K')
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv T1 N1 V V1'
sim_fst < backchain le_succ.
Subgoal 4.1:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
============================
le K' K'
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv T1 N1 V V1'
sim_fst < backchain le_refl.
Subgoal 4.1:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
============================
{is_nat K'}
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv T1 N1 V V1'
sim_fst < backchain add_arg1_isnat.
Subgoal 4.2:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
============================
{is_nat N}
Subgoal 4 is:
equiv T1 N1 V V1'
sim_fst < backchain add_arg2_isnat.
Subgoal 4:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
H16 : le N1 N
============================
equiv T1 N1 V V1'
sim_fst < backchain equiv_closed with K = N.
Subgoal 4.3:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
H16 : le N1 N
============================
{is_sty T1}
Subgoal 4.4 is:
{is_nat N}
sim_fst < case H2.
Subgoal 4.3:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv 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_fst < search.
Subgoal 4.4:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V V1'
H15 : equiv T2 N V' V2'
H16 : le N1 N
============================
{is_nat N}
sim_fst < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_snd :
forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
sim (prod T1 T2) K M M' -> sim T2 K (snd M) (snd' M').
============================
forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
sim (prod T1 T2) K M M' -> sim T2 K (snd M) (snd' M')
sim_snd < intros.
Variables: T1 T2 K M M'
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim (prod T1 T2) K M M'
============================
sim T2 K (snd M) (snd' M')
sim_snd < unfold.
Variables: T1 T2 K M M'
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim (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 T2 N V V')
sim_snd < intros.
Variables: T1 T2 K M M' J V
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim (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 T2 N V V'
sim_snd < apply nstep_snd_inv to H6 H5.
Variables: T1 T2 K M M' V K' V'
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim (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 T2 N V V'
sim_snd < case H3.
Variables: T1 T2 K M M' V K' V'
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 (prod T1 T2) N V V')
============================
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv T2 N V V'
sim_snd < apply H9 to _ H8 _.
Subgoal 1:
Variables: T1 T2 K M M' V K' V'
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 (prod T1 T2) N V V')
============================
le K' K
Subgoal is:
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv T2 N V V'
sim_snd < case H4.
Subgoal 1:
Variables: T1 T2 K M M' V K' V' N
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 (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 T2 N V V'
sim_snd < case H10.
Subgoal 1:
Variables: T1 T2 M M' V K' V' N N3
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 (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 T2 N V V'
sim_snd < apply add_s to H11.
Subgoal 1:
Variables: T1 T2 M M' V K' V' N N3
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 (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 T2 N V V'
sim_snd < search.
Variables: T1 T2 K M M' V K' V' V'1 N
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 (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv (prod T1 T2) N (pair V' V) V'1
============================
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv T2 N V V'
sim_snd < case H4.
Variables: T1 T2 K M M' V K' V' V'1 N N1
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 (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv (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 T2 N V V'
sim_snd < case H12.
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
============================
exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv T2 N V V'
sim_snd < exists V2'.
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
============================
exists N, {eval' (snd' M') V2'} /\ {add (s K') N K} /\ equiv T2 N V V2'
sim_snd < exists N1.
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
============================
{eval' (snd' M') V2'} /\ {add (s K') N1 K} /\ equiv T2 N1 V V2'
sim_snd < split.
Subgoal 2:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
============================
{eval' (snd' M') V2'}
Subgoal 3 is:
{add (s K') N1 K}
Subgoal 4 is:
equiv T2 N1 V V2'
sim_snd < backchain eval'_snd_fwd.
Subgoal 3:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
============================
{add (s K') N1 K}
Subgoal 4 is:
equiv T2 N1 V V2'
sim_snd < search.
Subgoal 4:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
============================
equiv T2 N1 V V2'
sim_snd < apply add_le_complement to _ _ H11 H13.
Subgoal 4.1:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
============================
le K' (s K')
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv T2 N1 V V2'
sim_snd < backchain le_succ.
Subgoal 4.1:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
============================
le K' K'
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv T2 N1 V V2'
sim_snd < backchain le_refl.
Subgoal 4.1:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
============================
{is_nat K'}
Subgoal 4.2 is:
{is_nat N}
Subgoal 4 is:
equiv T2 N1 V V2'
sim_snd < backchain add_arg1_isnat.
Subgoal 4.2:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
============================
{is_nat N}
Subgoal 4 is:
equiv T2 N1 V V2'
sim_snd < backchain add_arg2_isnat.
Subgoal 4:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
H16 : le N1 N
============================
equiv T2 N1 V V2'
sim_snd < backchain equiv_closed with K = N.
Subgoal 4.3:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
H16 : le N1 N
============================
{is_sty T2}
Subgoal 4.4 is:
{is_nat N}
sim_snd < case H2.
Subgoal 4.3:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv 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_snd < search.
Subgoal 4.4:
Variables: T1 T2 K M M' V K' V' N N1 V2' V1'
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 (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 T1 N V' V1'
H15 : equiv T2 N V V2'
H16 : le N1 N
============================
{is_nat N}
sim_snd < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_nstep :
forall T K M M' J I V, sim T K M M' -> {nstep J M V} -> {val V} ->
{add J I K} -> (exists V', {eval' M' V'} /\ equiv T I V V').
============================
forall T K M M' J I V, sim T K M M' -> {nstep J M V} -> {val V} ->
{add J I K} -> (exists V', {eval' M' V'} /\ equiv T I V V')
sim_nstep < intros.
Variables: T K M M' J I V
H1 : sim T K M M'
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
============================
exists V', {eval' M' V'} /\ equiv T I V V'
sim_nstep < case H1.
Variables: T K M M' J I V
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 T N V V')
============================
exists V', {eval' M' V'} /\ equiv T I V V'
sim_nstep < apply H5 to _ H2 H3.
Variables: T K M M' J I V V' N
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 T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv T N V V'
============================
exists V', {eval' M' V'} /\ equiv T I V V'
sim_nstep < exists V'.
Variables: T K M M' J I V V' N
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 T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv T N V V'
============================
{eval' M' V'} /\ equiv T I V V'
sim_nstep < split.
Subgoal 1:
Variables: T K M M' J I V V' N
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 T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv T N V V'
============================
{eval' M' V'}
Subgoal 2 is:
equiv T I V V'
sim_nstep < search.
Subgoal 2:
Variables: T K M M' J I V V' N
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 T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv T N V V'
============================
equiv T I V V'
sim_nstep < assert I = N.
Subgoal 2.1:
Variables: T K M M' J I V V' N
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 T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv T N V V'
============================
I = N
Subgoal 2 is:
equiv T I V V'
sim_nstep < backchain add_arg2_det.
Subgoal 2:
Variables: T K M M' J I V V' N
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 T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv T N V V'
H9 : I = N
============================
equiv T I V V'
sim_nstep < case H9.
Subgoal 2:
Variables: T K M M' J V V' N
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 T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv T N V V'
============================
equiv T N V V'
sim_nstep < search.
Proof completed.
Abella < Theorem sim_closed_nstep' :
forall T K N M M' M1', {nstep' N M1' M'} -> sim T K M M' -> sim T K M M1'.
============================
forall T K N M M' M1', {nstep' N M1' M'} -> sim T K M M' -> sim T K M M1'
sim_closed_nstep' < intros.
Variables: T K N M M' M1'
H1 : {nstep' N M1' M'}
H2 : sim T K M M'
============================
sim T K M M1'
sim_closed_nstep' < unfold.
Variables: T K N M M' M1'
H1 : {nstep' N M1' M'}
H2 : sim 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 T N V V')
sim_closed_nstep' < intros.
Variables: T K N M M' M1' J V
H1 : {nstep' N M1' M'}
H2 : sim 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 T N V V'
sim_closed_nstep' < case H3.
Variables: T K N M M' M1' J V N1
H1 : {nstep' N M1' M'}
H2 : sim 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 T N V V'
sim_closed_nstep' < apply sim_nstep to H2 H4 _ _.
Variables: T K N M M' M1' J V N1 V'
H1 : {nstep' N M1' M'}
H2 : sim T K M M'
H4 : {nstep J M V}
H5 : {val V}
H6 : {add J N1 K}
H7 : {eval' M' V'}
H8 : equiv T N1 V V'
============================
exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv T N V V'
sim_closed_nstep' < apply nstep'_eval_closed to _ H7.
Variables: T K N M M' M1' J V N1 V'
H1 : {nstep' N M1' M'}
H2 : sim T K M M'
H4 : {nstep J M V}
H5 : {val V}
H6 : {add J N1 K}
H7 : {eval' M' V'}
H8 : equiv T N1 V V'
H9 : {eval' M1' V'}
============================
exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv T N V V'
sim_closed_nstep' < search.
Proof completed.
Abella < Theorem sim_app :
forall T1 T K M1 M1' M2 M2', {is_nat K} -> {is_sty (arr T1 T)} ->
sim (arr T1 T) K M1 M1' -> sim T1 K M2 M2' ->
sim 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 (arr T1 T) K M1 M1' -> sim T1 K M2 M2' ->
sim T K (app M1 M2)
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
sim_app < intros.
Variables: T1 T K M1 M1' M2 M2'
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) K M1 M1'
H4 : sim T1 K M2 M2'
============================
sim T K (app M1 M2)
(let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
sim_app < unfold.
Variables: T1 T K M1 M1' M2 M2'
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) K M1 M1'
H4 : sim 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 T N V V')
sim_app < intros.
Variables: T1 T K M1 M1' M2 M2' J V
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) K M1 M1'
H4 : sim 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 T N V V'
sim_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: T1 T K M1 M1' M2 M2' J V
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) K M1 M1'
H4 : sim 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 T N V V'
sim_app < backchain nstep_app_inv.
Variables: T1 T K M1 M1' M2 M2' J V
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) K M1 M1'
H4 : sim 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 T N V V'
sim_app < case H8.
Variables: T1 T K M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) K M1 M1'
H4 : sim 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 T N V V'
sim_app < case H5.
Variables: T1 T K M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) K M1 M1'
H4 : sim 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 T N V V'
sim_app < case H15.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 T N V V'
sim_app < assert exists N1, {add J1 N1 N3}.
Subgoal 2:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 T N V V'
sim_app < backchain k_minus_n1.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 T N V V'
sim_app < case H17.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 T N V V'
sim_app < assert exists N2, {add J2 N2 N3}.
Subgoal 3:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 T N V V'
sim_app < backchain k_minus_n2.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 T N V V'
sim_app < case H19.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 T N V V'
sim_app < assert exists V1', {eval' M1' V1'} /\ equiv (arr T1 T) (s N1) (fix R) V1'.
Subgoal 4:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (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 T N V V'
sim_app < backchain sim_nstep.
Subgoal 4:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 T N V V'
sim_app < backchain add_s.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (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 T N V V'
sim_app < case H21.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (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 T N V V'
sim_app < assert exists V2', {eval' M2' V2'} /\ equiv T1 (s N2) V2 V2'.
Subgoal 5:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
============================
exists V2', {eval' M2' V2'} /\ equiv 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 T N V V'
sim_app < backchain sim_nstep.
Subgoal 5:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (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 T N V V'
sim_app < backchain add_s.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H24 : exists V2', {eval' M2' V2'} /\ equiv 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 T N V V'
sim_app < case H24.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < assert exists K' J12, {add J1 J2 J12} /\ {add J3 N K'} /\ {add J12 K' N3}.
Subgoal 6:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < backchain k_minus_n12.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < case H27.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < assert lt K' (s N1).
Subgoal 7:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < backchain sum_complement_to_lt1 with N1 = J1, N2 = J2, N = N3.
Subgoal 7:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < case H1.
Subgoal 7:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < search.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < assert lt K' (s N2).
Subgoal 8:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < backchain sum_complement_to_lt2 with N1 = J1, N2 = J2, N = N3.
Subgoal 8:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < case H1.
Subgoal 8:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < search.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < apply equiv_arr_val' to _ H23.
Subgoal 9:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < assert {is_nat N1}.
Subgoal 9.1:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < backchain add_arg2_isnat.
Subgoal 9:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V1' V2' K'
J12
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < search.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < assert sim T K' (R (fix R) V2) (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))).
Subgoal 10:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 T N V V'
sim_app < backchain app_equiv_arr with T1 = T1, N1 = s N1, N2 = s N2, R = R, F = R'.
Subgoal 10.1:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < assert {is_nat N1}.
Subgoal 10.1.1:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < backchain add_arg2_isnat.
Subgoal 10.1:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < search.
Subgoal 10.2:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < assert {is_nat N2}.
Subgoal 10.2.1:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < backchain add_arg2_isnat.
Subgoal 10.2:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 T N V V'
sim_app < search.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 T N V V'
sim_app < assert exists V', {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'} /\
equiv T N V V'.
Subgoal 11:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 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 T N V V'
sim_app < backchain sim_nstep.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 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 T N V V'
sim_app < case H35.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE V'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 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 T N V V'
sim_app < exists V'.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE V'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 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 T N V V'
sim_app < exists N.
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE V'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 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 T N V V'
sim_app < split.
Subgoal 12:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE V'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 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 T N V V'
sim_app < apply eval'_open_fwd to _ H25 H36 with R = R', M1 = clos' (abs' R') VE.
Subgoal 12:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE V'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 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 T N V V'
sim_app < backchain eval'_let_fwd with R = g\open' g (f\e\app' f (pair' g (pair' M2' e))).
Subgoal 13:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE V'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 T N V V'
============================
{add (s J123) N (s N3)}
Subgoal 14 is:
equiv T N V V'
sim_app < search.
Subgoal 14:
Variables: T1 T M1 M1' M2 M2' V J1 J2 J3 J23 J123 V2 R N N3 N1 N2 V2' K' J12
R' VE V'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim (arr T1 T) (s N3) M1 M1'
H4 : sim 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 (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv 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 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 T N V V'
============================
equiv T N V V'
sim_app < search.
Proof completed.
Abella < Define subst_env_equiv : olist -> nat -> smap_list -> tm' -> prop by
subst_env_equiv nil K ML unit';
subst_env_equiv (of X T :: L) K ML (pair' V' VE) := exists V, subst_env_equiv L K ML VE /\ smmember (smap X V) ML /\
equiv T K V V'.
Abella < Define subst_equiv : olist -> nat -> smap_list -> cmap_list -> prop by
nabla e, subst_equiv L K ML (cmcons (cmap e VE) cmnil) := subst_env_equiv L K ML VE;
nabla x y, subst_equiv (of x T :: L) K (smcons (smap x V) ML) (cmcons (cmap y V') ML') := equiv T K V V' /\ subst_equiv L K ML ML'.
Abella < Theorem subst_env_equiv_closed :
forall L K J ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE ->
le J K -> subst_env_equiv L J ML VE.
============================
forall L K J ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE ->
le J K -> subst_env_equiv L J ML VE
subst_env_equiv_closed < induction on 3.
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
============================
forall L K J ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE @ ->
le J K -> subst_env_equiv L J ML VE
subst_env_equiv_closed < intros.
Variables: L K J ML VE
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H2 : ctx L
H3 : subst_env_equiv L K ML VE @
H4 : le J K
============================
subst_env_equiv L J ML VE
subst_env_equiv_closed < case H3.
Subgoal 1:
Variables: K J ML
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H2 : ctx nil
H4 : le J K
============================
subst_env_equiv nil J ML unit'
Subgoal 2 is:
subst_env_equiv (of X T :: L1) J ML (pair' V' VE1)
subst_env_equiv_closed < search.
Subgoal 2:
Variables: K J ML V VE1 V' L1 T X
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv L1 K ML VE1 *
H6 : smmember (smap X V) ML
H7 : equiv T K V V'
============================
subst_env_equiv (of X T :: L1) J ML (pair' V' VE1)
subst_env_equiv_closed < unfold.
Subgoal 2:
Variables: K J ML V VE1 V' L1 T X
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv L1 K ML VE1 *
H6 : smmember (smap X V) ML
H7 : equiv T K V V'
============================
exists V, subst_env_equiv L1 J ML VE1 /\ smmember (smap X V) ML /\
equiv T J V V'
subst_env_equiv_closed < exists V.
Subgoal 2:
Variables: K J ML V VE1 V' L1 T X
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv L1 K ML VE1 *
H6 : smmember (smap X V) ML
H7 : equiv T K V V'
============================
subst_env_equiv L1 J ML VE1 /\ smmember (smap X V) ML /\ equiv T J V V'
subst_env_equiv_closed < split.
Subgoal 2.1:
Variables: K J ML V VE1 V' L1 T X
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv L1 K ML VE1 *
H6 : smmember (smap X V) ML
H7 : equiv T K V V'
============================
subst_env_equiv L1 J ML VE1
Subgoal 2.2 is:
smmember (smap X V) ML
Subgoal 2.3 is:
equiv T J V V'
subst_env_equiv_closed < backchain IH.
Subgoal 2.1:
Variables: K J ML V VE1 V' L1 T X
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv L1 K ML VE1 *
H6 : smmember (smap X V) ML
H7 : equiv T K V V'
============================
ctx L1
Subgoal 2.2 is:
smmember (smap X V) ML
Subgoal 2.3 is:
equiv T J V V'
subst_env_equiv_closed < case H2.
Subgoal 2.1:
Variables: K J ML V VE1 V' L1 T X
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H4 : le J K
H5 : subst_env_equiv L1 K ML VE1 *
H6 : smmember (smap X V) ML
H7 : equiv 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:
smmember (smap X V) ML
Subgoal 2.3 is:
equiv T J V V'
subst_env_equiv_closed < search.
Subgoal 2.2:
Variables: K J ML V VE1 V' L1 T X
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv L1 K ML VE1 *
H6 : smmember (smap X V) ML
H7 : equiv T K V V'
============================
smmember (smap X V) ML
Subgoal 2.3 is:
equiv T J V V'
subst_env_equiv_closed < search.
Subgoal 2.3:
Variables: K J ML V VE1 V' L1 T X
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv L1 K ML VE1 *
H6 : smmember (smap X V) ML
H7 : equiv T K V V'
============================
equiv T J V V'
subst_env_equiv_closed < backchain equiv_closed with K = K.
Subgoal 2.3:
Variables: K J ML V VE1 V' L1 T X
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv L1 K ML VE1 *
H6 : smmember (smap X V) ML
H7 : equiv T K V V'
============================
{is_sty T}
subst_env_equiv_closed < case H2.
Subgoal 2.3:
Variables: K J ML V VE1 V' L1 T X
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
subst_env_equiv L K ML VE * -> le J K -> subst_env_equiv L J ML VE
H1 : {is_nat K}
H4 : le J K
H5 : subst_env_equiv L1 K ML VE1 *
H6 : smmember (smap X V) ML
H7 : equiv 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_closed < search.
Proof completed.
Abella < Theorem subst_equiv_closed :
forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' ->
le J K -> subst_equiv L J ML ML'.
============================
forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' ->
le J K -> subst_equiv L J ML ML'
subst_equiv_closed < induction on 3.
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
============================
forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' @ ->
le J K -> subst_equiv L J ML ML'
subst_equiv_closed < intros.
Variables: L K J ML ML'
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
H1 : {is_nat K}
H2 : ctx L
H3 : subst_equiv L K ML ML' @
H4 : le J K
============================
subst_equiv L J ML ML'
subst_equiv_closed < case H3.
Subgoal 1:
Variables: K J VE ML1 L1
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
H1 : {is_nat K}
H2 : ctx L1
H4 : le J K
H5 : subst_env_equiv L1 K ML1 VE
============================
subst_equiv L1 J ML1 (cmcons (cmap n1 VE) cmnil)
Subgoal 2 is:
subst_equiv (of n1 T :: L1) J (smcons (smap n1 V) ML1)
(cmcons (cmap n2 V') ML'1)
subst_equiv_closed < unfold.
Subgoal 1:
Variables: K J VE ML1 L1
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
H1 : {is_nat K}
H2 : ctx L1
H4 : le J K
H5 : subst_env_equiv L1 K ML1 VE
============================
subst_env_equiv L1 J ML1 VE
Subgoal 2 is:
subst_equiv (of n1 T :: L1) J (smcons (smap n1 V) ML1)
(cmcons (cmap n2 V') ML'1)
subst_equiv_closed < backchain subst_env_equiv_closed.
Subgoal 2:
Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
H1 : {is_nat K}
H2 : ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv T K V V'
H6 : subst_equiv L1 K ML1 ML'1 *
============================
subst_equiv (of n1 T :: L1) J (smcons (smap n1 V) ML1)
(cmcons (cmap n2 V') ML'1)
subst_equiv_closed < unfold.
Subgoal 2.1:
Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
H1 : {is_nat K}
H2 : ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv T K V V'
H6 : subst_equiv L1 K ML1 ML'1 *
============================
equiv T J V V'
Subgoal 2.2 is:
subst_equiv L1 J ML1 ML'1
subst_equiv_closed < backchain equiv_closed.
Subgoal 2.1:
Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
H1 : {is_nat K}
H2 : ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv T K V V'
H6 : subst_equiv L1 K ML1 ML'1 *
============================
{is_sty T}
Subgoal 2.2 is:
subst_equiv L1 J ML1 ML'1
subst_equiv_closed < case H2.
Subgoal 2.1:
Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
H1 : {is_nat K}
H4 : le J K
H5 : equiv T K V V'
H6 : subst_equiv L1 K ML1 ML'1 *
H7 : ctx L1
H8 : name n1
H9 : {is_sty T}
H10 : forall T', member (of n1 T') L1 -> T = T'
============================
{is_sty T}
Subgoal 2.2 is:
subst_equiv L1 J ML1 ML'1
subst_equiv_closed < search.
Subgoal 2.2:
Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
H1 : {is_nat K}
H2 : ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv T K V V'
H6 : subst_equiv L1 K ML1 ML'1 *
============================
subst_equiv L1 J ML1 ML'1
subst_equiv_closed < backchain IH.
Subgoal 2.2:
Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
H1 : {is_nat K}
H2 : ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv T K V V'
H6 : subst_equiv L1 K ML1 ML'1 *
============================
ctx L1
subst_equiv_closed < case H2.
Subgoal 2.2:
Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv L K ML ML' * ->
le J K -> subst_equiv L J ML ML'
H1 : {is_nat K}
H4 : le J K
H5 : equiv T K V V'
H6 : subst_equiv L1 K ML1 ML'1 *
H7 : ctx L1
H8 : name n1
H9 : {is_sty T}
H10 : forall T', member (of n1 T') L1 -> T = T'
============================
ctx L1
subst_equiv_closed < search.
Proof completed.
Abella < Theorem subst_equiv_extend :
forall T L K ML ML' V V', nabla x y, subst_equiv L K ML ML' ->
equiv T K V V' ->
subst_equiv (of x T :: L) K (smcons (smap x V) ML) (cmcons (cmap y V') ML').
============================
forall T L K ML ML' V V', nabla x y, subst_equiv L K ML ML' ->
equiv T K V V' ->
subst_equiv (of x T :: L) K (smcons (smap x V) ML)
(cmcons (cmap y V') ML')
subst_equiv_extend < intros.
Variables: T L K ML ML' V V'
H1 : subst_equiv L K ML ML'
H2 : equiv T K V V'
============================
subst_equiv (of n1 T :: L) K (smcons (smap n1 V) ML)
(cmcons (cmap n2 V') ML')
subst_equiv_extend < unfold.
Subgoal 1:
Variables: T L K ML ML' V V'
H1 : subst_equiv L K ML ML'
H2 : equiv T K V V'
============================
equiv T K V V'
Subgoal 2 is:
subst_equiv L K ML ML'
subst_equiv_extend < search.
Subgoal 2:
Variables: T L K ML ML' V V'
H1 : subst_equiv L K ML ML'
H2 : equiv T K V V'
============================
subst_equiv L K ML ML'
subst_equiv_extend < search.
Proof completed.
Abella < Theorem subst_env_equiv_val' :
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE ->
{val' VE}.
============================
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE ->
{val' VE}
subst_env_equiv_val' < induction on 3.
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{val' VE}
============================
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE @ ->
{val' VE}
subst_env_equiv_val' < intros.
Variables: L K ML VE
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{val' VE}
H1 : {is_nat K}
H2 : ctx L
H3 : subst_env_equiv L K ML VE @
============================
{val' VE}
subst_env_equiv_val' < case H3.
Subgoal 1:
Variables: K ML
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv 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_val' < search.
Subgoal 2:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{val' VE}
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv T K V V'
============================
{val' (pair' V' VE1)}
subst_env_equiv_val' < case H2.
Subgoal 2:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv 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_val' < assert {val' VE1}.
Subgoal 2.1:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv 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_val' < backchain IH.
Subgoal 2:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv 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_val' < assert {val' V'}.
Subgoal 2.2:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv 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_val' < backchain equiv_val'.
Subgoal 2:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv 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_val' < search.
Proof completed.
Abella < Theorem subst_env_equiv_tm' :
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE ->
{tm' VE}.
============================
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE ->
{tm' VE}
subst_env_equiv_tm' < induction on 3.
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{tm' VE}
============================
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE @ ->
{tm' VE}
subst_env_equiv_tm' < intros.
Variables: L K ML VE
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{tm' VE}
H1 : {is_nat K}
H2 : ctx L
H3 : subst_env_equiv L K ML VE @
============================
{tm' VE}
subst_env_equiv_tm' < case H3.
Subgoal 1:
Variables: K ML
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv 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_tm' < search.
Subgoal 2:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{tm' VE}
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv T K V V'
============================
{tm' (pair' V' VE1)}
subst_env_equiv_tm' < case H2.
Subgoal 2:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv 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_tm' < assert {tm' VE1}.
Subgoal 2.1:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv 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_tm' < backchain IH.
Subgoal 2:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv 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_tm' < assert {tm' V'}.
Subgoal 2.2:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv 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_tm' < backchain equiv_tm'.
Subgoal 2:
Variables: K ML V VE1 V' L1 T X
IH : forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv L K ML VE * ->
{tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv L1 K ML VE1 *
H5 : smmember (smap X V) ML
H6 : equiv 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_tm' < search.
Proof completed.
Abella < Theorem subst_env_equiv_vars_in_subst :
forall L K ML VE Vs, subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
vars_in_subst Vs ML.
============================
forall L K ML VE Vs, subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
subst_env_equiv_vars_in_subst < induction on 1.
IH : forall L K ML VE Vs, subst_env_equiv L K ML VE * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
============================
forall L K ML VE Vs, subst_env_equiv L K ML VE @ -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
subst_env_equiv_vars_in_subst < intros.
Variables: L K ML VE Vs
IH : forall L K ML VE Vs, subst_env_equiv L K ML VE * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H1 : subst_env_equiv L K ML VE @
H2 : vars_of_ctx L Vs
============================
vars_in_subst Vs ML
subst_env_equiv_vars_in_subst < case H1.
Subgoal 1:
Variables: K ML Vs
IH : forall L K ML VE Vs, subst_env_equiv 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_vars_in_subst < case H2.
Subgoal 1:
Variables: K ML
IH : forall L K ML VE Vs, subst_env_equiv L K ML VE * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
============================
vars_in_subst snil ML
Subgoal 2 is:
vars_in_subst Vs ML
subst_env_equiv_vars_in_subst < search.
Subgoal 2:
Variables: K ML Vs V VE1 V' L1 T X
IH : forall L K ML VE Vs, subst_env_equiv 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 L1 K ML VE1 *
H4 : smmember (smap X V) ML
H5 : equiv T K V V'
============================
vars_in_subst Vs ML
subst_env_equiv_vars_in_subst < case H2.
Subgoal 2:
Variables: K ML V VE1 V' L1 T X Vs1
IH : forall L K ML VE Vs, subst_env_equiv L K ML VE * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : subst_env_equiv L1 K ML VE1 *
H4 : smmember (smap X V) ML
H5 : equiv T K V V'
H6 : vars_of_ctx L1 Vs1
============================
vars_in_subst (scons X Vs1) ML
subst_env_equiv_vars_in_subst < unfold.
Subgoal 2.1:
Variables: K ML V VE1 V' L1 T X Vs1
IH : forall L K ML VE Vs, subst_env_equiv L K ML VE * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : subst_env_equiv L1 K ML VE1 *
H4 : smmember (smap X V) ML
H5 : equiv T K V V'
H6 : vars_of_ctx L1 Vs1
============================
vars_in_subst Vs1 ML
Subgoal 2.2 is:
exists V, smmember (smap X V) ML
subst_env_equiv_vars_in_subst < backchain IH.
Subgoal 2.2:
Variables: K ML V VE1 V' L1 T X Vs1
IH : forall L K ML VE Vs, subst_env_equiv L K ML VE * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : subst_env_equiv L1 K ML VE1 *
H4 : smmember (smap X V) ML
H5 : equiv T K V V'
H6 : vars_of_ctx L1 Vs1
============================
exists V, smmember (smap X V) ML
subst_env_equiv_vars_in_subst < search.
Proof completed.
Abella < Theorem subst_equiv_vars_in_subst :
forall L K Vs ML ML', subst_equiv L K ML ML' -> vars_of_ctx L Vs ->
vars_in_subst Vs ML.
============================
forall L K Vs ML ML', subst_equiv L K ML ML' -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
subst_equiv_vars_in_subst < induction on 1.
IH : forall L K Vs ML ML', subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
============================
forall L K Vs ML ML', subst_equiv L K ML ML' @ -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
subst_equiv_vars_in_subst < intros.
Variables: L K Vs ML ML'
IH : forall L K Vs ML ML', subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H1 : subst_equiv L K ML ML' @
H2 : vars_of_ctx L Vs
============================
vars_in_subst Vs ML
subst_equiv_vars_in_subst < case H1.
Subgoal 1:
Variables: K Vs VE ML1 L1
IH : forall L K Vs ML ML', subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H2 : vars_of_ctx L1 Vs
H3 : subst_env_equiv L1 K ML1 VE
============================
vars_in_subst Vs ML1
Subgoal 2 is:
vars_in_subst (Vs n1) (smcons (smap n1 V) ML1)
subst_equiv_vars_in_subst < backchain subst_env_equiv_vars_in_subst.
Subgoal 2:
Variables: K Vs ML'1 V' ML1 V L1 T
IH : forall L K Vs ML ML', subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H2 : vars_of_ctx (of n1 T :: L1) (Vs n1)
H3 : equiv T K V V'
H4 : subst_equiv L1 K ML1 ML'1 *
============================
vars_in_subst (Vs n1) (smcons (smap n1 V) ML1)
subst_equiv_vars_in_subst < case H2.
Subgoal 2:
Variables: K ML'1 V' ML1 V L1 T Vs1
IH : forall L K Vs ML ML', subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : equiv T K V V'
H4 : subst_equiv L1 K ML1 ML'1 *
H5 : vars_of_ctx L1 (Vs1 n1)
============================
vars_in_subst (scons n1 (Vs1 n1)) (smcons (smap n1 V) ML1)
subst_equiv_vars_in_subst < unfold.
Subgoal 2.1:
Variables: K ML'1 V' ML1 V L1 T Vs1
IH : forall L K Vs ML ML', subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : equiv T K V V'
H4 : subst_equiv L1 K ML1 ML'1 *
H5 : vars_of_ctx L1 (Vs1 n1)
============================
vars_in_subst (Vs1 n1) (smcons (smap n1 V) ML1)
Subgoal 2.2 is:
exists V1, smmember (smap n1 V1) (smcons (smap n1 V) ML1)
subst_equiv_vars_in_subst < apply IH to H4 H5.
Subgoal 2.1:
Variables: K ML'1 V' ML1 V L1 T Vs1
IH : forall L K Vs ML ML', subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : equiv T K V V'
H4 : subst_equiv L1 K ML1 ML'1 *
H5 : vars_of_ctx L1 (Vs1 n1)
H6 : vars_in_subst (Vs1 n1) ML1
============================
vars_in_subst (Vs1 n1) (smcons (smap n1 V) ML1)
Subgoal 2.2 is:
exists V1, smmember (smap n1 V1) (smcons (smap n1 V) ML1)
subst_equiv_vars_in_subst < backchain vars_in_subst_extend.
Subgoal 2.2:
Variables: K ML'1 V' ML1 V L1 T Vs1
IH : forall L K Vs ML ML', subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
vars_in_subst Vs ML
H3 : equiv T K V V'
H4 : subst_equiv L1 K ML1 ML'1 *
H5 : vars_of_ctx L1 (Vs1 n1)
============================
exists V1, smmember (smap n1 V1) (smcons (smap n1 V) ML1)
subst_equiv_vars_in_subst < search.
Proof completed.
Abella < Theorem subst_env_equiv_mem :
forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML).
============================
forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
subst_env_equiv_mem < induction on 3.
IH : forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs}* -> (exists V, smmember (smap X V) ML)
============================
forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs}@ -> (exists V, smmember (smap X V) ML)
subst_env_equiv_mem < intros.
Variables: L K ML Vs E X
IH : forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs}* -> (exists V, smmember (smap X V) ML)
H1 : subst_env_equiv L K ML E
H2 : vars_of_ctx L Vs
H3 : {smember X Vs}@
============================
exists V, smmember (smap X V) ML
subst_env_equiv_mem < case H3.
Subgoal 1:
Variables: L K ML E X L1
IH : forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs}* -> (exists V, smmember (smap X V) ML)
H1 : subst_env_equiv L K ML E
H2 : vars_of_ctx L (scons X L1)
============================
exists V, smmember (smap X V) ML
Subgoal 2 is:
exists V, smmember (smap X V) ML
subst_env_equiv_mem < case H2.
Subgoal 1:
Variables: K ML E X L1 L2 T
IH : forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs}* -> (exists V, smmember (smap X V) ML)
H1 : subst_env_equiv (of X T :: L2) K ML E
H4 : vars_of_ctx L2 L1
============================
exists V, smmember (smap X V) ML
Subgoal 2 is:
exists V, smmember (smap X V) ML
subst_env_equiv_mem < case H1.
Subgoal 1:
Variables: K ML X L1 L2 T V VE V'
IH : forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs}* -> (exists V, smmember (smap X V) ML)
H4 : vars_of_ctx L2 L1
H5 : subst_env_equiv L2 K ML VE
H6 : smmember (smap X V) ML
H7 : equiv T K V V'
============================
exists V, smmember (smap X V) ML
Subgoal 2 is:
exists V, smmember (smap X V) ML
subst_env_equiv_mem < search.
Subgoal 2:
Variables: L K ML E X L1 X1
IH : forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs}* -> (exists V, smmember (smap X V) ML)
H1 : subst_env_equiv L K ML E
H2 : vars_of_ctx L (scons X1 L1)
H4 : {smember X L1}*
============================
exists V, smmember (smap X V) ML
subst_env_equiv_mem < case H2.
Subgoal 2:
Variables: K ML E X L1 X1 L2 T
IH : forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs}* -> (exists V, smmember (smap X V) ML)
H1 : subst_env_equiv (of X1 T :: L2) K ML E
H4 : {smember X L1}*
H5 : vars_of_ctx L2 L1
============================
exists V, smmember (smap X V) ML
subst_env_equiv_mem < case H1.
Subgoal 2:
Variables: K ML X L1 X1 L2 T V VE V'
IH : forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs}* -> (exists V, smmember (smap X V) ML)
H4 : {smember X L1}*
H5 : vars_of_ctx L2 L1
H6 : subst_env_equiv L2 K ML VE
H7 : smmember (smap X1 V) ML
H8 : equiv T K V V'
============================
exists V, smmember (smap X V) ML
subst_env_equiv_mem < apply IH to H6 H5 H4.
Subgoal 2:
Variables: K ML X L1 X1 L2 T V VE V' V1
IH : forall L K ML Vs E X, subst_env_equiv L K ML E -> vars_of_ctx L Vs ->
{smember X Vs}* -> (exists V, smmember (smap X V) ML)
H4 : {smember X L1}*
H5 : vars_of_ctx L2 L1
H6 : subst_env_equiv L2 K ML VE
H7 : smmember (smap X1 V) ML
H8 : equiv T K V V'
H9 : smmember (smap X V1) ML
============================
exists V, smmember (smap X V) ML
subst_env_equiv_mem < search.
Proof completed.
Abella < Theorem subst_equiv_mem :
forall L ML ML' K Vs X, subst_equiv L K ML ML' -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML).
============================
forall L ML ML' K Vs X, subst_equiv L K ML ML' -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
subst_equiv_mem < induction on 1.
IH : forall L ML ML' K Vs X, subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
============================
forall L ML ML' K Vs X, subst_equiv L K ML ML' @ -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
subst_equiv_mem < intros.
Variables: L ML ML' K Vs X
IH : forall L ML ML' K Vs X, subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
H1 : subst_equiv L K ML ML' @
H2 : vars_of_ctx L Vs
H3 : {smember X Vs}
============================
exists V, smmember (smap X V) ML
subst_equiv_mem < case H1.
Subgoal 1:
Variables: K Vs X VE ML1 L1
IH : forall L ML ML' K Vs X, subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
H2 : vars_of_ctx L1 Vs
H3 : {smember X Vs}
H4 : subst_env_equiv L1 K ML1 VE
============================
exists V, smmember (smap X V) ML1
Subgoal 2 is:
exists V1, smmember (smap (X n1) V1) (smcons (smap n1 V) ML1)
subst_equiv_mem < backchain subst_env_equiv_mem.
Subgoal 2:
Variables: K Vs X ML'1 V' ML1 V L1 T
IH : forall L ML ML' K Vs X, subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
H2 : vars_of_ctx (of n1 T :: L1) (Vs n1)
H3 : {smember (X n1) (Vs n1)}
H4 : equiv T K V V'
H5 : subst_equiv L1 K ML1 ML'1 *
============================
exists V1, smmember (smap (X n1) V1) (smcons (smap n1 V) ML1)
subst_equiv_mem < case H2.
Subgoal 2:
Variables: K X ML'1 V' ML1 V L1 T Vs1
IH : forall L ML ML' K Vs X, subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
H3 : {smember (X n1) (scons n1 (Vs1 n1))}
H4 : equiv T K V V'
H5 : subst_equiv L1 K ML1 ML'1 *
H6 : vars_of_ctx L1 (Vs1 n1)
============================
exists V1, smmember (smap (X n1) V1) (smcons (smap n1 V) ML1)
subst_equiv_mem < case H3.
Subgoal 2.1:
Variables: K ML'1 V' ML1 V L1 T Vs1
IH : forall L ML ML' K Vs X, subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
H4 : equiv T K V V'
H5 : subst_equiv L1 K ML1 ML'1 *
H6 : vars_of_ctx L1 (Vs1 n1)
============================
exists V1, smmember (smap n1 V1) (smcons (smap n1 V) ML1)
Subgoal 2.2 is:
exists V1, smmember (smap (X n1) V1) (smcons (smap n1 V) ML1)
subst_equiv_mem < search.
Subgoal 2.2:
Variables: K X ML'1 V' ML1 V L1 T Vs1
IH : forall L ML ML' K Vs X, subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
H4 : equiv T K V V'
H5 : subst_equiv L1 K ML1 ML'1 *
H6 : vars_of_ctx L1 (Vs1 n1)
H7 : {smember (X n1) (Vs1 n1)}
============================
exists V1, smmember (smap (X n1) V1) (smcons (smap n1 V) ML1)
subst_equiv_mem < apply IH to H5 H6 H7.
Subgoal 2.2:
Variables: K X ML'1 V' ML1 V L1 T Vs1 V1
IH : forall L ML ML' K Vs X, subst_equiv L K ML ML' * -> vars_of_ctx L Vs ->
{smember X Vs} -> (exists V, smmember (smap X V) ML)
H4 : equiv T K V V'
H5 : subst_equiv L1 K ML1 ML'1 *
H6 : vars_of_ctx L1 (Vs1 n1)
H7 : {smember (X n1) (Vs1 n1)}
H8 : smmember (smap (X n1) (V1 n1)) ML1
============================
exists V1, smmember (smap (X n1) V1) (smcons (smap n1 V) ML1)
subst_equiv_mem < search.
Proof completed.
Abella < Theorem eq_mmember_rewrite_tm' :
forall A B X M', nabla x, A = B -> {mmember (map X (M' x)) (B x)} ->
{mmember (map X (M' x)) (A x)}.
============================
forall A B X M', nabla x, A = B -> {mmember (map X (M' x)) (B x)} ->
{mmember (map X (M' x)) (A x)}
eq_mmember_rewrite_tm' < intros.
Variables: A B X M'
H1 : A = B
H2 : {mmember (map X (M' n1)) (B n1)}
============================
{mmember (map X (M' n1)) (A n1)}
eq_mmember_rewrite_tm' < case H1.
Variables: B X M'
H2 : {mmember (map X (M' n1)) (B n1)}
============================
{mmember (map X (M' n1)) (B n1)}
eq_mmember_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
IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
H1 : 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
IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
H2 : 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'
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
H1 : env_elem (E n1)
============================
exists E', E = y\E'
env_elem_closed < case H1.
Variables: R
H2 : 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'
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
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
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
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
H1 : env_elem E
============================
env_elem (x\E (snd' x))
env_elem_extend < case H1.
Variables: R
H2 : env_elem_aux R
============================
env_elem (x\fst' (R (snd' x)))
env_elem_extend < apply env_elem_aux_extend to H2.
Variables: R
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: E E1 E2 V V'
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'
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'
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' R
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' R V'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'}
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' R V'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'}
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: E E1 E2 V V'
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' R
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' R V'1
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' R V'1
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} ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\ {mmember (map X (E' x)) (Map x)}).
============================
forall FVs Map X E Env, nabla x, {mapvar FVs Map} ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\ {mmember (map X (E' x)) (Map x)})
mapvar_mem < induction on 1.
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
============================
forall FVs Map X E Env, nabla x, {mapvar FVs Map}@ ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\ {mmember (map X (E' x)) (Map x)})
mapvar_mem < intros.
Variables: FVs Map X E Env
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H1 : {mapvar FVs Map}@
H2 : {mmember (map X E) (Map Env)}
============================
exists E', E = E' Env /\ env_elem E' /\ {mmember (map X (E' n1)) (Map n1)}
mapvar_mem < case H1.
Subgoal 1:
Variables: X E Env
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H2 : {mmember (map X E) mnil}
============================
exists E', E = E' Env /\ env_elem E' /\ {mmember (map X (E' n1)) mnil}
Subgoal 2 is:
exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' n1)) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < case H2.
Subgoal 2:
Variables: X E Env Map1 L X1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H2 : {mmember (map X E) (mcons (map X1 (fst' Env)) (Map1 (snd' Env)))}
H3 : {mapvar L Map1}*
============================
exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' n1)) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < case H2.
Subgoal 2.1:
Variables: Env Map1 L X1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
============================
exists E', fst' Env = E' Env /\ env_elem E' /\
{mmember (map X1 (E' n1)) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
Subgoal 2.2 is:
exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' n1)) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < exists x\fst' x.
Subgoal 2.1:
Variables: Env Map1 L X1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
============================
fst' Env = fst' Env /\ env_elem (x\fst' x) /\
{mmember (map X1 (fst' n1)) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
Subgoal 2.2 is:
exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' n1)) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < search.
Subgoal 2.2:
Variables: X E Env Map1 L X1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {mmember (map X E) (Map1 (snd' Env))}
============================
exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' n1)) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < apply IH to H3 H4.
Subgoal 2.2:
Variables: X E Env Map1 L X1 E'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {mmember (map X E) (Map1 (snd' Env))}
H5 : E = E' n1 (snd' Env)
H6 : env_elem (E' n1)
H7 : {mmember (map X (E' n1 n1)) (Map1 n1)}
============================
exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' n1)) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < apply env_elem_closed to H6.
Subgoal 2.2:
Variables: X E Env Map1 L X1 E'1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {mmember (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : {mmember (map X (E'1 n1)) (Map1 n1)}
============================
exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' n1)) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < exists x\E'1 (snd' x).
Subgoal 2.2:
Variables: X E Env Map1 L X1 E'1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {mmember (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : {mmember (map X (E'1 n1)) (Map1 n1)}
============================
E = E'1 (snd' Env) /\ env_elem (x\E'1 (snd' x)) /\
{mmember (map X (E'1 (snd' n1)))
(mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < split.
Subgoal 2.2.1:
Variables: X E Env Map1 L X1 E'1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {mmember (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : {mmember (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:
{mmember (map X (E'1 (snd' n1))) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < search.
Subgoal 2.2.2:
Variables: X E Env Map1 L X1 E'1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {mmember (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : {mmember (map X (E'1 n1)) (Map1 n1)}
============================
env_elem (x\E'1 (snd' x))
Subgoal 2.2.3 is:
{mmember (map X (E'1 (snd' n1))) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < apply env_elem_extend to H6.
Subgoal 2.2.2:
Variables: X E Env Map1 L X1 E'1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {mmember (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : {mmember (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:
{mmember (map X (E'1 (snd' n1))) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < search.
Subgoal 2.2.3:
Variables: X E Env Map1 L X1 E'1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {mmember (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : {mmember (map X (E'1 n1)) (Map1 n1)}
============================
{mmember (map X (E'1 (snd' n1))) (mcons (map X1 (fst' n1)) (Map1 (snd' n1)))}
mapvar_mem < inst H7 with n1 = snd' n1.
Subgoal 2.2.3:
Variables: X E Env Map1 L X1 E'1
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
{mmember (map X E) (Map Env)} ->
(exists E', E = E' Env /\ env_elem E' /\
{mmember (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {mmember (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : {mmember (map X (E'1 n1)) (Map1 n1)}
H8 : {mmember (map X (E'1 (snd' n1))) (Map1 (snd' n1))}
============================
{mmember (map X (E'1 (snd' n1))) (mcons (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} -> {mmember (map X (M E)) (Map E)} ->
{smember X Vs}.
============================
forall Vs Map X M E, {mapvar Vs Map} -> {mmember (map X (M E)) (Map E)} ->
{smember X Vs}
mapvar_sync < induction on 1.
IH : forall Vs Map X M E, {mapvar Vs Map}* ->
{mmember (map X (M E)) (Map E)} -> {smember X Vs}
============================
forall Vs Map X M E, {mapvar Vs Map}@ -> {mmember (map X (M E)) (Map E)} ->
{smember X Vs}
mapvar_sync < intros.
Variables: Vs Map X M E
IH : forall Vs Map X M E, {mapvar Vs Map}* ->
{mmember (map X (M E)) (Map E)} -> {smember X Vs}
H1 : {mapvar Vs Map}@
H2 : {mmember (map X (M E)) (Map E)}
============================
{smember X Vs}
mapvar_sync < case H1.
Subgoal 1:
Variables: X M E
IH : forall Vs Map X M E, {mapvar Vs Map}* ->
{mmember (map X (M E)) (Map E)} -> {smember X Vs}
H2 : {mmember (map X (M E)) mnil}
============================
{smember X snil}
Subgoal 2 is:
{smember X (scons X1 L)}
mapvar_sync < case H2.
Subgoal 2:
Variables: X M E Map1 L X1
IH : forall Vs Map X M E, {mapvar Vs Map}* ->
{mmember (map X (M E)) (Map E)} -> {smember X Vs}
H2 : {mmember (map X (M E)) (mcons (map X1 (fst' E)) (Map1 (snd' E)))}
H3 : {mapvar L Map1}*
============================
{smember X (scons X1 L)}
mapvar_sync < case H2.
Subgoal 2.1:
Variables: M E Map1 L X1
IH : forall Vs Map X M E, {mapvar Vs Map}* ->
{mmember (map X (M E)) (Map E)} -> {smember X Vs}
H3 : {mapvar L Map1}*
H4 : M E = fst' E
============================
{smember X1 (scons X1 L)}
Subgoal 2.2 is:
{smember X (scons X1 L)}
mapvar_sync < search.
Subgoal 2.2:
Variables: X M E Map1 L X1
IH : forall Vs Map X M E, {mapvar Vs Map}* ->
{mmember (map X (M E)) (Map E)} -> {smember X Vs}
H3 : {mapvar L Map1}*
H4 : {mmember (map X (M E)) (Map1 (snd' E))}
============================
{smember X (scons X1 L)}
mapvar_sync < apply mapvar_mem to H3 H4.
Subgoal 2.2:
Variables: X M E Map1 L X1 E'
IH : forall Vs Map X M E, {mapvar Vs Map}* ->
{mmember (map X (M E)) (Map E)} -> {smember X Vs}
H3 : {mapvar L Map1}*
H4 : {mmember (map X (M E)) (Map1 (snd' E))}
H5 : M E = E' n1 (snd' E)
H6 : env_elem (E' n1)
H7 : {mmember (map X (E' n1 n1)) (Map1 n1)}
============================
{smember X (scons X1 L)}
mapvar_sync < apply env_elem_closed to H6.
Subgoal 2.2:
Variables: X M E Map1 L X1 E'1
IH : forall Vs Map X M E, {mapvar Vs Map}* ->
{mmember (map X (M E)) (Map E)} -> {smember X Vs}
H3 : {mapvar L Map1}*
H4 : {mmember (map X (M E)) (Map1 (snd' E))}
H5 : M E = E'1 (snd' E)
H6 : env_elem E'1
H7 : {mmember (map X (E'1 n1)) (Map1 n1)}
============================
{smember X (scons X1 L)}
mapvar_sync < apply IH to H3 H7 with M = E'1, Map = Map1.
Subgoal 2.2:
Variables: X M E Map1 L X1 E'1
IH : forall Vs Map X M E, {mapvar Vs Map}* ->
{mmember (map X (M E)) (Map E)} -> {smember X Vs}
H3 : {mapvar L Map1}*
H4 : {mmember (map X (M E)) (Map1 (snd' E))}
H5 : M E = E'1 (snd' E)
H6 : env_elem E'1
H7 : {mmember (map X (E'1 n1)) (Map1 n1)}
H8 : {smember X L}
============================
{smember X (scons 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: A B C V
H1 : A n1 = B n1
H2 : {eval' (B C) V}
============================
{eval' (A C) V}
eq_rewrite_eval' < case H1.
Variables: B C V
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 L K ML VE -> vars_of_ctx L Vs -> {mapvar Vs Map} ->
member (of X T) L -> {mmember (map X (M' e)) (Map e)} ->
app_subst ML X V -> (exists V', {eval' (M' VE) V'} /\ equiv 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 L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map} -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}@ -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv T K V V')
fvar_sem_pres < intros.
Variables: L Vs Map ML K VE X T M' V
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv L K ML VE
H5 : vars_of_ctx L Vs
H6 : {mapvar Vs Map}@
H7 : member (of X T) L
H8 : {mmember (map X (M' n1)) (Map n1)}
H9 : app_subst ML X V
============================
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < case H8.
Subgoal 1:
Variables: L Vs ML K VE X T M' V L1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv L K ML VE
H5 : vars_of_ctx L Vs
H6 : {mapvar Vs (z1\mcons (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 T K V V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < case H6.
Subgoal 1:
Variables: L ML K VE X T V L1 Map1 L2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv L K ML VE
H5 : vars_of_ctx L (scons 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 T K V V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < case H5.
Subgoal 1:
Variables: ML K VE X T V L1 Map1 L2 L3 T1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H4 : subst_env_equiv (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 T K V V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < case H4.
Subgoal 1:
Variables: ML K X T V L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv T1 K V1 V'
============================
exists V'1, {eval' (fst' (pair' V' VE1)) V'1} /\ equiv T K V V'1
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < apply subst_var_eq to _ H14 H9.
Subgoal 1:
Variables: ML K X T L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv T1 K V1 V'
============================
exists V'1, {eval' (fst' (pair' V' VE1)) V'1} /\ equiv T K V1 V'1
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < exists V'.
Subgoal 1:
Variables: ML K X T L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv T1 K V1 V'
============================
{eval' (fst' (pair' V' VE1)) V'} /\ equiv T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < split.
Subgoal 1.1:
Variables: ML K X T L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv T1 K V1 V'
============================
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < apply equiv_val' to _ _ H15.
Subgoal 1.1.1:
Variables: ML K X T L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv T1 K V1 V'
============================
{is_sty T1}
Subgoal 1.1 is:
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < case H2.
Subgoal 1.1.1:
Variables: ML K X T L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv 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 T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < search.
Subgoal 1.1:
Variables: ML K X T L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv T1 K V1 V'
H16 : {val' V'}
============================
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < apply subst_env_equiv_val' to _ _ H13.
Subgoal 1.1.2:
Variables: ML K X T L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv T1 K V1 V'
H16 : {val' V'}
============================
ctx L3
Subgoal 1.1 is:
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < case H2.
Subgoal 1.1.2:
Variables: ML K X T L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv 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 T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < search.
Subgoal 1.1:
Variables: ML K X T L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv T1 K V1 V'
H16 : {val' V'}
H17 : {val' VE1}
============================
{eval' (fst' (pair' V' VE1)) V'}
Subgoal 1.2 is:
equiv T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < search.
Subgoal 1.2:
Variables: ML K X T L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv T1 K V1 V'
============================
equiv T K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < apply ctx_mem_sync to H2 H7 _ with T' = T1.
Subgoal 1.2:
Variables: ML K X L1 Map1 L2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 L3 K ML VE1
H14 : smmember (smap X V1) ML
H15 : equiv T1 K V1 V'
============================
equiv T1 K V1 V'
Subgoal 2 is:
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < search.
Subgoal 2:
Variables: L Vs ML K VE X T M' V L1 X1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv L K ML VE
H5 : vars_of_ctx L Vs
H6 : {mapvar Vs (z1\mcons (X1 z1) (L1 z1))}@
H7 : member (of X T) L
H9 : app_subst ML X V
H10 : {mmember (map X (M' n1)) (L1 n1)}
============================
exists V', {eval' (M' VE) V'} /\ equiv T K V V'
fvar_sem_pres < case H6.
Subgoal 2:
Variables: L ML K VE X T M' V L1 Map1 L2 X2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv L K ML VE
H5 : vars_of_ctx L (scons X2 L2)
H7 : member (of X T) L
H9 : app_subst ML X V
H10 : {mmember (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 T K V V'
fvar_sem_pres < case H5.
Subgoal 2:
Variables: ML K VE X T M' V L1 Map1 L2 X2 L3 T1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H4 : subst_env_equiv (of X2 T1 :: L3) K ML VE
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : {mmember (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 T K V V'
fvar_sem_pres < case H4.
Subgoal 2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv T K V V'1
fvar_sem_pres < apply eq_mmember_rewrite_tm' to H11 H10.
Subgoal 2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv T K V V'1
fvar_sem_pres < apply mapvar_mem to H12 H17.
Subgoal 2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E' n1 n2 (snd' n1)
H19 : env_elem (E' n1 n2)
H20 : {mmember (map X (E' n1 n2 n2)) (Map1 n2)}
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv T K V V'1
fvar_sem_pres < apply env_elem_closed to H19.
Subgoal 2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'1 n2 (snd' n1)
H19 : env_elem (E'1 n2)
H20 : {mmember (map X (E'1 n2 n2)) (Map1 n2)}
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv T K V V'1
fvar_sem_pres < apply env_elem_closed to H19.
Subgoal 2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv T K V V'1
fvar_sem_pres < apply IH to _ _ _ H14 H13 H12 _ H20 H9 with T = T.
Subgoal 2.1:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (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 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 K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {smember 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 T K V V'1
fvar_sem_pres < apply lst_mem_to_ctx_mem to H13 H21.
Subgoal 2.1:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 T2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {smember 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 T K V V'1
fvar_sem_pres < case H7 (keep).
Subgoal 2.1.1:
Variables: ML K M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 T2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X2 (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X2 (E'2 n2)) (Map1 n2)}
H21 : {smember 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 T K V V'1
fvar_sem_pres < apply ctx_mem_sync to H2 H7 _ with T' = T2.
Subgoal 2.1.1:
Variables: ML K M' V L1 Map1 L2 X2 L3 V1 VE1 V' E'2 T2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T2 K V1 V'
H17 : {mmember (map X2 (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X2 (E'2 n2)) (Map1 n2)}
H21 : {smember 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 T K V V'1
fvar_sem_pres < search.
Subgoal 2.1.2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 T2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {smember 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 T K V V'1
fvar_sem_pres < search.
Subgoal 2.2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
============================
ctx L3
Subgoal 2 is:
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv T K V V'1
fvar_sem_pres < case H2.
Subgoal 2.2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (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 T K V V'1
fvar_sem_pres < search.
Subgoal 2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv T K V V'1
============================
exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv T K V V'1
fvar_sem_pres < assert {eval' (E'2 (snd' (pair' V' VE1))) V'1}.
Subgoal 2.3:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < assert {eval' (snd' (pair' V' VE1)) VE1}.
Subgoal 2.3.1:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < apply equiv_val' to _ _ H16.
Subgoal 2.3.1.1:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < case H2.
Subgoal 2.3.1.1:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < search.
Subgoal 2.3.1:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < apply subst_env_equiv_val' to _ _ H14.
Subgoal 2.3.1.2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < case H2.
Subgoal 2.3.1.2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < search.
Subgoal 2.3.1:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < search.
Subgoal 2.3:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < assert {eval' VE1 VE1}.
Subgoal 2.3.2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < apply subst_env_equiv_val' to _ _ H14.
Subgoal 2.3.2.1:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < case H2.
Subgoal 2.3.2.1:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < search.
Subgoal 2.3.2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < backchain eval'_refl.
Subgoal 2.3:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 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 K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < search.
Subgoal 2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < apply eq_rewrite_eval' to H18 H23.
Subgoal 2:
Variables: ML K X T M' V L1 Map1 L2 X2 L3 T1 V1 VE1 V' E'2 V'1
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
subst ML -> subst_env_equiv L K ML VE -> vars_of_ctx L Vs ->
{mapvar Vs Map}* -> member (of X T) L ->
{mmember (map X (M' e)) (Map e)} -> app_subst ML X V ->
(exists V', {eval' (M' VE) V'} /\ equiv 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 : {mmember (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 L3 K ML VE1
H15 : smmember (smap X2 V1) ML
H16 : equiv T1 K V1 V'
H17 : {mmember (map X (M' n1)) (Map1 (snd' n1))}
H18 : M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : {mmember (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv 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 T K V V'1
fvar_sem_pres < search.
Proof completed.
Abella < Define to_mapping : tm_list -> tm'_list -> map_list -> prop by
to_mapping Vs (ccons E cnil) (Map E) := {mapvar Vs Map};
to_mapping (scons X Vs) (ccons X' Vs') (mcons (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
H1 : A n1 = B n1
============================
A = B
eq_map_list_inv_tm' < case H1.
Variables: B
============================
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
H1 : A n1 = B n1
============================
A = B
eq_map_list_inv_tm < case H1.
Variables: B
============================
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\mcons (map X (fst' z2)) (A z1 z2) =
y\z2\mcons (map X (fst' z2)) (B y z2).
============================
forall A B X, A = B -> z1\z2\mcons (map X (fst' z2)) (A z1 z2) =
y\z2\mcons (map X (fst' z2)) (B y z2)
eq_map_list_rewrite_tm' < intros.
Variables: A B X
H1 : A = B
============================
z1\z2\mcons (map X (fst' z2)) (A z1 z2) =
y\z2\mcons (map X (fst' z2)) (B y z2)
eq_map_list_rewrite_tm' < case H1.
Variables: B X
============================
z1\z2\mcons (map X (fst' z2)) (B z1 z2) =
y\z2\mcons (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\mcons (map X (fst' z2)) (A z1 z2) =
y\z2\mcons (map X (fst' z2)) (B y z2).
============================
forall A B X, A = B -> z1\z2\mcons (map X (fst' z2)) (A z1 z2) =
y\z2\mcons (map X (fst' z2)) (B y z2)
eq_map_list_rewrite_tm < intros.
Variables: A B X
H1 : A = B
============================
z1\z2\mcons (map X (fst' z2)) (A z1 z2) =
y\z2\mcons (map X (fst' z2)) (B y z2)
eq_map_list_rewrite_tm < case H1.
Variables: B X
============================
z1\z2\mcons (map X (fst' z2)) (B z1 z2) =
y\z2\mcons (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 ML
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H1 : {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\mnil = y\ML'
Subgoal 2 is:
exists ML', ML = y\ML'
mapvar_prune_tm < search.
Subgoal 2:
Variables: ML Map FVs2 FVs1
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : e\mcons (map FVs1 (fst' e)) (Map n1 (snd' e)) = e\ML n1 e
H3 : {mapvar FVs2 (Map n1)}*
============================
exists ML', ML = y\ML'
mapvar_prune_tm < apply IH to H3.
Subgoal 2:
Variables: ML FVs2 FVs1 ML'
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : e\mcons (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 FVs1 ML' ML2
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar FVs2 ML'}*
H4 : e\ML2 n1 e = e\ML' (snd' e)
============================
exists ML', z1\z2\mcons (map FVs1 (fst' z2)) (ML2 z1 z2) = y\ML'
mapvar_prune_tm < exists z2\mcons (map FVs1 (fst' z2)) (ML' (snd' z2)).
Subgoal 2:
Variables: FVs2 FVs1 ML' ML2
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar FVs2 ML'}*
H4 : e\ML2 n1 e = e\ML' (snd' e)
============================
z1\z2\mcons (map FVs1 (fst' z2)) (ML2 z1 z2) =
y\z2\mcons (map FVs1 (fst' z2)) (ML' (snd' z2))
mapvar_prune_tm < apply eq_map_list_inv_tm to H4.
Subgoal 2:
Variables: FVs2 FVs1 ML' ML2
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar FVs2 ML'}*
H4 : e\ML2 n1 e = e\ML' (snd' e)
H5 : z2\z3\ML2 z2 z3 = z2\z3\ML' (snd' z3)
============================
z1\z2\mcons (map FVs1 (fst' z2)) (ML2 z1 z2) =
y\z2\mcons (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 ML
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H1 : {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\mnil = y\ML'
Subgoal 2 is:
exists ML', ML = y\ML'
mapvar_prune_tm' < search.
Subgoal 2:
Variables: ML Map L X
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : e\mcons (map X (fst' e)) (Map n1 (snd' e)) = e\ML n1 e
H3 : {mapvar L (Map n1)}*
============================
exists ML', ML = y\ML'
mapvar_prune_tm' < apply IH to H3.
Subgoal 2:
Variables: ML L X ML'
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : e\mcons (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 X ML' ML2
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar L ML'}*
H4 : e\ML2 n1 e = e\ML' (snd' e)
============================
exists ML', z1\z2\mcons (map X (fst' z2)) (ML2 z1 z2) = y\ML'
mapvar_prune_tm' < exists z2\mcons (map X (fst' z2)) (ML' (snd' z2)).
Subgoal 2:
Variables: L X ML' ML2
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar L ML'}*
H4 : e\ML2 n1 e = e\ML' (snd' e)
============================
z1\z2\mcons (map X (fst' z2)) (ML2 z1 z2) =
y\z2\mcons (map X (fst' z2)) (ML' (snd' z2))
mapvar_prune_tm' < apply eq_map_list_inv_tm' to H4.
Subgoal 2:
Variables: L X ML' ML2
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar L ML'}*
H4 : e\ML2 n1 e = e\ML' (snd' e)
H5 : z2\z3\ML2 z2 z3 = z2\z3\ML' (snd' z3)
============================
z1\z2\mcons (map X (fst' z2)) (ML2 z1 z2) =
y\z2\mcons (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 Vs
IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
H1 : 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\snil = y\Vs'
Subgoal 2 is:
exists Vs', z1\scons L2 (Vs1 z1) = y\Vs'
vars_of_ctx_prune_tm < search.
Subgoal 2:
Variables: Vs1 L2 L3 T
IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
H2 : vars_of_ctx L3 (Vs1 n1) *
============================
exists Vs', z1\scons L2 (Vs1 z1) = y\Vs'
vars_of_ctx_prune_tm < apply IH to H2.
Subgoal 2:
Variables: L2 L3 T Vs'
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\scons 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 Vs
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
(exists Vs', Vs = y\Vs')
H1 : 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\cnil = y\Vs'
Subgoal 2 is:
exists Vs', z2\ccons n2 (L z2) = y\Vs'
vars_of_subst'_prune_tm' < search.
Subgoal 2:
Variables: L ML3 ML2
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
(exists Vs', Vs = y\Vs')
H2 : vars_of_subst' ML3 (L n1) *
============================
exists Vs', z2\ccons n2 (L z2) = y\Vs'
vars_of_subst'_prune_tm' < apply IH to H2.
Subgoal 2:
Variables: ML3 ML2 Vs'
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
(exists Vs', Vs = y\Vs')
H2 : vars_of_subst' ML3 Vs' *
============================
exists Vs'1, z2\ccons 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 Vs' Map
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H1 : to_mapping Vs Vs' (Map n1) @
============================
exists Map', Map = y\Map'
to_mapping_prune_tm < case H1.
Subgoal 1:
Variables: Vs E Map1
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : {mapvar Vs (Map1 n1)}
============================
exists Map', z1\Map1 z1 E = y\Map'
Subgoal 2 is:
exists Map', z1\mcons (map Vs2 X') (Map1 z1) = y\Map'
to_mapping_prune_tm < apply mapvar_prune_tm to H2.
Subgoal 1:
Variables: Vs E ML'
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\mcons (map Vs2 X') (Map1 z1) = y\Map'
to_mapping_prune_tm < search.
Subgoal 2:
Variables: Map1 X' Vs2 Vs'1 Vs3
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : to_mapping Vs3 Vs'1 (Map1 n1) *
============================
exists Map', z1\mcons (map Vs2 X') (Map1 z1) = y\Map'
to_mapping_prune_tm < apply IH to H2.
Subgoal 2:
Variables: X' Vs2 Vs'1 Vs3 Map'
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\mcons (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 Vs' Map
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H1 : to_mapping Vs Vs' (Map n1) @
============================
exists Map', Map = y\Map'
to_mapping_prune_tm' < case H1.
Subgoal 1:
Variables: Vs Vs'1 Map1
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : {mapvar Vs (Map1 n1)}
============================
exists Map', z1\Map1 z1 Vs'1 = y\Map'
Subgoal 2 is:
exists Map', z1\mcons (map X Vs'2) (Map1 z1) = y\Map'
to_mapping_prune_tm' < apply mapvar_prune_tm' to H2.
Subgoal 1:
Variables: Vs Vs'1 ML'
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\mcons (map X Vs'2) (Map1 z1) = y\Map'
to_mapping_prune_tm' < search.
Subgoal 2:
Variables: Map1 Vs'2 X Vs'3 Vs1
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
(exists Map', Map = y\Map')
H2 : to_mapping Vs1 Vs'3 (Map1 n1) *
============================
exists Map', z1\mcons (map X Vs'2) (Map1 z1) = y\Map'
to_mapping_prune_tm' < apply IH to H2.
Subgoal 2:
Variables: Vs'2 X Vs'3 Vs1 Map'
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\mcons (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 L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V -> app_subst' ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv 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 L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V -> app_subst' ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv 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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv 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 L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map @ -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V -> app_subst' ML' M' M'' ->
(exists V', {eval' M'' V'} /\ equiv T K V V')
var_sem_pres < intros.
Variables: L ML ML' K Vs Vs' Map X T V M' M''
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (map X M') Map}
H11 : app_subst ML X V
H12 : app_subst' ML' M' M''
============================
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H8.
Subgoal 1:
Variables: L ML ML' K Vs X T V M' M'' E Map1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' (ccons E cnil)
H9 : member (of X T) L
H10 : {mmember (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 T K V V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H7.
Subgoal 1:
Variables: L ML K Vs X T V M' M'' Map1 ML1 V1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (L n1)
H3 : subst (ML n1)
H4 : subst' (cmcons (cmap n1 V1) ML1)
H5 : subst_equiv (L n1) K (ML n1) (cmcons (cmap n1 V1) ML1)
H6 : vars_of_ctx (L n1) Vs
H9 : member (of X T) (L n1)
H10 : {mmember (map X (M' n1)) (Map1 n1 n1)}
H11 : app_subst (ML n1) X V
H12 : app_subst' (cmcons (cmap n1 V1) ML1) (M' n1) (M'' n1)
H13 : {mapvar Vs (Map1 n1)}
H14 : vars_of_subst' ML1 cnil
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H14.
Subgoal 1:
Variables: L ML K Vs X T V M' M'' Map1 V1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (L n1)
H3 : subst (ML n1)
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H5 : subst_equiv (L n1) K (ML n1) (cmcons (cmap n1 V1) cmnil)
H6 : vars_of_ctx (L n1) Vs
H9 : member (of X T) (L n1)
H10 : {mmember (map X (M' n1)) (Map1 n1 n1)}
H11 : app_subst (ML n1) X V
H12 : app_subst' (cmcons (cmap n1 V1) cmnil) (M' n1) (M'' n1)
H13 : {mapvar Vs (Map1 n1)}
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H5.
Subgoal 1.1:
Variables: K Vs X T V M' M'' Map1 V1 ML2 L1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : {mmember (map X (M' n1)) (Map1 n1 n1)}
H11 : app_subst ML2 X V
H12 : app_subst' (cmcons (cmap n1 V1) cmnil) (M' n1) (M'' n1)
H13 : {mapvar Vs (Map1 n1)}
H15 : subst_env_equiv L1 K ML2 V1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
Subgoal 1.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < apply mapvar_prune_tm' to H13.
Subgoal 1.1:
Variables: K Vs X T V M' M'' V1 ML2 L1 ML'1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : {mmember (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H12 : app_subst' (cmcons (cmap n1 V1) cmnil) (M' n1) (M'' n1)
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv L1 K ML2 V1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
Subgoal 1.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < apply fvar_sem_pres to _ _ _ _ _ H13 H9 H10 _.
Subgoal 1.1:
Variables: K Vs X T V M' M'' V1 ML2 L1 ML'1 V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : {mmember (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H12 : app_subst' (cmcons (cmap n1 V1) cmnil) (M' n1) (M'' n1)
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv L1 K ML2 V1
H16 : {eval' (M' V1) V'}
H17 : equiv T K V V'
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
Subgoal 1.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H12.
Subgoal 1.1:
Variables: K Vs X T V M' V1 ML2 L1 ML'1 V' M
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : {mmember (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv L1 K ML2 V1
H16 : {eval' (M' V1) V'}
H17 : equiv T K V V'
H18 : app_subst' cmnil (M' V1) M
============================
exists V', {eval' M V'} /\ equiv T K V V'
Subgoal 1.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H18.
Subgoal 1.1:
Variables: K Vs X T V M' V1 ML2 L1 ML'1 V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : {mmember (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv L1 K ML2 V1
H16 : {eval' (M' V1) V'}
H17 : equiv T K V V'
============================
exists V', {eval' (M' V1) V'} /\ equiv T K V V'
Subgoal 1.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < search.
Subgoal 1.2:
Variables: K Vs X T V M' M'' Map1 V1 ML2 V2 L1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L1)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H6 : vars_of_ctx (of n2 T1 :: L1) (Vs n2)
H9 : member (of (X n2) T) (of n2 T1 :: L1)
H10 : {mmember (map (X n2) (M' n1)) (Map1 n2 n1 n1)}
H11 : app_subst (smcons (smap n2 V2) ML2) (X n2) (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) cmnil) (M' n1) (M'' n1)
H13 : {mapvar (Vs n2) (Map1 n2 n1)}
H15 : equiv T1 K V2 V1
H16 : subst_equiv L1 K ML2 cmnil
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H16.
Subgoal 2:
Variables: L ML ML' K X T V M' M'' Map1 X' X1 Vs'1 Vs1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv L K ML ML'
H6 : vars_of_ctx L (scons X1 Vs1)
H7 : vars_of_subst' ML' (ccons X' Vs'1)
H9 : member (of X T) L
H10 : {mmember (map X M') (mcons (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 T K V V'
var_sem_pres < case H10.
Subgoal 2.1:
Variables: L ML ML' K T V M'' Map1 X' X1 Vs'1 Vs1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv L K ML ML'
H6 : vars_of_ctx L (scons X1 Vs1)
H7 : vars_of_subst' ML' (ccons 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 T K V V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H6.
Subgoal 2.1:
Variables: ML ML' K T V M'' Map1 X' X1 Vs'1 Vs1 L1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L1)
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv (of X1 T1 :: L1) K ML ML'
H7 : vars_of_subst' ML' (ccons 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 T K V V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H7.
Subgoal 2.1:
Variables: ML K T V M'' Map1 X1 Vs1 L1 T1 L2 ML1 V1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L1 n1)
H3 : subst (ML n1)
H4 : subst' (cmcons (cmap n1 V1) ML1)
H5 : subst_equiv (of X1 T1 :: L1 n1) K (ML n1) (cmcons (cmap n1 V1) ML1)
H9 : member (of X1 T) (of X1 T1 :: L1 n1)
H11 : app_subst (ML n1) X1 V
H12 : app_subst' (cmcons (cmap n1 V1) ML1) n1 (M'' n1)
H13 : to_mapping Vs1 L2 (Map1 n1) *
H14 : vars_of_ctx (L1 n1) Vs1
H15 : vars_of_subst' ML1 L2
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H5.
Subgoal 2.1.1:
Variables: K T V M'' Map1 X1 Vs1 T1 L2 V1 ML2 L4
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H9 : member (of X1 T) (of X1 T1 :: L4)
H11 : app_subst ML2 X1 V
H12 : app_subst' (cmcons (cmap n1 V1) cmnil) n1 (M'' n1)
H13 : to_mapping Vs1 L2 (Map1 n1) *
H14 : vars_of_ctx L4 Vs1
H15 : vars_of_subst' cmnil L2
H16 : subst_env_equiv (of X1 T1 :: L4) K ML2 V1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
Subgoal 2.1.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H15.
Subgoal 2.1.1:
Variables: K T V M'' Map1 X1 Vs1 T1 V1 ML2 L4
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H9 : member (of X1 T) (of X1 T1 :: L4)
H11 : app_subst ML2 X1 V
H12 : app_subst' (cmcons (cmap n1 V1) cmnil) n1 (M'' n1)
H13 : to_mapping Vs1 cnil (Map1 n1) *
H14 : vars_of_ctx L4 Vs1
H16 : subst_env_equiv (of X1 T1 :: L4) K ML2 V1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
Subgoal 2.1.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H13.
Subgoal 2.1.2:
Variables: K T V M'' Map1 Vs1 T1 L2 V1 ML'1 ML2 V2 L3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H9 : member (of n2 T) (of n2 T1 :: L3)
H11 : app_subst (smcons (smap n2 V2) ML2) n2 (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) n1 (M'' n1)
H13 : to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv T1 K V2 V1
H17 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H9.
Subgoal 2.1.2.1:
Variables: K V M'' Map1 Vs1 T1 L2 V1 ML'1 ML2 V2 L3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H11 : app_subst (smcons (smap n2 V2) ML2) n2 (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) n1 (M'' n1)
H13 : to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv T1 K V2 V1
H17 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T1 K (V n2) V'
Subgoal 2.1.2.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < apply subst_var_eq to H3 _ H11.
Subgoal 2.1.2.1:
Variables: K M'' Map1 Vs1 T1 L2 V1 ML'1 ML2 V2 L3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H11 : app_subst (smcons (smap n2 V2) ML2) n2 V2
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) n1 (M'' n1)
H13 : to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv T1 K V2 V1
H17 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T1 K V2 V'
Subgoal 2.1.2.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < apply subst'_var_eq to H4 _ H12.
Subgoal 2.1.2.1:
Variables: K Map1 Vs1 T1 L2 V1 ML'1 ML2 V2 L3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H11 : app_subst (smcons (smap n2 V2) ML2) n2 V2
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) n1 V1
H13 : to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv T1 K V2 V1
H17 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' V1 V'} /\ equiv T1 K V2 V'
Subgoal 2.1.2.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < apply equiv_val' to _ _ H16.
Subgoal 2.1.2.1.1:
Variables: K Map1 Vs1 T1 L2 V1 ML'1 ML2 V2 L3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H11 : app_subst (smcons (smap n2 V2) ML2) n2 V2
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) n1 V1
H13 : to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv T1 K V2 V1
H17 : subst_equiv L3 K ML2 ML'1
============================
{is_sty T1}
Subgoal 2.1.2.1 is:
exists V', {eval' V1 V'} /\ equiv T1 K V2 V'
Subgoal 2.1.2.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H2.
Subgoal 2.1.2.1.1:
Variables: K Map1 Vs1 T1 L2 V1 ML'1 ML2 V2 L3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H11 : app_subst (smcons (smap n2 V2) ML2) n2 V2
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) n1 V1
H13 : to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv T1 K V2 V1
H17 : subst_equiv L3 K ML2 ML'1
H18 : ctx L3
H19 : name n2
H20 : {is_sty T1}
H21 : forall T', member (of n2 T') L3 -> T1 = T'
============================
{is_sty T1}
Subgoal 2.1.2.1 is:
exists V', {eval' V1 V'} /\ equiv T1 K V2 V'
Subgoal 2.1.2.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < search.
Subgoal 2.1.2.1:
Variables: K Map1 Vs1 T1 L2 V1 ML'1 ML2 V2 L3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H11 : app_subst (smcons (smap n2 V2) ML2) n2 V2
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) n1 V1
H13 : to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv T1 K V2 V1
H17 : subst_equiv L3 K ML2 ML'1
H18 : {val' V1}
============================
exists V', {eval' V1 V'} /\ equiv T1 K V2 V'
Subgoal 2.1.2.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < apply eval'_refl to H18.
Subgoal 2.1.2.1:
Variables: K Map1 Vs1 T1 L2 V1 ML'1 ML2 V2 L3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H11 : app_subst (smcons (smap n2 V2) ML2) n2 V2
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) n1 V1
H13 : to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv T1 K V2 V1
H17 : subst_equiv L3 K ML2 ML'1
H18 : {val' V1}
H19 : {eval' V1 V1}
============================
exists V', {eval' V1 V'} /\ equiv T1 K V2 V'
Subgoal 2.1.2.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < search.
Subgoal 2.1.2.2:
Variables: K T V M'' Map1 Vs1 T1 L2 V1 ML'1 ML2 V2 L3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H11 : app_subst (smcons (smap n2 V2) ML2) n2 (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) n1 (M'' n1)
H13 : to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv T1 K V2 V1
H17 : subst_equiv L3 K ML2 ML'1
H18 : member (of n2 T) L3
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
Subgoal 2.2 is:
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < apply member_prune_tm to H18.
Subgoal 2.2:
Variables: L ML ML' K X T V M' M'' Map1 X' X1 Vs'1 Vs1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv L K ML ML'
H6 : vars_of_ctx L (scons X1 Vs1)
H7 : vars_of_subst' ML' (ccons 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 : {mmember (map X M') Map1}
============================
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H6.
Subgoal 2.2:
Variables: ML ML' K X T V M' M'' Map1 X' X1 Vs'1 Vs1 L1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L1)
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv (of X1 T1 :: L1) K ML ML'
H7 : vars_of_subst' ML' (ccons 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 : {mmember (map X M') Map1}
H15 : vars_of_ctx L1 Vs1
============================
exists V', {eval' M'' V'} /\ equiv T K V V'
var_sem_pres < case H7.
Subgoal 2.2:
Variables: ML K X T V M' M'' Map1 X1 Vs1 L1 T1 L2 ML1 V1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L1 n1)
H3 : subst (ML n1)
H4 : subst' (cmcons (cmap n1 V1) ML1)
H5 : subst_equiv (of X1 T1 :: L1 n1) K (ML n1) (cmcons (cmap n1 V1) ML1)
H9 : member (of X T) (of X1 T1 :: L1 n1)
H11 : app_subst (ML n1) X V
H12 : app_subst' (cmcons (cmap n1 V1) ML1) (M' n1) (M'' n1)
H13 : to_mapping Vs1 L2 (Map1 n1) *
H14 : {mmember (map X (M' n1)) (Map1 n1)}
H15 : vars_of_ctx (L1 n1) Vs1
H16 : vars_of_subst' ML1 L2
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
var_sem_pres < case H5.
Subgoal 2.2.1:
Variables: K X T V M' M'' Map1 X1 Vs1 T1 L2 V1 ML2 L4
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H9 : member (of X T) (of X1 T1 :: L4)
H11 : app_subst ML2 X V
H12 : app_subst' (cmcons (cmap n1 V1) cmnil) (M' n1) (M'' n1)
H13 : to_mapping Vs1 L2 (Map1 n1) *
H14 : {mmember (map X (M' n1)) (Map1 n1)}
H15 : vars_of_ctx L4 Vs1
H16 : vars_of_subst' cmnil L2
H17 : subst_env_equiv (of X1 T1 :: L4) K ML2 V1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
Subgoal 2.2.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
var_sem_pres < case H16.
Subgoal 2.2.1:
Variables: K X T V M' M'' Map1 X1 Vs1 T1 V1 ML2 L4
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : subst' (cmcons (cmap n1 V1) cmnil)
H9 : member (of X T) (of X1 T1 :: L4)
H11 : app_subst ML2 X V
H12 : app_subst' (cmcons (cmap n1 V1) cmnil) (M' n1) (M'' n1)
H13 : to_mapping Vs1 cnil (Map1 n1) *
H14 : {mmember (map X (M' n1)) (Map1 n1)}
H15 : vars_of_ctx L4 Vs1
H17 : subst_env_equiv (of X1 T1 :: L4) K ML2 V1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K V V'
Subgoal 2.2.2 is:
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
var_sem_pres < case H13.
Subgoal 2.2.2:
Variables: K X T V M' M'' Map1 Vs1 T1 L2 V1 ML'1 ML2 V2 L3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H9 : member (of (X n2) T) (of n2 T1 :: L3)
H11 : app_subst (smcons (smap n2 V2) ML2) (X n2) (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) (M' n1) (M'' n1)
H13 : to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : {mmember (map (X n2) (M' n1)) (Map1 n2 n1)}
H15 : vars_of_ctx L3 (Vs1 n2)
H16 : vars_of_subst' ML'1 L2
H17 : equiv T1 K V2 V1
H18 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
var_sem_pres < apply vars_of_ctx_prune_tm to H15.
Subgoal 2.2.2:
Variables: K X T V M' M'' Map1 T1 L2 V1 ML'1 ML2 V2 L3 Vs'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H9 : member (of (X n2) T) (of n2 T1 :: L3)
H11 : app_subst (smcons (smap n2 V2) ML2) (X n2) (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) (M' n1) (M'' n1)
H13 : to_mapping Vs'2 L2 (Map1 n2 n1) *
H14 : {mmember (map (X n2) (M' n1)) (Map1 n2 n1)}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 L2
H17 : equiv T1 K V2 V1
H18 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
var_sem_pres < apply vars_of_subst'_prune_tm' to H16.
Subgoal 2.2.2:
Variables: K X T V M' M'' Map1 T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H9 : member (of (X n2) T) (of n2 T1 :: L3)
H11 : app_subst (smcons (smap n2 V2) ML2) (X n2) (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) (M' n1) (M'' n1)
H13 : to_mapping Vs'2 Vs'3 (Map1 n2 n1) *
H14 : {mmember (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 T1 K V2 V1
H18 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
var_sem_pres < apply to_mapping_prune_tm to H13.
Subgoal 2.2.2:
Variables: K X T V M' M'' T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H9 : member (of (X n2) T) (of n2 T1 :: L3)
H11 : app_subst (smcons (smap n2 V2) ML2) (X n2) (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) (M' n1) (M'' n1)
H13 : to_mapping Vs'2 Vs'3 (Map' n1) *
H14 : {mmember (map (X n2) (M' n1)) (Map' n1)}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
var_sem_pres < apply to_mapping_prune_tm' to H13.
Subgoal 2.2.2:
Variables: K X T V M' M'' T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H9 : member (of (X n2) T) (of n2 T1 :: L3)
H11 : app_subst (smcons (smap n2 V2) ML2) (X n2) (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) (M' n1) (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map (X n2) (M' n1)) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
var_sem_pres < apply mmember_prune_tm to H14.
Subgoal 2.2.2:
Variables: K T V M' M'' T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H9 : member (of M'2 T) (of n2 T1 :: L3)
H11 : app_subst (smcons (smap n2 V2) ML2) M'2 (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) (M' n1) (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 (M' n1)) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
var_sem_pres < apply mmember_prune_tm' to H14.
Subgoal 2.2.2:
Variables: K T V M'' T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H9 : member (of M'2 T) (of n2 T1 :: L3)
H11 : app_subst (smcons (smap n2 V2) ML2) M'2 (V n2)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) M'4 (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv L3 K ML2 ML'1
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K (V n2) V'
var_sem_pres < case H11.
Subgoal 2.2.2:
Variables: K T M'' T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4 M
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H9 : member (of M'2 T) (of n2 T1 :: L3)
H12 : app_subst' (cmcons (cmap n1 V1) ML'1) M'4 (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
============================
exists V', {eval' (M'' n1) V'} /\ equiv T K M V'
var_sem_pres < case H12.
Subgoal 2.2.2:
Variables: K T T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4 M M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H9 : member (of M'2 T) (of n2 T1 :: L3)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv 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 T K M V'
var_sem_pres < case H9.
Subgoal 2.2.2:
Variables: K T T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4 M M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv 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 T K M V'
var_sem_pres < apply IH to _ _ _ _ H18 H15 H16 H13 _ H14 H19 H20.
Subgoal 2.2.2.1:
Variables: K T T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4 M M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv 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 T K M V'
var_sem_pres < case H4.
Subgoal 2.2.2.1:
Variables: K T T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4 M M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv 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 T K M V'
var_sem_pres < search.
Subgoal 2.2.2.2:
Variables: K T T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4 M M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv 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 T K M V'
var_sem_pres < case H3.
Subgoal 2.2.2.2:
Variables: K T T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4 M M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv 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 : name n2
H24 : {val V2}
H25 : {tm V2}
H26 : forall V', smmember (smap n2 V') ML2 -> V' = V2
============================
subst ML2
Subgoal 2.2.2.3 is:
ctx L3
Subgoal 2.2.2 is:
exists V', {eval' M1 V'} /\ equiv T K M V'
var_sem_pres < search.
Subgoal 2.2.2.3:
Variables: K T T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4 M M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv 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 T K M V'
var_sem_pres < case H2.
Subgoal 2.2.2.3:
Variables: K T T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4 M M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv 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 : name n2
H24 : {is_sty T1}
H25 : forall T', member (of n2 T') L3 -> T1 = T'
============================
ctx L3
Subgoal 2.2.2 is:
exists V', {eval' M1 V'} /\ equiv T K M V'
var_sem_pres < search.
Subgoal 2.2.2:
Variables: K T T1 V1 ML'1 ML2 V2 L3 Vs'2 Vs'3 Map'1 M'2 M'4 M M1 V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
to_mapping Vs Vs' Map * -> member (of X T) L ->
{mmember (map X M') Map} -> app_subst ML X V ->
app_subst' ML' M' M'' -> (exists V', {eval' M'' V'} /\ equiv T K V V')
H1 : {is_nat K}
H2 : ctx (of n2 T1 :: L3)
H3 : subst (smcons (smap n2 V2) ML2)
H4 : subst' (cmcons (cmap n1 V1) ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {mmember (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv T1 K V2 V1
H18 : subst_equiv 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 T K M V'
============================
exists V', {eval' M1 V'} /\ equiv 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 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 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 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 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 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 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 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 L' K ML VE')
mapenv_sem_pres < intros.
Variables: L L' ML ML' K Vs Vs' NFVs Map E E'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 L' K ML VE'
mapenv_sem_pres < case H10.
Subgoal 1:
Variables: L L' ML ML' K Vs Vs' Map E'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 snil L L'
H11 : app_subst' ML' unit' E'
============================
exists VE', {eval' E' VE'} /\ subst_env_equiv L' K ML VE'
Subgoal 2 is:
exists VE', {eval' E' VE'} /\ subst_env_equiv L' K ML VE'
mapenv_sem_pres < case H9.
Subgoal 1:
Variables: L ML ML' K Vs Vs' Map E'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 nil K ML VE'
Subgoal 2 is:
exists VE', {eval' E' VE'} /\ subst_env_equiv L' K ML VE'
mapenv_sem_pres < apply app_subst'_unit_comm to H11.
Subgoal 1:
Variables: L ML ML' K Vs Vs' Map
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 nil K ML VE'
Subgoal 2 is:
exists VE', {eval' E' VE'} /\ subst_env_equiv L' K ML VE'
mapenv_sem_pres < search.
Subgoal 2:
Variables: L L' ML ML' K Vs Vs' Map E' ML1 L1 M X
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (scons X L1) L L'
H11 : app_subst' ML' (pair' M ML1) E'
H12 : {mmember (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
============================
exists VE', {eval' E' VE'} /\ subst_env_equiv L' K ML VE'
mapenv_sem_pres < case H9.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map E' ML1 L1 M X L'1 T
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 (of X T :: L'1) K ML VE'
mapenv_sem_pres < apply app_subst'_pair_comm to H11.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 (of X T :: L'1) K ML VE'
mapenv_sem_pres < apply ctx_mem_to_lst_mem to H6 H14.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 : {smember X Vs}
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv (of X T :: L'1) K ML VE'
mapenv_sem_pres < apply subst_equiv_mem to H5 H6 H18.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2' V
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 : {smember X Vs}
H19 : smmember (smap X V) ML
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv (of X T :: L'1) K ML VE'
mapenv_sem_pres < apply subst_var to H3 H19.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2' V
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 : {smember X Vs}
H19 : smmember (smap X V) ML
H20 : app_subst ML X V
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv (of X T :: L'1) K ML VE'
mapenv_sem_pres < assert exists V', {eval' M1' V'} /\ equiv T K V V'.
Subgoal 2.1:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2' V
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 : {smember X Vs}
H19 : smmember (smap X V) ML
H20 : app_subst ML X V
============================
exists V', {eval' M1' V'} /\ equiv T K V V'
Subgoal 2 is:
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv (of X T :: L'1) K ML VE'
mapenv_sem_pres < backchain var_sem_pres.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2' V
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 : {smember X Vs}
H19 : smmember (smap X V) ML
H20 : app_subst ML X V
H21 : exists V', {eval' M1' V'} /\ equiv T K V V'
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv (of X T :: L'1) K ML VE'
mapenv_sem_pres < case H21.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2' V V'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 : {smember X Vs}
H19 : smmember (smap X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv T K V V'
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv (of X T :: L'1) K ML VE'
mapenv_sem_pres < apply IH to _ _ _ _ _ _ _ _ H15 H13 H17.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2' V V' VE'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 : {smember X Vs}
H19 : smmember (smap X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv L'1 K ML VE'
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv (of X T :: L'1) K ML VE'
mapenv_sem_pres < assert subst_env_equiv (of X T :: L'1) K ML (pair' V' VE').
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2' V V' VE'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 : {smember X Vs}
H19 : smmember (smap X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv L'1 K ML VE'
H26 : subst_env_equiv (of X T :: L'1) K ML (pair' V' VE')
============================
exists VE', {eval' (pair' M1' M2') VE'} /\
subst_env_equiv (of X T :: L'1) K ML VE'
mapenv_sem_pres < assert {eval' (pair' M1' M2') (pair' V' VE')}.
Subgoal 2.2:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2' V V' VE'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 : {smember X Vs}
H19 : smmember (smap X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv L'1 K ML VE'
H26 : subst_env_equiv (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 (of X T :: L'1) K ML VE'
mapenv_sem_pres < backchain eval'_pair_fwd.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map ML1 L1 M X L'1 T M1' M2' V V' VE'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
subst ML -> subst' ML' -> subst_equiv 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 L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (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 : {smember X Vs}
H19 : smmember (smap X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv L'1 K ML VE'
H26 : subst_env_equiv (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 (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} -> {mmember (map M M') (Map E)} ->
{smember M Vs}.
============================
forall Vs Map M M' E, {mapvar Vs Map} -> {mmember (map M M') (Map E)} ->
{smember M Vs}
mapvar_to_lst_mem < induction on 1.
IH : forall Vs Map M M' E, {mapvar Vs Map}* ->
{mmember (map M M') (Map E)} -> {smember M Vs}
============================
forall Vs Map M M' E, {mapvar Vs Map}@ -> {mmember (map M M') (Map E)} ->
{smember M Vs}
mapvar_to_lst_mem < intros.
Variables: Vs Map M M' E
IH : forall Vs Map M M' E, {mapvar Vs Map}* ->
{mmember (map M M') (Map E)} -> {smember M Vs}
H1 : {mapvar Vs Map}@
H2 : {mmember (map M M') (Map E)}
============================
{smember M Vs}
mapvar_to_lst_mem < case H1.
Subgoal 1:
Variables: M M' E
IH : forall Vs Map M M' E, {mapvar Vs Map}* ->
{mmember (map M M') (Map E)} -> {smember M Vs}
H2 : {mmember (map M M') mnil}
============================
{smember M snil}
Subgoal 2 is:
{smember M (scons X L)}
mapvar_to_lst_mem < case H2.
Subgoal 2:
Variables: M M' E Map1 L X
IH : forall Vs Map M M' E, {mapvar Vs Map}* ->
{mmember (map M M') (Map E)} -> {smember M Vs}
H2 : {mmember (map M M') (mcons (map X (fst' E)) (Map1 (snd' E)))}
H3 : {mapvar L Map1}*
============================
{smember M (scons X L)}
mapvar_to_lst_mem < case H2.
Subgoal 2.1:
Variables: E Map1 L X
IH : forall Vs Map M M' E, {mapvar Vs Map}* ->
{mmember (map M M') (Map E)} -> {smember M Vs}
H3 : {mapvar L Map1}*
============================
{smember X (scons X L)}
Subgoal 2.2 is:
{smember M (scons X L)}
mapvar_to_lst_mem < search.
Subgoal 2.2:
Variables: M M' E Map1 L X
IH : forall Vs Map M M' E, {mapvar Vs Map}* ->
{mmember (map M M') (Map E)} -> {smember M Vs}
H3 : {mapvar L Map1}*
H4 : {mmember (map M M') (Map1 (snd' E))}
============================
{smember M (scons X L)}
mapvar_to_lst_mem < apply IH to H3 H4.
Subgoal 2.2:
Variables: M M' E Map1 L X
IH : forall Vs Map M M' E, {mapvar Vs Map}* ->
{mmember (map M M') (Map E)} -> {smember M Vs}
H3 : {mapvar L Map1}*
H4 : {mmember (map M M') (Map1 (snd' E))}
H5 : {smember M L}
============================
{smember M (scons 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 -> {mmember (map M M') Map} ->
{smember M Vs}.
============================
forall Vs Vs' Map M M', to_mapping Vs Vs' Map -> {mmember (map M M') Map} ->
{smember M Vs}
map_mem_to_lst_mem < induction on 1.
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{mmember (map M M') Map} -> {smember M Vs}
============================
forall Vs Vs' Map M M', to_mapping Vs Vs' Map @ ->
{mmember (map M M') Map} -> {smember M Vs}
map_mem_to_lst_mem < intros.
Variables: Vs Vs' Map M M'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{mmember (map M M') Map} -> {smember M Vs}
H1 : to_mapping Vs Vs' Map @
H2 : {mmember (map M M') Map}
============================
{smember M Vs}
map_mem_to_lst_mem < case H1.
Subgoal 1:
Variables: Vs M M' E Map1
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{mmember (map M M') Map} -> {smember M Vs}
H2 : {mmember (map M M') (Map1 E)}
H3 : {mapvar Vs Map1}
============================
{smember M Vs}
Subgoal 2 is:
{smember M (scons X Vs1)}
map_mem_to_lst_mem < backchain mapvar_to_lst_mem.
Subgoal 2:
Variables: M M' Map1 X' X Vs'1 Vs1
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{mmember (map M M') Map} -> {smember M Vs}
H2 : {mmember (map M M') (mcons (map X X') Map1)}
H3 : to_mapping Vs1 Vs'1 Map1 *
============================
{smember M (scons X Vs1)}
map_mem_to_lst_mem < case H2.
Subgoal 2.1:
Variables: Map1 X' X Vs'1 Vs1
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{mmember (map M M') Map} -> {smember M Vs}
H3 : to_mapping Vs1 Vs'1 Map1 *
============================
{smember X (scons X Vs1)}
Subgoal 2.2 is:
{smember M (scons X Vs1)}
map_mem_to_lst_mem < search.
Subgoal 2.2:
Variables: M M' Map1 X' X Vs'1 Vs1
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{mmember (map M M') Map} -> {smember M Vs}
H3 : to_mapping Vs1 Vs'1 Map1 *
H4 : {mmember (map M M') Map1}
============================
{smember M (scons X Vs1)}
map_mem_to_lst_mem < apply IH to H3 H4.
Subgoal 2.2:
Variables: M M' Map1 X' X Vs'1 Vs1
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
{mmember (map M M') Map} -> {smember M Vs}
H3 : to_mapping Vs1 Vs'1 Map1 *
H4 : {mmember (map M M') Map1}
H5 : {smember M Vs1}
============================
{smember M (scons 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 L K ML ML' ->
vars_of_ctx L Vs -> {smember M Vs} -> app_subst ML M V -> {val V}.
============================
forall L K ML ML' Vs M V, subst ML -> subst_equiv L K ML ML' ->
vars_of_ctx L Vs -> {smember M Vs} -> app_subst ML M V -> {val V}
app_subst_var_val < intros.
Variables: L K ML ML' Vs M V
H1 : subst ML
H2 : subst_equiv L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {smember M Vs}
H5 : app_subst ML M V
============================
{val V}
app_subst_var_val < apply subst_equiv_mem to H2 H3 H4.
Variables: L K ML ML' Vs M V V1
H1 : subst ML
H2 : subst_equiv L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {smember M Vs}
H5 : app_subst ML M V
H6 : smmember (smap M V1) ML
============================
{val V}
app_subst_var_val < apply subst_var_eq to H1 H6 H5.
Variables: L K ML ML' Vs M V1
H1 : subst ML
H2 : subst_equiv L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {smember M Vs}
H5 : app_subst ML M V1
H6 : smmember (smap M V1) ML
============================
{val V1}
app_subst_var_val < apply subst_mem to H1 H6.
Variables: L K ML ML' Vs X V2
H1 : subst ML
H2 : subst_equiv L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {smember X Vs}
H5 : app_subst ML X V2
H6 : smmember (smap 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 L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> {L |- of M T} ->
{cc Map Vs M M'} -> app_subst ML M P -> app_subst' ML' M' P' ->
sim 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 L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> {L |- of M T} ->
{cc Map Vs M M'} -> app_subst ML M P -> app_subst' ML' M' P' ->
sim 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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim 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 L K ML ML' -> vars_of_ctx L Vs ->
vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> {L |- of M T} ->
{cc Map Vs M M'}@ -> app_subst ML M P -> app_subst' ML' M' P' ->
sim T K P P'
cc_sem_pres < intros.
Variables: L ML ML' K Vs Vs' Map T P P' M M'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
cc_sem_pres < case H10.
Subgoal 1:
Variables: L ML ML' K Vs Vs' Map T P P' N
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
Subgoal 2 is:
sim T K P P'
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply subst_closed_tm_eq to _ H11.
Subgoal 1:
Variables: L ML ML' K Vs Vs' Map T P' N
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (nat N) P'
Subgoal 2 is:
sim T K P P'
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply subst'_closed_tm_eq to _ H12.
Subgoal 1:
Variables: L ML ML' K Vs Vs' Map T N
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (nat N) (nat' N)
Subgoal 2 is:
sim T K P P'
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply of_nat_inv to H2 H9.
Subgoal 1:
Variables: L ML ML' K Vs Vs' Map N
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K (nat N) (nat' N)
Subgoal 2 is:
sim T K P P'
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_nat.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map T P P' M M'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (map M M') Map}*
============================
sim T K P P'
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply map_mem_to_lst_mem to _ H13.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map T P P' M M'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (map M M') Map}*
H14 : {smember M Vs}
============================
sim T K P P'
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert member (of M T) L.
Subgoal 2.1:
Variables: L ML ML' K Vs Vs' Map T P P' M M'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (map M M') Map}*
H14 : {smember M Vs}
============================
member (of M T) L
Subgoal 2 is:
sim T K P P'
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_name to _ _ H14.
Subgoal 2.1:
Variables: L ML ML' K Vs Vs' Map T P P' M M'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (map M M') Map}*
H14 : {smember M Vs}
H15 : name M
============================
member (of M T) L
Subgoal 2 is:
sim T K P P'
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain of_var_inv.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map T P P' M M'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (map M M') Map}*
H14 : {smember M Vs}
H15 : member (of M T) L
============================
sim T K P P'
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply var_sem_pres to _ _ _ _ _ _ _ _ H15 H13 _ _.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map T P P' M M' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (map M M') Map}*
H14 : {smember M Vs}
H15 : member (of M T) L
H16 : {eval' P' V'}
H17 : equiv T K P V'
============================
sim T K P P'
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_val_tm'.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map T P P' M M' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (map M M') Map}*
H14 : {smember M Vs}
H15 : member (of M T) L
H16 : {eval' P' V'}
H17 : equiv T K P V'
============================
{val P}
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst_var_val to _ _ _ _ H11.
Subgoal 2:
Variables: L ML ML' K Vs Vs' Map T P P' M M' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {mmember (map M M') Map}*
H14 : {smember M Vs}
H15 : member (of M T) L
H16 : {eval' P' V'}
H17 : equiv T K P V'
H18 : {val P}
============================
{val P}
Subgoal 3 is:
sim T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search.
Subgoal 3:
Variables: L ML ML' K Vs Vs' Map T P P' M'1 M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst_pred_comm to H11.
Subgoal 3:
Variables: L ML ML' K Vs Vs' Map T P' M'1 M1 M''
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (pred M'') P'
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst'_pred_comm to H12.
Subgoal 3:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M'' M''1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (pred M'') (pred' M''1)
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H9.
Subgoal 3.1:
Variables: L ML ML' K Vs Vs' Map M'1 M1 M'' M''1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K (pred M'') (pred' M''1)
Subgoal 3.2 is:
sim T K (pred M'') (pred' M''1)
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim tnat K M'' M''1.
Subgoal 3.1.1:
Variables: L ML ML' K Vs Vs' Map M'1 M1 M'' M''1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M'' M''1
Subgoal 3.1 is:
sim tnat K (pred M'') (pred' M''1)
Subgoal 3.2 is:
sim T K (pred M'') (pred' M''1)
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH.
Subgoal 3.1:
Variables: L ML ML' K Vs Vs' Map M'1 M1 M'' M''1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M'' M''1
============================
sim tnat K (pred M'') (pred' M''1)
Subgoal 3.2 is:
sim T K (pred M'') (pred' M''1)
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_pred.
Subgoal 3.2:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M'' M''1 F
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (pred M'') (pred' M''1)
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H16.
Subgoal 3.2:
Variables: L ML ML' K Vs Vs' Map M'1 M1 M'' M''1 F T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K (pred M'') (pred' M''1)
Subgoal 4 is:
sim T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H18.
Subgoal 4:
Variables: L ML ML' K Vs Vs' Map T P P' M2' M2 M1' M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst_plus_comm to H11.
Subgoal 4:
Variables: L ML ML' K Vs Vs' Map T P' M2' M2 M1' M1 M1'1 M2'1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (plus M1'1 M2'1) P'
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst'_plus_comm to H12.
Subgoal 4:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H9.
Subgoal 4.1:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 4.2 is:
sim T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim tnat K M1'1 M1'2.
Subgoal 4.1.1:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M1'1 M1'2
Subgoal 4.1 is:
sim tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 4.2 is:
sim T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH.
Subgoal 4.1:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M1'1 M1'2
============================
sim tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 4.2 is:
sim T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim tnat K M2'1 M2'2.
Subgoal 4.1.2:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M1'1 M1'2
============================
sim tnat K M2'1 M2'2
Subgoal 4.1 is:
sim tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 4.2 is:
sim T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH with M = M2, M' = M2'.
Subgoal 4.1:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M1'1 M1'2
H22 : sim tnat K M2'1 M2'2
============================
sim tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 4.2 is:
sim T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_plus.
Subgoal 4.2:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 F
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H19.
Subgoal 4.2:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 F T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K (plus M1'1 M2'1) (plus' M1'2 M2'2)
Subgoal 5 is:
sim T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H21.
Subgoal 5:
Variables: L ML ML' K Vs Vs' Map T P P' M2' M2 M1' M1 M'1 M3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst_ifz_comm to H11.
Subgoal 5:
Variables: L ML ML' K Vs Vs' Map T P' M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (ifz M'2 M1'1 M2'1) P'
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst'_ifz_comm to H12.
Subgoal 5:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3
M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H9.
Subgoal 5.1:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3
M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim tnat K M'2 M'3.
Subgoal 5.1.1:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3
M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M'2 M'3
Subgoal 5.1 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH.
Subgoal 5.1:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3
M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M'2 M'3
============================
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim T K M1'1 M1'2.
Subgoal 5.1.2:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3
M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M'2 M'3
============================
sim T K M1'1 M1'2
Subgoal 5.1 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH.
Subgoal 5.1:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3
M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M'2 M'3
H26 : sim T K M1'1 M1'2
============================
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim T K M2'1 M2'2.
Subgoal 5.1.3:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3
M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M'2 M'3
H26 : sim T K M1'1 M1'2
============================
sim T K M2'1 M2'2
Subgoal 5.1 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH with M = M2, M' = M2'.
Subgoal 5.1:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3
M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M'2 M'3
H26 : sim T K M1'1 M1'2
H27 : sim T K M2'1 M2'2
============================
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 5.2 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_ifz.
Subgoal 5.1:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3
M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tnat K M'2 M'3
H26 : sim T K M1'1 M1'2
H27 : sim T K M2'1 M2'2
============================
{is_sty T}
Subgoal 5.2 is:
sim T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain of_is_sty with M = M1.
Subgoal 5.2:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3
M1'2 M2'2 F
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H22.
Subgoal 5.2:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M'1 M3 M'2 M1'1 M2'1 M'3 M1'2
M2'2 F T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)
Subgoal 6 is:
sim T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H24.
Subgoal 6:
Variables: L ML ML' K Vs Vs' Map T P P'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply subst_closed_tm_eq to _ H11.
Subgoal 6:
Variables: L ML ML' K Vs Vs' Map T P'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K unit P'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply subst'_closed_tm_eq to _ H12.
Subgoal 6:
Variables: L ML ML' K Vs Vs' Map T
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K unit unit'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H9.
Subgoal 6.1:
Variables: L ML ML' K Vs Vs' Map
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 tunit K unit unit'
Subgoal 6.2 is:
sim T K unit unit'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_unit.
Subgoal 6.2:
Variables: L ML ML' K Vs Vs' Map T F
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K unit unit'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H13.
Subgoal 6.2:
Variables: L ML ML' K Vs Vs' Map F T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K unit unit'
Subgoal 7 is:
sim T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H15.
Subgoal 7:
Variables: L ML ML' K Vs Vs' Map T P P' M2' M2 M1' M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst_pair_comm to H11.
Subgoal 7:
Variables: L ML ML' K Vs Vs' Map T P' M2' M2 M1' M1 M1'1 M2'1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (pair M1'1 M2'1) P'
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst'_pair_comm to H12.
Subgoal 7:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H9.
Subgoal 7.1:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 7.2 is:
sim T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim T1 K M1'1 M1'2.
Subgoal 7.1.1:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K M1'1 M1'2
Subgoal 7.1 is:
sim (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 7.2 is:
sim T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH.
Subgoal 7.1:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K M1'1 M1'2
============================
sim (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 7.2 is:
sim T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim T2 K M2'1 M2'2.
Subgoal 7.1.2:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K M1'1 M1'2
============================
sim T2 K M2'1 M2'2
Subgoal 7.1 is:
sim (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 7.2 is:
sim T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH with M = M2, M' = M2'.
Subgoal 7.1:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K M1'1 M1'2
H22 : sim T2 K M2'1 M2'2
============================
sim (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 7.2 is:
sim T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_pair.
Subgoal 7.1.3:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K M1'1 M1'2
H22 : sim T2 K M2'1 M2'2
============================
{is_sty T1}
Subgoal 7.1.4 is:
{is_sty T2}
Subgoal 7.2 is:
sim T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain of_is_sty.
Subgoal 7.1.4:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K M1'1 M1'2
H22 : sim T2 K M2'1 M2'2
============================
{is_sty T2}
Subgoal 7.2 is:
sim T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain of_is_sty.
Subgoal 7.2:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 F
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H19.
Subgoal 7.2:
Variables: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M1'1 M2'1 M1'2 M2'2 F T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K (pair M1'1 M2'1) (pair' M1'2 M2'2)
Subgoal 8 is:
sim T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H21.
Subgoal 8:
Variables: L ML ML' K Vs Vs' Map T P P' M'1 M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst_fst_comm to H11.
Subgoal 8:
Variables: L ML ML' K Vs Vs' Map T P' M'1 M1 M1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (fst M1') P'
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst'_fst_comm to H12.
Subgoal 8:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H9.
Subgoal 8.1:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1 T2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (fst M1') (fst' M1'1)
Subgoal 8.2 is:
sim T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim (prod T T2) K M1' M1'1.
Subgoal 8.1.1:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1 T2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (prod T T2) K M1' M1'1
Subgoal 8.1 is:
sim T K (fst M1') (fst' M1'1)
Subgoal 8.2 is:
sim T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH.
Subgoal 8.1:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1 T2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (prod T T2) K M1' M1'1
============================
sim T K (fst M1') (fst' M1'1)
Subgoal 8.2 is:
sim T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_fst.
Subgoal 8.1:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1 T2
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (prod T T2) K M1' M1'1
============================
{is_sty (prod T T2)}
Subgoal 8.2 is:
sim T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain of_is_sty.
Subgoal 8.2:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1 F
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H16.
Subgoal 8.2:
Variables: L ML ML' K Vs Vs' Map M'1 M1 M1' M1'1 F T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K (fst M1') (fst' M1'1)
Subgoal 9 is:
sim T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H18.
Subgoal 9:
Variables: L ML ML' K Vs Vs' Map T P P' M'1 M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst_snd_comm to H11.
Subgoal 9:
Variables: L ML ML' K Vs Vs' Map T P' M'1 M1 M1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (snd M1') P'
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply app_subst'_snd_comm to H12.
Subgoal 9:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H9.
Subgoal 9.1:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (snd M1') (snd' M1'1)
Subgoal 9.2 is:
sim T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim (prod T1 T) K M1' M1'1.
Subgoal 9.1.1:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (prod T1 T) K M1' M1'1
Subgoal 9.1 is:
sim T K (snd M1') (snd' M1'1)
Subgoal 9.2 is:
sim T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH.
Subgoal 9.1:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (prod T1 T) K M1' M1'1
============================
sim T K (snd M1') (snd' M1'1)
Subgoal 9.2 is:
sim T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_snd with T1 = T1.
Subgoal 9.1:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (prod T1 T) K M1' M1'1
============================
{is_sty (prod T1 T)}
Subgoal 9.2 is:
sim T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain of_is_sty.
Subgoal 9.2:
Variables: L ML ML' K Vs Vs' Map T M'1 M1 M1' M1'1 F
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H16.
Subgoal 9.2:
Variables: L ML ML' K Vs Vs' Map M'1 M1 M1' M1'1 F T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T1 K (snd M1') (snd' M1'1)
Subgoal 10 is:
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H18.
Subgoal 10:
Variables: L ML ML' K Vs Vs' Map T P P' R' R M'1 M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
============================
sim T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map T P P' R' R M'1 M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons 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 T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain app_subst_let_comm.
Subgoal 10:
Variables: L ML ML' K Vs Vs' Map T P P' R' R M'1 M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons 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 T K P P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H15.
Subgoal 10:
Variables: L ML ML' K Vs Vs' Map T P' R' R M'1 M1 M2 R1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
============================
sim T K (let M2 R1) P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map T P' R' R M'1 M1 M2 R1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : 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 T K (let M2 R1) P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain app_subst'_let_comm.
Subgoal 10:
Variables: L ML ML' K Vs Vs' Map T P' R' R M'1 M1 M2 R1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : 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 T K (let M2 R1) P'
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H18.
Subgoal 10:
Variables: L ML ML' K Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
============================
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H9.
Subgoal 10.3:
Variables: L ML ML' K Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
============================
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim T1 K M2 M'2.
Subgoal 10.3.1:
Variables: L ML ML' K Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
============================
sim T1 K M2 M'2
Subgoal 10.3 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH.
Subgoal 10.3:
Variables: L ML ML' K Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim T1 K M2 M'2
============================
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < unfold.
Subgoal 10.3:
Variables: L ML ML' K Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T N V V')
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < intros.
Subgoal 10.3:
Variables: L ML ML' K Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 J V
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply nstep_let_inv to _ H25.
Subgoal 10.3:
Variables: L ML ML' K Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H24.
Subgoal 10.3:
Variables: L ML ML' K Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1
N
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H31.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply add_assoc to H27 H32.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert exists V1', {eval' M'2 V1'} /\ equiv T1 (s N23) V1 V1'.
Subgoal 10.3.2:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_nstep.
Subgoal 10.3.2:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain add_s.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H35.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply of_is_sty to _ H21.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert {is_nat N23}.
Subgoal 10.3.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain add_arg2_isnat.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply equiv_tm to _ _ H37.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply equiv_tm' to _ _ H37.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim T (s N23) (R1 V1) (R'1 V1').
Subgoal 10.3.4:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
sim 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain IH with L = of n1 T1 :: L, ML = smcons (smap n1 V1) ML, ML' = cmcons (cmap n2 V1') ML', Vs = scons n1 Vs, Vs' = ccons n2 Vs', Map = mcons (map n1 n2) Map, T = T, M = R n1, M' = R' n2.
Subgoal 10.3.4.1:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
ctx (of n1 T1 :: L)
Subgoal 10.3.4.2 is:
subst (smcons (smap n1 V1) ML)
Subgoal 10.3.4.3 is:
subst' (cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.4 is:
subst_equiv (of n1 T1 :: L) (s N23) (smcons (smap n1 V1) ML)
(cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H1.
Subgoal 10.3.4.1:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : {is_nat N3}
============================
ctx (of n1 T1 :: L)
Subgoal 10.3.4.2 is:
subst (smcons (smap n1 V1) ML)
Subgoal 10.3.4.3 is:
subst' (cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.4 is:
subst_equiv (of n1 T1 :: L) (s N23) (smcons (smap n1 V1) ML)
(cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain ctx_extend.
Subgoal 10.3.4.2:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
subst (smcons (smap n1 V1) ML)
Subgoal 10.3.4.3 is:
subst' (cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.4 is:
subst_equiv (of n1 T1 :: L) (s N23) (smcons (smap n1 V1) ML)
(cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_extend.
Subgoal 10.3.4.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
subst' (cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.4 is:
subst_equiv (of n1 T1 :: L) (s N23) (smcons (smap n1 V1) ML)
(cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst'_extend.
Subgoal 10.3.4.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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.4 is:
subst_equiv (of n1 T1 :: L) (s N23) (smcons (smap n1 V1) ML)
(cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H36.
Subgoal 10.3.4.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' N1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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.4 is:
subst_equiv (of n1 T1 :: L) (s N23) (smcons (smap n1 V1) ML)
(cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search.
Subgoal 10.3.4.4:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
subst_equiv (of n1 T1 :: L) (s N23) (smcons (smap n1 V1) ML)
(cmcons (cmap n2 V1') ML')
Subgoal 10.3.4.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_equiv_extend.
Subgoal 10.3.4.4:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
subst_equiv L (s N23) ML ML'
Subgoal 10.3.4.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_equiv_closed.
Subgoal 10.3.4.4:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < unfold.
Subgoal 10.3.4.4:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < exists K1.
Subgoal 10.3.4.4:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain add_comm.
Subgoal 10.3.4.4:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 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.5 is:
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain add_s.
Subgoal 10.3.4.5:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
app_subst (smcons (smap n1 V1) ML) (R n1) (R1 V1)
Subgoal 10.3.4.6 is:
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain explct_meta_subst_comm with E = R1.
Subgoal 10.3.4.6:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
app_subst' (cmcons (cmap 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain explct_meta_subst'_comm with E = R'1.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert exists V', {eval' (R'1 V1') V'} /\ equiv T (s N) V V'.
Subgoal 10.3.5:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
============================
exists V', {eval' (R'1 V1') V'} /\ equiv 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_nstep.
Subgoal 10.3.5:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain add_s.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H43 : exists V', {eval' (R'1 V1') V'} /\ equiv T (s N) V V'
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H43.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv T (s N) V V'
============================
exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < exists V'.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv T (s N) V V'
============================
exists N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
equiv T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < exists N.
Subgoal 10.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv T (s N) V V'
============================
{eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\ equiv T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < split.
Subgoal 10.3.6:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv 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 T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain eval'_let_fwd.
Subgoal 10.3.7:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv T (s N) V V'
============================
{add (s K3) N (s N3)}
Subgoal 10.3.8 is:
equiv T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search.
Subgoal 10.3.8:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv T (s N) V V'
============================
equiv T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert {is_nat N}.
Subgoal 10.3.8.1:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv T (s N) V V'
============================
{is_nat N}
Subgoal 10.3.8 is:
equiv T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain add_arg2_isnat.
Subgoal 10.3.8:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv T (s N) V V'
H46 : {is_nat N}
============================
equiv T N V V'
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain equiv_closed with K = s N.
Subgoal 10.3.8.2:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv 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 T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain of_is_sty.
Subgoal 10.3.8.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv T (s N) V V'
H46 : {is_nat N}
============================
le N (s N)
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < unfold.
Subgoal 10.3.8.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv T (s N) V V'
H46 : {is_nat N}
============================
exists N1, {add N N1 (s N)}
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < exists s z.
Subgoal 10.3.8.3:
Variables: L ML ML' Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 T1 V K1 K2 K3 V1 N
N3 N23 V1' V'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : {L, of n1 T1 |- of (R n1) T}
H23 : sim 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 T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv T (s N) V V'
H46 : {is_nat N}
============================
{add N (s z) (s N)}
Subgoal 10.4 is:
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain add_comm.
Subgoal 10.4:
Variables: L ML ML' K Vs Vs' Map T R' R M'1 M1 M2 R1 M'2 R'1 F
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : app_subst' ML' (R' n1) (R'1 n1)
H21 : {L, [F] |- of (let M1 R) T}
H22 : member F L
============================
sim T K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H21.
Subgoal 10.4:
Variables: L ML ML' K Vs Vs' Map R' R M'1 M1 M2 R1 M'2 R'1 F T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n1 n2) Map) (scons n1 Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : app_subst ML (R n1) (R1 n1)
H19 : app_subst' ML' M'1 M'2
H20 : 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 T1 K (let M2 R1) (let' M'2 R'1)
Subgoal 11 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H23.
Subgoal 11:
Variables: L ML ML' K Vs Vs' Map T P P' R' R FVs NMap E
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
============================
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert exists L', prune_ctx FVs L L' /\ {L' |- of (fix R) T}.
Subgoal 11.1:
Variables: L ML ML' K Vs Vs' Map T P P' R' R FVs NMap E
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons 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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain fvars_typing_pres with L = L, Vs = Vs, FVs = FVs.
Subgoal 11:
Variables: L ML ML' K Vs Vs' Map T P P' R' R FVs NMap E
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H17 : exists L', prune_ctx FVs L L' /\ {L' |- of (fix R) T}
============================
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H17.
Subgoal 11:
Variables: L ML ML' K Vs Vs' Map T P P' R' R FVs NMap E L'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H19 : {L' |- of (fix R) T}
============================
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert ctx L'.
Subgoal 11.2:
Variables: L ML ML' K Vs Vs' Map T P P' R' R FVs NMap E L'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons 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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain prune_ctx_pres.
Subgoal 11:
Variables: L ML ML' K Vs Vs' Map T P P' R' R FVs NMap E L'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons 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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H19.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map P P' R' R FVs NMap E L' T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
============================
sim (arr T1 T2) K P P'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert vars_of_ctx L' FVs.
Subgoal 11.3.1:
Variables: L ML ML' K Vs Vs' Map P P' R' R FVs NMap E L' T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 (arr T1 T2) K P P'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain prune_ctx_vars_of.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map P P' R' R FVs NMap E L' T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 (arr T1 T2) K P P'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply is_sty_str to _ H22.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map P P' R' R FVs NMap E L' T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 (arr T1 T2) K P P'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H24 (keep).
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map P P' R' R FVs NMap E L' T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 (arr T1 T2) K P P'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map P P' R' R FVs NMap E L' T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 (arr T1 T2) K P P'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain app_subst_fix_comm.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map P P' R' R FVs NMap E L' T2 T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 (arr T1 T2) K P P'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H27.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map P' R' R FVs NMap E L' T2 T1 R1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : app_subst ML (R n1 n2) (R1 n1 n2)
============================
sim (arr T1 T2) K (fix R1) P'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map P' R' R FVs NMap E L' T2 T1 R1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 (arr T1 T2) K (fix R1) P'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain app_subst'_clos_comm.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map P' R' R FVs NMap E L' T2 T1 R1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 (arr T1 T2) K (fix R1) P'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H29.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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' 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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply reified_env_exists to H20.
Subgoal 11.3.4.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E' 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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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
============================
{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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E' 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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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
============================
{of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
Subgoal 11.3.4.1 is:
{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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E' 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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 : {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
============================
{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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim 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 = ccons n4 (ccons n3 (ccons n5 cnil)).
Subgoal 11.3.4.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E' 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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 : {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
============================
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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply sty_to_cty to H25.
Subgoal 11.3.4.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E' 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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 : {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H34 : {is_cty T1}
============================
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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply sty_to_cty to H26.
Subgoal 11.3.4.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E' 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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 : {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}
============================
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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply reified_env_sty to _ H32.
Subgoal 11.3.4.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E' 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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 : {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}
============================
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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply sty_to_cty to H36.
Subgoal 11.3.4.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E' 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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 : {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}
============================
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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search.
Subgoal 11.3.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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' 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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search 7.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst'_closed_tm_eq.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 F' E'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 (arr T1 T2) K (fix R1) (clos' F' E')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H33.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert exists VE', {eval' E' VE'} /\ subst_env_equiv L' K ML VE'.
Subgoal 11.3.6:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
Subgoal 11.3 is:
sim (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain mapenv_sem_pres.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
============================
sim (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H34.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
============================
sim (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert equiv (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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
============================
equiv (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert equiv_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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
============================
equiv_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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < unfold.
Subgoal 11.3.7.1.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H35.
Subgoal 11.3.7.1.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' N
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search.
Subgoal 11.3.7.1.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_to_tm_ctx to H2 H6.
Subgoal 11.3.7.1.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' SL
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply of_to_tm to _ _ _ _ H9.
Subgoal 11.3.7.1.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' SL
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply subst_equiv_vars_in_subst to H5 _.
Subgoal 11.3.7.1.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' SL
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply subst_result_closed_tm to _ _ H39 _ H40 H11.
Subgoal 11.3.7.1.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' SL
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search.
Subgoal 11.3.7.1.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert {tm' VE'}.
Subgoal 11.3.7.1.3.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_env_equiv_tm' with L = L'.
Subgoal 11.3.7.1.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 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 T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search.
Subgoal 11.3.7.1.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
============================
forall J V1 V1' V2 V2', lt J K -> equiv T1 J V1 V1' ->
equiv (arr T1 T2) J V2 V2' ->
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < intros.
Subgoal 11.3.7.1.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
============================
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert {is_nat J}.
Subgoal 11.3.7.1.4.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
============================
{is_nat J}
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H37.
Subgoal 11.3.7.1.4.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2' N
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {add J (s N) K}
============================
{is_nat J}
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain add_arg1_isnat.
Subgoal 11.3.7.1.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
============================
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply equiv_tm to _ _ H38.
Subgoal 11.3.7.1.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
============================
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply equiv_tm' to _ _ H38.
Subgoal 11.3.7.1.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
============================
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply equiv_tm to _ _ H39.
Subgoal 11.3.7.1.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
============================
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply equiv_tm' to _ _ H39.
Subgoal 11.3.7.1.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < assert sim T2 J (R1 V2 V1) (R' V2' V1' VE').
Subgoal 11.3.7.1.4.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
sim T2 J (R1 V2 V1) (R' V2' V1' VE')
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim 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 = scons n2 (scons n1 FVs), Vs' = ccons n4 (ccons n3 (ccons n5 cnil)), Map = mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)), ML = smcons (smap n2 V1) (smcons (smap n1 V2) ML), ML' = cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)).
Subgoal 11.3.7.1.4.2.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
ctx (of n2 T1 :: of n1 (arr T1 T2) :: L')
Subgoal 11.3.7.1.4.2.2 is:
subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML))
Subgoal 11.3.7.1.4.2.3 is:
subst'
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.4 is:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain ctx_extend.
Subgoal 11.3.7.1.4.2.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
ctx (of n1 (arr T1 T2) :: L')
Subgoal 11.3.7.1.4.2.2 is:
subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML))
Subgoal 11.3.7.1.4.2.3 is:
subst'
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.4 is:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain ctx_extend.
Subgoal 11.3.7.1.4.2.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML))
Subgoal 11.3.7.1.4.2.3 is:
subst'
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.4 is:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_extend.
Subgoal 11.3.7.1.4.2.2.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
subst (smcons (smap n1 V2) ML)
Subgoal 11.3.7.1.4.2.2.2 is:
{val V1}
Subgoal 11.3.7.1.4.2.3 is:
subst'
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.4 is:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_extend.
Subgoal 11.3.7.1.4.2.2.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (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:
subst'
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.4 is:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain equiv_val with T = arr T1 T2, K = J.
Subgoal 11.3.7.1.4.2.2.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (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:
subst'
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.4 is:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain equiv_val with T = T1, K = J.
Subgoal 11.3.7.1.4.2.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
subst'
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.4 is:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst'_extend.
Subgoal 11.3.7.1.4.2.3.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
subst' (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil))
Subgoal 11.3.7.1.4.2.3.2 is:
{val' V1'}
Subgoal 11.3.7.1.4.2.4 is:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst'_extend.
Subgoal 11.3.7.1.4.2.3.1.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
subst' (cmcons (cmap n5 VE') cmnil)
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:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst'_extend.
Subgoal 11.3.7.1.4.2.3.1.1.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (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:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H35.
Subgoal 11.3.7.1.4.2.3.1.1.1:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2' N
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (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:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_env_equiv_tm' with L = L'.
Subgoal 11.3.7.1.4.2.3.1.1.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (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:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_env_equiv_val' with L = L'.
Subgoal 11.3.7.1.4.2.3.1.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (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:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain equiv_val' with T = arr T1 T2, K = J.
Subgoal 11.3.7.1.4.2.3.2:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (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:
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain equiv_val' with T = T1, K = J.
Subgoal 11.3.7.1.4.2.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
subst_equiv (of n2 T1 :: of n1 (arr T1 T2) :: L') J
(smcons (smap n2 V1) (smcons (smap n1 V2) ML))
(cmcons (cmap n4 V1') (cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil)))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_equiv_extend.
Subgoal 11.3.7.1.4.2.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
subst_equiv (of n1 (arr T1 T2) :: L') J (smcons (smap n1 V2) ML)
(cmcons (cmap n3 V2') (cmcons (cmap n5 VE') cmnil))
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_equiv_extend.
Subgoal 11.3.7.1.4.2.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
subst_equiv L' J ML (cmcons (cmap n5 VE') cmnil)
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < unfold.
Subgoal 11.3.7.1.4.2.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (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 L' J ML VE'
Subgoal 11.3.7.1.4.2.5 is:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain subst_env_equiv_closed.
Subgoal 11.3.7.1.4.2.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (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:
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain lt_to_le.
Subgoal 11.3.7.1.4.2.5:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
app_subst (smcons (smap n2 V1) (smcons (smap n1 V2) ML)) (R n1 n2)
(R1 V2 V1)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
app_subst (smcons (smap n1 V2) ML) (R n1 n2) (R1 V2 n2)
Subgoal 11.3.7.1.4 is:
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim T2 J (R1 V2 V1) (R' V2' V1' VE')
============================
sim 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 (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 (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 T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim 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 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply equiv_val' to _ _ H38.
Subgoal 11.3.7.1.4.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim 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 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply equiv_val' to _ _ H39.
Subgoal 11.3.7.1.4.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim 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 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply subst_env_equiv_val' to _ _ H36.
Subgoal 11.3.7.1.4.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim 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 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search 11.
Subgoal 11.3.7.1.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim 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 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H46.
Subgoal 11.3.7.1.4:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V1 V1'
V2 V2' N
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : lt J K
H38 : equiv T1 J V1 V1'
H39 : equiv (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim 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 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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain sim_closed_nstep' with N = N, M' = R' V2' V1' VE'.
Subgoal 11.3.7:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : equiv_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 (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain equiv_arr_to_equiv.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : equiv (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < unfold.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : equiv (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 (arr T1 T2) N V V')
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < intros.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE' J V
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : equiv (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 (arr T1 T2) N V V'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply nstep_val_inv to _ H39.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : equiv (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 (arr T1 T2) N (fix R1) V'
Subgoal 11.4 is:
sim T K P P'
Subgoal 12 is:
sim 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: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : equiv (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < exists K.
Subgoal 11.3:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : equiv (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < split.
Subgoal 11.3.8:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : equiv (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < backchain eval'_clos_fwd.
Subgoal 11.3.9:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : equiv (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search.
Subgoal 11.3.10:
Variables: L ML ML' K Vs Vs' Map R' R FVs NMap E L' T2 T1 R1 E' VE'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons n1 FVs)) (R n1 n2) (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {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 : 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 L' K ML VE'
H37 : equiv (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 (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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < search.
Subgoal 11.4:
Variables: L ML ML' K Vs Vs' Map T P P' R' R FVs NMap E L' F
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons 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 T K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < apply ctx_focus_inv to _ _ H21.
Subgoal 11.4:
Variables: L ML ML' K Vs Vs' Map P P' R' R FVs NMap E L' F T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : {cc (mcons (map n2 n4) (mcons (map n1 n3) (NMap n5)))
(scons n2 (scons 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 T1 K P P'
Subgoal 12 is:
sim T K P P'
cc_sem_pres < case H23.
Subgoal 12:
Variables: L ML ML' K Vs Vs' Map T P P' M2' M2 M1' M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 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: L ML ML' K Vs Vs' Map T P P' M2' M2 M1' M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
cc_sem_pres < backchain app_subst_app_comm.
Subgoal 12:
Variables: L ML ML' K Vs Vs' Map T P P' M2' M2 M1' M1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K P P'
cc_sem_pres < case H15.
Subgoal 12:
Variables: L ML ML' K Vs Vs' Map T P' M2' M2 M1' M1 M3 M4
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 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: L ML ML' K Vs Vs' Map T P' M2' M2 M1' M1 M3 M4
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (app M3 M4) P'
cc_sem_pres < apply app_subst'_let_comm to H12.
Subgoal 12.2:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M5 R1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : 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 T K (app M3 M4) P'
cc_sem_pres < apply app_subst'_open_comm to H19.
Subgoal 12.2:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M5 M1'1 M2'1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : 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 : app_subst' ML' n1 (M1'1 n1)
H21 : 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 T K (app M3 M4) P'
cc_sem_pres < apply app_subst'_prune to H21.
Subgoal 12.2:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M5 M1'1 M''
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : 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 : 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 T K (app M3 M4) P'
cc_sem_pres < apply subst'_nabla to H4 with x = n1.
Subgoal 12.2:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M5 M1'1 M''
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : 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 : app_subst' ML' n1 (M1'1 n1)
H21 : app_subst' ML' M2' M''
H22 : 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 T K (app M3 M4) P'
cc_sem_pres < apply subst'_det to H20 H22.
Subgoal 12.2:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M5 M''
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 : 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 : app_subst' ML' n1 n1
H21 : app_subst' ML' M2' M''
H22 : 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 T K (app M3 M4) P'
cc_sem_pres < search.
Subgoal 12:
Variables: L ML ML' K Vs Vs' Map T P' M2' M2 M1' M1 M3 M4
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (app M3 M4) P'
cc_sem_pres < case H18.
Subgoal 12:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M3' M4'
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 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: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M3' M4' T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < assert sim (arr T1 T) K M3 M3'.
Subgoal 12.3.1:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M3' M4' T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (arr T1 T) K M3 M3'
Subgoal 12.3 is:
sim T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim 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: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M3' M4' T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (arr T1 T) K M3 M3'
============================
sim T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < assert sim T1 K M4 M4'.
Subgoal 12.3.2:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M3' M4' T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (arr T1 T) K M3 M3'
============================
sim T1 K M4 M4'
Subgoal 12.3 is:
sim T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim 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: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M3' M4' T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (arr T1 T) K M3 M3'
H24 : sim T1 K M4 M4'
============================
sim T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim 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: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M3' M4' T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 (arr T1 T) K M3 M3'
H24 : sim T1 K M4 M4'
H25 : {is_sty (arr T1 T)}
============================
sim T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
Subgoal 12.4 is:
sim T K (app M3 M4)
(let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
cc_sem_pres < backchain sim_app.
Subgoal 12.4:
Variables: L ML ML' K Vs Vs' Map T M2' M2 M1' M1 M3 M4 M3' M4' F
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 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: L ML ML' K Vs Vs' Map M2' M2 M1' M1 M3 M4 M3' M4' F T1
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 L K ML ML' ->
vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
{L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
app_subst' ML' M' P' -> sim T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv 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 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' : ty -> tm -> tm' -> prop by
sim' T M M' := forall K, {is_nat K} -> sim T K M M'.
Abella < Define equiv' : ty -> tm -> tm' -> prop by
equiv' T M M' := forall K, {is_nat K} -> equiv T K M M'.
Abella < Define subst_equiv' : olist -> smap_list -> cmap_list -> prop by
subst_equiv' L ML ML' := forall K, {is_nat K} -> subst_equiv 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' 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' T P P'.
============================
forall L ML ML' Vs Vs' Map T P P' M M', ctx L -> subst ML -> subst' ML' ->
subst_equiv' 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' T P P'
cc_sem_pres' < intros.
Variables: L ML ML' Vs Vs' Map T P P' M M'
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv' 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' T P P'
cc_sem_pres' < unfold.
Variables: L ML ML' Vs Vs' Map T P P' M M'
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv' 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 T K P P'
cc_sem_pres' < intros.
Variables: L ML ML' Vs Vs' Map T P P' M M' K
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv' 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 T K P P'
cc_sem_pres' < backchain cc_sem_pres.
Variables: L ML ML' Vs Vs' Map T P P' M M' K
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv' 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 L K ML ML'
cc_sem_pres' < case H4.
Variables: L ML ML' Vs Vs' Map T P P' M M' K
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 L K ML ML'
============================
subst_equiv L K ML ML'
cc_sem_pres' < backchain H13.
Proof completed.
Abella < Theorem 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)}
nat_sem_pres < intros.
Variables: M M' N
H1 : {of M tnat}
H2 : {cc' M M'}
H3 : {eval M (nat N)}
============================
{eval' M' (nat' N)}
nat_sem_pres < case H3.
Variables: M M' N N1
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
============================
{eval' M' (nat' N)}
nat_sem_pres < apply nstep_is_nat to H4.
Variables: M M' N N1
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)}
nat_sem_pres < assert sim tnat N1 M M'.
Subgoal 1:
Variables: M M' N N1
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
============================
sim tnat N1 M M'
Subgoal is:
{eval' M' (nat' N)}
nat_sem_pres < backchain cc_sem_pres with L = nil, ML = smnil, ML' = cmcons (cmap n1 unit') cmnil, Vs = snil, Vs' = ccons n1 cnil, Map = mnil, M = M, M' = M'.
Subgoal 1:
Variables: M M' N N1
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
============================
{cc mnil snil M M'}
Subgoal is:
{eval' M' (nat' N)}
nat_sem_pres < case H2.
Subgoal 1:
Variables: M M' N N1
H1 : {of M tnat}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H7 : {cc mnil snil M M'}
============================
{cc mnil snil M M'}
Subgoal is:
{eval' M' (nat' N)}
nat_sem_pres < search.
Variables: M M' N N1
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H7 : sim tnat N1 M M'
============================
{eval' M' (nat' N)}
nat_sem_pres < case H7.
Variables: M M' N N1
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 tnat N V V')
============================
{eval' M' (nat' N)}
nat_sem_pres < apply H8 to _ H4 H5 with J = N1.
Subgoal 2:
Variables: M M' N N1
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 tnat N V V')
============================
le N1 N1
Subgoal is:
{eval' M' (nat' N)}
nat_sem_pres < backchain le_refl.
Variables: M M' N N1 V' N2
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 tnat N V V')
H9 : {eval' M' V'}
H10 : {add N1 N2 N1}
H11 : equiv tnat N2 (nat N) V'
============================
{eval' M' (nat' N)}
nat_sem_pres < case H11.
Variables: M M' N N1 N2
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 tnat N V V')
H9 : {eval' M' (nat' N)}
H10 : {add N1 N2 N1}
============================
{eval' M' (nat' N)}
nat_sem_pres < search.
Proof completed.
Abella <