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 <