Welcome to Abella 2.0.5-dev
Abella < Specification "trans".
Reading specification "/home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/./trans" (from "/home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/.")

Abella < Set types on.

Abella < Import "eval".
Importing from /home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/./eval

Abella < Import "cc_typ_pres".
Importing from /home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/./cc_typ_pres

Abella < Import "subst".
Importing from /home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/./subst

Abella < Define sim_cc : ty -> nat -> tm -> tm' -> prop,	
equiv_cc : ty -> nat -> tm -> tm' -> prop by 
sim_cc T K M M' := forall J V, le J K -> {nstep J M V} -> {val V} ->
  (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V');
equiv_cc tnat K (nat N) (nat' N);
equiv_cc tunit K unit unit';
equiv_cc (prod T1 T2) K (pair V1 V2) (pair' V1' V2') := equiv_cc T1 K V1 V1' /\ equiv_cc T2 K V2 V2';
equiv_cc (arr T1 T2) z (fix R) (clos' (abs' R') VE) := {val' VE} /\ {tm (fix R)} /\ {tm' (clos' (abs' R') VE)};
equiv_cc (arr T1 T2) (s K) (fix R) (clos' (abs' R') VE) := equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) /\
  (forall V1 V1' V2 V2', equiv_cc T1 K V1 V1' ->
       equiv_cc (arr T1 T2) K V2 V2' ->
       sim_cc T2 K (R V2 V1) (R' (pair' V2' (pair' V1' VE)))).
Warning: Definition might not be stratified
 ("equiv_cc" occurs to the left of ->)

Abella < Theorem equiv_cc_val : 
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {val V}.


============================
 forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {val V}

equiv_cc_val < induction on 1.

IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
============================
 forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv_cc T K V V' -> {val V}

equiv_cc_val < induction on 2.

IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
============================
 forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv_cc T K V V' -> {val V}

equiv_cc_val < intros.

Variables: 
  K : nat
  V : tm
  V' : tm'
  T : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv_cc T K V V'
============================
 {val V}

equiv_cc_val < case H1 (keep).
Subgoal 1:

Variables: 
  K : nat
  V : tm
  V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv_cc tnat K V V'
============================
 {val V}

Subgoal 2 is:
 {val V}

Subgoal 3 is:
 {val V}

Subgoal 4 is:
 {val V}

equiv_cc_val < case H3.
Subgoal 1:

Variables: 
  K,N : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
============================
 {val (nat N)}

Subgoal 2 is:
 {val V}

Subgoal 3 is:
 {val V}

Subgoal 4 is:
 {val V}

equiv_cc_val < search.
Subgoal 2:

Variables: 
  K : nat
  V : tm
  V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv_cc tunit K V V'
============================
 {val V}

Subgoal 3 is:
 {val V}

Subgoal 4 is:
 {val V}

equiv_cc_val < case H3.
Subgoal 2:

Variables: 
  K : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
============================
 {val unit}

Subgoal 3 is:
 {val V}

Subgoal 4 is:
 {val V}

equiv_cc_val < search.
Subgoal 3:

Variables: 
  K : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {val V}

Subgoal 4 is:
 {val V}

equiv_cc_val < case H3.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
============================
 {val (pair V1 V2)}

Subgoal 4 is:
 {val V}

equiv_cc_val < apply IH to H4 H2 _.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {val V1}
============================
 {val (pair V1 V2)}

Subgoal 4 is:
 {val V}

equiv_cc_val < apply IH to H5 H2 _.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {val V1}
H9 : {val V2}
============================
 {val (pair V1 V2)}

Subgoal 4 is:
 {val V}

equiv_cc_val < search.
Subgoal 4:

Variables: 
  K : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {val V}

equiv_cc_val < case H2.
Subgoal 4.1:

Variables: 
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {val V}

Subgoal 4.2 is:
 {val V}

equiv_cc_val < case H3.
Subgoal 4.1:

Variables: 
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {val' VE}
H7 : {tm (fix R)}
H8 : {tm' (clos' (abs' R') VE)}
============================
 {val (fix R)}

Subgoal 4.2 is:
 {val V}

equiv_cc_val < search.
Subgoal 4.2:

Variables: 
  N : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
 {val V}

equiv_cc_val < case H3.
Subgoal 4.2:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
       equiv_cc (arr T1 T2) N V2 V2' ->
       sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 {val (fix R)}

equiv_cc_val < apply IH1 to H1 H6 H7.
Subgoal 4.2:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
       equiv_cc (arr T1 T2) N V2 V2' ->
       sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {val (fix R)}
============================
 {val (fix R)}

equiv_cc_val < search.
Proof completed.
Abella < Theorem equiv_cc_val' : 
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {val' V'}.


============================
 forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {val' V'}

equiv_cc_val' < induction on 1.

IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
============================
 forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv_cc T K V V' -> {val' V'}

equiv_cc_val' < induction on 2.

IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
============================
 forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv_cc T K V V' ->
   {val' V'}

equiv_cc_val' < intros.

Variables: 
  K : nat
  V : tm
  V' : tm'
  T : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv_cc T K V V'
============================
 {val' V'}

equiv_cc_val' < case H1 (keep).
Subgoal 1:

Variables: 
  K : nat
  V : tm
  V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv_cc tnat K V V'
============================
 {val' V'}

Subgoal 2 is:
 {val' V'}

Subgoal 3 is:
 {val' V'}

Subgoal 4 is:
 {val' V'}

equiv_cc_val' < case H3.
Subgoal 1:

Variables: 
  K,N : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
============================
 {val' (nat' N)}

Subgoal 2 is:
 {val' V'}

Subgoal 3 is:
 {val' V'}

Subgoal 4 is:
 {val' V'}

equiv_cc_val' < search.
Subgoal 2:

Variables: 
  K : nat
  V : tm
  V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv_cc tunit K V V'
============================
 {val' V'}

Subgoal 3 is:
 {val' V'}

Subgoal 4 is:
 {val' V'}

equiv_cc_val' < case H3.
Subgoal 2:

Variables: 
  K : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
============================
 {val' unit'}

Subgoal 3 is:
 {val' V'}

Subgoal 4 is:
 {val' V'}

equiv_cc_val' < search.
Subgoal 3:

Variables: 
  K : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {val' V'}

Subgoal 4 is:
 {val' V'}

equiv_cc_val' < case H3.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
============================
 {val' (pair' V1' V2')}

Subgoal 4 is:
 {val' V'}

equiv_cc_val' < apply IH to H4 H2 _.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {val' V1'}
============================
 {val' (pair' V1' V2')}

Subgoal 4 is:
 {val' V'}

equiv_cc_val' < apply IH to H5 H2 _.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {val' V1'}
H9 : {val' V2'}
============================
 {val' (pair' V1' V2')}

Subgoal 4 is:
 {val' V'}

equiv_cc_val' < search.
Subgoal 4:

Variables: 
  K : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {val' V'}

equiv_cc_val' < case H2.
Subgoal 4.1:

Variables: 
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {val' V'}

Subgoal 4.2 is:
 {val' V'}

equiv_cc_val' < case H3.
Subgoal 4.1:

Variables: 
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {val' VE}
H7 : {tm (fix R)}
H8 : {tm' (clos' (abs' R') VE)}
============================
 {val' (clos' (abs' R') VE)}

Subgoal 4.2 is:
 {val' V'}

equiv_cc_val' < search.
Subgoal 4.2:

Variables: 
  N : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
 {val' V'}

equiv_cc_val' < case H3.
Subgoal 4.2:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
       equiv_cc (arr T1 T2) N V2 V2' ->
       sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 {val' (clos' (abs' R') VE)}

equiv_cc_val' < apply IH1 to H1 H6 H7.
Subgoal 4.2:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {val' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
       equiv_cc (arr T1 T2) N V2 V2' ->
       sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {val' (clos' (abs' R') VE)}
============================
 {val' (clos' (abs' R') VE)}

equiv_cc_val' < search.
Proof completed.
Abella < Theorem equiv_cc_tm : 
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {tm V}.


============================
 forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {tm V}

equiv_cc_tm < induction on 1.

IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
============================
 forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv_cc T K V V' -> {tm V}

equiv_cc_tm < induction on 2.

IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
============================
 forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv_cc T K V V' -> {tm V}

equiv_cc_tm < intros.

Variables: 
  K : nat
  V : tm
  V' : tm'
  T : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv_cc T K V V'
============================
 {tm V}

equiv_cc_tm < case H1 (keep).
Subgoal 1:

Variables: 
  K : nat
  V : tm
  V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv_cc tnat K V V'
============================
 {tm V}

Subgoal 2 is:
 {tm V}

Subgoal 3 is:
 {tm V}

Subgoal 4 is:
 {tm V}

equiv_cc_tm < case H3.
Subgoal 1:

Variables: 
  K,N : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
============================
 {tm (nat N)}

Subgoal 2 is:
 {tm V}

Subgoal 3 is:
 {tm V}

Subgoal 4 is:
 {tm V}

equiv_cc_tm < search.
Subgoal 2:

Variables: 
  K : nat
  V : tm
  V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv_cc tunit K V V'
============================
 {tm V}

Subgoal 3 is:
 {tm V}

Subgoal 4 is:
 {tm V}

equiv_cc_tm < case H3.
Subgoal 2:

Variables: 
  K : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
============================
 {tm unit}

Subgoal 3 is:
 {tm V}

Subgoal 4 is:
 {tm V}

equiv_cc_tm < search.
Subgoal 3:

Variables: 
  K : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {tm V}

Subgoal 4 is:
 {tm V}

equiv_cc_tm < case H3.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
============================
 {tm (pair V1 V2)}

Subgoal 4 is:
 {tm V}

equiv_cc_tm < apply IH to H4 H2 _.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {tm V1}
============================
 {tm (pair V1 V2)}

Subgoal 4 is:
 {tm V}

equiv_cc_tm < apply IH to H5 H2 _.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {tm V1}
H9 : {tm V2}
============================
 {tm (pair V1 V2)}

Subgoal 4 is:
 {tm V}

equiv_cc_tm < search.
Subgoal 4:

Variables: 
  K : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {tm V}

equiv_cc_tm < case H2.
Subgoal 4.1:

Variables: 
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {tm V}

Subgoal 4.2 is:
 {tm V}

equiv_cc_tm < case H3.
Subgoal 4.1:

Variables: 
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {val' VE}
H7 : {tm (fix R)}
H8 : {tm' (clos' (abs' R') VE)}
============================
 {tm (fix R)}

Subgoal 4.2 is:
 {tm V}

equiv_cc_tm < search.
Subgoal 4.2:

Variables: 
  N : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
 {tm V}

equiv_cc_tm < case H3.
Subgoal 4.2:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
       equiv_cc (arr T1 T2) N V2 V2' ->
       sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 {tm (fix R)}

equiv_cc_tm < apply IH1 to H1 H6 H7.
Subgoal 4.2:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm V}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm V}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
       equiv_cc (arr T1 T2) N V2 V2' ->
       sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {tm (fix R)}
============================
 {tm (fix R)}

equiv_cc_tm < search.
Proof completed.
Abella < Theorem equiv_cc_tm' : 
forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {tm' V'}.


============================
 forall T K V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> {tm' V'}

equiv_cc_tm' < induction on 1.

IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
============================
 forall T K V V', {is_sty T}@ -> {is_nat K} -> equiv_cc T K V V' -> {tm' V'}

equiv_cc_tm' < induction on 2.

IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
============================
 forall T K V V', {is_sty T}@ -> {is_nat K}@@ -> equiv_cc T K V V' ->
   {tm' V'}

equiv_cc_tm' < intros.

Variables: 
  K : nat
  V : tm
  V' : tm'
  T : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv_cc T K V V'
============================
 {tm' V'}

equiv_cc_tm' < case H1 (keep).
Subgoal 1:

Variables: 
  K : nat
  V : tm
  V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv_cc tnat K V V'
============================
 {tm' V'}

Subgoal 2 is:
 {tm' V'}

Subgoal 3 is:
 {tm' V'}

Subgoal 4 is:
 {tm' V'}

equiv_cc_tm' < case H3.
Subgoal 1:

Variables: 
  K,N : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
============================
 {tm' (nat' N)}

Subgoal 2 is:
 {tm' V'}

Subgoal 3 is:
 {tm' V'}

Subgoal 4 is:
 {tm' V'}

equiv_cc_tm' < search.
Subgoal 2:

Variables: 
  K : nat
  V : tm
  V' : tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv_cc tunit K V V'
============================
 {tm' V'}

Subgoal 3 is:
 {tm' V'}

Subgoal 4 is:
 {tm' V'}

equiv_cc_tm' < case H3.
Subgoal 2:

Variables: 
  K : nat
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
============================
 {tm' unit'}

Subgoal 3 is:
 {tm' V'}

Subgoal 4 is:
 {tm' V'}

equiv_cc_tm' < search.
Subgoal 3:

Variables: 
  K : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (prod T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {tm' V'}

Subgoal 4 is:
 {tm' V'}

equiv_cc_tm' < case H3.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
============================
 {tm' (pair' V1' V2')}

Subgoal 4 is:
 {tm' V'}

equiv_cc_tm' < apply IH to H4 H2 _.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {tm' V1'}
============================
 {tm' (pair' V1' V2')}

Subgoal 4 is:
 {tm' V'}

equiv_cc_tm' < apply IH to H5 H2 _.
Subgoal 3:

Variables: 
  K : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : equiv_cc T1 K V1 V1'
H7 : equiv_cc T2 K V2 V2'
H8 : {tm' V1'}
H9 : {tm' V2'}
============================
 {tm' (pair' V1' V2')}

Subgoal 4 is:
 {tm' V'}

equiv_cc_tm' < search.
Subgoal 4:

Variables: 
  K : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {tm' V'}

equiv_cc_tm' < case H2.
Subgoal 4.1:

Variables: 
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) z V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
============================
 {tm' V'}

Subgoal 4.2 is:
 {tm' V'}

equiv_cc_tm' < case H3.
Subgoal 4.1:

Variables: 
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {val' VE}
H7 : {tm (fix R)}
H8 : {tm' (clos' (abs' R') VE)}
============================
 {tm' (clos' (abs' R') VE)}

Subgoal 4.2 is:
 {tm' V'}

equiv_cc_tm' < search.
Subgoal 4.2:

Variables: 
  N : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty (arr T1 T2)}@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
============================
 {tm' V'}

equiv_cc_tm' < case H3.
Subgoal 4.2:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
       equiv_cc (arr T1 T2) N V2 V2' ->
       sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 {tm' (clos' (abs' R') VE)}

equiv_cc_tm' < apply IH1 to H1 H6 H7.
Subgoal 4.2:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        {tm' V'}
H1 : {is_sty (arr T1 T2)}@
H4 : {is_sty T1}*
H5 : {is_sty T2}*
H6 : {is_nat N}**
H7 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H8 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
       equiv_cc (arr T1 T2) N V2 V2' ->
       sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H9 : {tm' (clos' (abs' R') VE)}
============================
 {tm' (clos' (abs' R') VE)}

equiv_cc_tm' < search.
Proof completed.
Abella < Theorem equiv_cc_arr_val' : 
forall T1 T K R V, {is_nat K} -> equiv_cc (arr T1 T) K (fix R) V ->
  (exists R' VE, V = clos' (abs' R') VE /\ {val' VE}).


============================
 forall T1 T K R V, {is_nat K} -> equiv_cc (arr T1 T) K (fix R) V ->
   (exists R' VE, V = clos' (abs' R') VE /\ {val' VE})

equiv_cc_arr_val' < induction on 1.

IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
       (exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
============================
 forall T1 T K R V, {is_nat K}@ -> equiv_cc (arr T1 T) K (fix R) V ->
   (exists R' VE, V = clos' (abs' R') VE /\ {val' VE})

equiv_cc_arr_val' < intros.

Variables: 
  K : nat
  V : tm'
  T1,T : ty
  R : tm -> tm -> tm
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
       (exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H1 : {is_nat K}@
H2 : equiv_cc (arr T1 T) K (fix R) V
============================
 exists R' VE, V = clos' (abs' R') VE /\ {val' VE}

equiv_cc_arr_val' < case H1.
Subgoal 1:

Variables: 
  V : tm'
  T1,T : ty
  R : tm -> tm -> tm
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
       (exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H2 : equiv_cc (arr T1 T) z (fix R) V
============================
 exists R' VE, V = clos' (abs' R') VE /\ {val' VE}

Subgoal 2 is:
 exists R' VE, V = clos' (abs' R') VE /\ {val' VE}

equiv_cc_arr_val' < case H2.
Subgoal 1:

Variables: 
  VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
       (exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H3 : {val' VE}
H4 : {tm (fix R)}
H5 : {tm' (clos' (abs' R') VE)}
============================
 exists R'1 VE1, clos' (abs' R') VE = clos' (abs' R'1) VE1 /\ {val' VE1}

Subgoal 2 is:
 exists R' VE, V = clos' (abs' R') VE /\ {val' VE}

equiv_cc_arr_val' < search.
Subgoal 2:

Variables: 
  N : nat
  V : tm'
  T1,T : ty
  R : tm -> tm -> tm
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
       (exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H2 : equiv_cc (arr T1 T) (s N) (fix R) V
H3 : {is_nat N}*
============================
 exists R' VE, V = clos' (abs' R') VE /\ {val' VE}

equiv_cc_arr_val' < case H2.
Subgoal 2:

Variables: 
  N : nat
  VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T1 T K R V, {is_nat K}* -> equiv_cc (arr T1 T) K (fix R) V ->
       (exists R' VE, V = clos' (abs' R') VE /\ {val' VE})
H3 : {is_nat N}*
H4 : equiv_cc (arr T1 T) N (fix R) (clos' (abs' R') VE)
H5 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
       equiv_cc (arr T1 T) N V2 V2' ->
       sim_cc T N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 exists R'1 VE1, clos' (abs' R') VE = clos' (abs' R'1) VE1 /\ {val' VE1}

equiv_cc_arr_val' < backchain IH.
Proof completed.
Abella < Theorem equiv_cc_closed : 
forall T K J V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' -> le J K ->
  equiv_cc T J V V'.


============================
 forall T K J V V', {is_sty T} -> {is_nat K} -> equiv_cc T K V V' ->
   le J K -> equiv_cc T J V V'

equiv_cc_closed < induction on 1.

IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
============================
 forall T K J V V', {is_sty T}@ -> {is_nat K} -> equiv_cc T K V V' ->
   le J K -> equiv_cc T J V V'

equiv_cc_closed < induction on 2.

IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
============================
 forall T K J V V', {is_sty T}@ -> {is_nat K}@@ -> equiv_cc T K V V' ->
   le J K -> equiv_cc T J V V'

equiv_cc_closed < intros.

Variables: 
  K,J : nat
  V : tm
  V' : tm'
  T : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty T}@
H2 : {is_nat K}@@
H3 : equiv_cc T K V V'
H4 : le J K
============================
 equiv_cc T J V V'

equiv_cc_closed < case H1 (keep).
Subgoal 1:

Variables: 
  K,J : nat
  V : tm
  V' : tm'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H3 : equiv_cc tnat K V V'
H4 : le J K
============================
 equiv_cc tnat J V V'

Subgoal 2 is:
 equiv_cc tunit J V V'

Subgoal 3 is:
 equiv_cc (prod T1 T2) J V V'

Subgoal 4 is:
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < case H3.
Subgoal 1:

Variables: 
  K,J,N : nat
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty tnat}@
H2 : {is_nat K}@@
H4 : le J K
============================
 equiv_cc tnat J (nat N) (nat' N)

Subgoal 2 is:
 equiv_cc tunit J V V'

Subgoal 3 is:
 equiv_cc (prod T1 T2) J V V'

Subgoal 4 is:
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < search.
Subgoal 2:

Variables: 
  K,J : nat
  V : tm
  V' : tm'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H3 : equiv_cc tunit K V V'
H4 : le J K
============================
 equiv_cc tunit J V V'

Subgoal 3 is:
 equiv_cc (prod T1 T2) J V V'

Subgoal 4 is:
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < case H3.
Subgoal 2:

Variables: 
  K,J : nat
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty tunit}@
H2 : {is_nat K}@@
H4 : le J K
============================
 equiv_cc tunit J unit unit'

Subgoal 3 is:
 equiv_cc (prod T1 T2) J V V'

Subgoal 4 is:
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < search.
Subgoal 3:

Variables: 
  K,J : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (prod T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
============================
 equiv_cc (prod T1 T2) J V V'

Subgoal 4 is:
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < case H3.
Subgoal 3:

Variables: 
  K,J : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H7 : equiv_cc T1 K V1 V1'
H8 : equiv_cc T2 K V2 V2'
============================
 equiv_cc (prod T1 T2) J (pair V1 V2) (pair' V1' V2')

Subgoal 4 is:
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < unfold.
Subgoal 3.1:

Variables: 
  K,J : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H7 : equiv_cc T1 K V1 V1'
H8 : equiv_cc T2 K V2 V2'
============================
 equiv_cc T1 J V1 V1'

Subgoal 3.2 is:
 equiv_cc T2 J V2 V2'

Subgoal 4 is:
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < backchain IH.
Subgoal 3.2:

Variables: 
  K,J : nat
  V2,V1 : tm
  V2',V1' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (prod T1 T2)}@
H2 : {is_nat K}@@
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H7 : equiv_cc T1 K V1 V1'
H8 : equiv_cc T2 K V2 V2'
============================
 equiv_cc T2 J V2 V2'

Subgoal 4 is:
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < backchain IH.
Subgoal 4:

Variables: 
  K,J : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
============================
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < apply le_to_lt to _ H4.
Subgoal 4:

Variables: 
  K,J : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H7 : J = K \/ lt J K
============================
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < case H7.
Subgoal 4.1:

Variables: 
  K : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : le K K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
============================
 equiv_cc (arr T1 T2) K V V'

Subgoal 4.2 is:
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < search.
Subgoal 4.2:

Variables: 
  K,J : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat K}@@
H3 : equiv_cc (arr T1 T2) K V V'
H4 : le J K
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J K
============================
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < case H2 (keep).
Subgoal 4.2.1:

Variables: 
  J : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat z}@@
H3 : equiv_cc (arr T1 T2) z V V'
H4 : le J z
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J z
============================
 equiv_cc (arr T1 T2) J V V'

Subgoal 4.2.2 is:
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < apply lt_z_absurd to H8.
Subgoal 4.2.2:

Variables: 
  J,N : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : le J (s N)
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
============================
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < apply lt_pred_le to _ H8.
Subgoal 4.2.2:

Variables: 
  J,N : nat
  V : tm
  V' : tm'
  T2,T1 : ty
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H3 : equiv_cc (arr T1 T2) (s N) V V'
H4 : le J (s N)
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
H10 : le J N
============================
 equiv_cc (arr T1 T2) J V V'

equiv_cc_closed < case H3.
Subgoal 4.2.2:

Variables: 
  J,N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H4 : le J (s N)
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
H10 : le J N
H11 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H12 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
        equiv_cc (arr T1 T2) N V2 V2' ->
        sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 equiv_cc (arr T1 T2) J (fix R) (clos' (abs' R') VE)

equiv_cc_closed < apply IH1 to H1 H9 H11 H10.
Subgoal 4.2.2:

Variables: 
  J,N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K J V V', {is_sty T}* -> {is_nat K} -> equiv_cc T K V V' ->
       le J K -> equiv_cc T J V V'
IH1 : forall T K J V V', {is_sty T}@ -> {is_nat K}** -> equiv_cc T K V V' ->
        le J K -> equiv_cc T J V V'
H1 : {is_sty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H4 : le J (s N)
H5 : {is_sty T1}*
H6 : {is_sty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
H10 : le J N
H11 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H12 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
        equiv_cc (arr T1 T2) N V2 V2' ->
        sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H13 : equiv_cc (arr T1 T2) J (fix R) (clos' (abs' R') VE)
============================
 equiv_cc (arr T1 T2) J (fix R) (clos' (abs' R') VE)

equiv_cc_closed < search.
Proof completed.
Abella < Theorem equiv_cc_arr_cond : 
forall K T1 T2 R R' VE, {is_nat K} ->
  equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
  (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))).


============================
 forall K T1 T2 R R' VE, {is_nat K} ->
   equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
   (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
        equiv_cc (arr T1 T2) J V2 V2' ->
        sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))

equiv_cc_arr_cond < induction on 1.

IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
============================
 forall K T1 T2 R R' VE, {is_nat K}@ ->
   equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
   (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
        equiv_cc (arr T1 T2) J V2 V2' ->
        sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))

equiv_cc_arr_cond < intros.

Variables: 
  K,J : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T1,T2 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H1 : {is_nat K}@
H2 : equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE)
H3 : lt J K
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
============================
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_cond < case H1.
Subgoal 1:

Variables: 
  J : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T1,T2 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) z (fix R) (clos' (abs' R') VE)
H3 : lt J z
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
============================
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

Subgoal 2 is:
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_cond < apply lt_z_absurd to H3.
Subgoal 2:

Variables: 
  J,N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T1,T2 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
============================
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_cond < apply lt_pred_le to _ H3.
Subgoal 2:

Variables: 
  J,N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T1,T2 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
============================
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_cond < apply le_to_lt to _ H7.
Subgoal 2:

Variables: 
  J,N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T1,T2 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H8 : J = N \/ lt J N
============================
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_cond < case H8.
Subgoal 2.1:

Variables: 
  N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T1,T2 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt N (s N)
H4 : equiv_cc T1 N V1 V1'
H5 : equiv_cc (arr T1 T2) N V2 V2'
H6 : {is_nat N}*
H7 : le N N
============================
 sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

Subgoal 2.2 is:
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_cond < case H2.
Subgoal 2.1:

Variables: 
  N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T1,T2 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H3 : lt N (s N)
H4 : equiv_cc T1 N V1 V1'
H5 : equiv_cc (arr T1 T2) N V2 V2'
H6 : {is_nat N}*
H7 : le N N
H9 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H10 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
        equiv_cc (arr T1 T2) N V2 V2' ->
        sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

Subgoal 2.2 is:
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_cond < backchain H10.
Subgoal 2.2:

Variables: 
  J,N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T1,T2 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H2 : equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H9 : lt J N
============================
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_cond < case H2.
Subgoal 2.2:

Variables: 
  J,N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T1,T2 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H9 : lt J N
H10 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H11 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
        equiv_cc (arr T1 T2) N V2 V2' ->
        sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_cond < apply IH to H6 H10.
Subgoal 2.2:

Variables: 
  J,N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T1,T2 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall K T1 T2 R R' VE, {is_nat K}* ->
       equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE) ->
       (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
            equiv_cc (arr T1 T2) J V2 V2' ->
            sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE))))
H3 : lt J (s N)
H4 : equiv_cc T1 J V1 V1'
H5 : equiv_cc (arr T1 T2) J V2 V2'
H6 : {is_nat N}*
H7 : le J N
H9 : lt J N
H10 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H11 : forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
        equiv_cc (arr T1 T2) N V2 V2' ->
        sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H12 : forall J V1 V1' V2 V2', lt J N -> equiv_cc T1 J V1 V1' ->
        equiv_cc (arr T1 T2) J V2 V2' ->
        sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_cond < backchain H12.
Proof completed.
Abella < Theorem app_equiv_cc_arr : 
forall T1 T R F VE N1 N2 V1 V1' K, {is_sty (arr T1 T)} -> {is_nat N1} ->
  {is_nat N2} -> equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE) ->
  equiv_cc T1 N2 V1 V1' -> lt K N1 -> lt K N2 ->
  sim_cc T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE))).


============================
 forall T1 T R F VE N1 N2 V1 V1' K, {is_sty (arr T1 T)} -> {is_nat N1} ->
   {is_nat N2} -> equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE) ->
   equiv_cc T1 N2 V1 V1' -> lt K N1 -> lt K N2 ->
   sim_cc T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))

app_equiv_cc_arr < intros.

Variables: 
  N1,N2,K : nat
  V1 : tm
  VE,V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  F : tm' -> tm'
H1 : {is_sty (arr T1 T)}
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
============================
 sim_cc T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))

app_equiv_cc_arr < case H1.

Variables: 
  N1,N2,K : nat
  V1 : tm
  VE,V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
============================
 sim_cc T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))

app_equiv_cc_arr < apply equiv_cc_arr_cond to _ H4.

Variables: 
  N1,N2,K : nat
  V1 : tm
  VE,V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
H10 : forall J V1 V1' V2 V2', lt J N1 -> equiv_cc T1 J V1 V1' ->
        equiv_cc (arr T1 T) J V2 V2' ->
        sim_cc T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
 sim_cc T K (R (fix R) V1) (F (pair' (clos' (abs' F) VE) (pair' V1' VE)))

app_equiv_cc_arr < backchain H10.
Subgoal 1:

Variables: 
  N1,N2,K : nat
  V1 : tm
  VE,V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
H10 : forall J V1 V1' V2 V2', lt J N1 -> equiv_cc T1 J V1 V1' ->
        equiv_cc (arr T1 T) J V2 V2' ->
        sim_cc T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
 equiv_cc T1 K V1 V1'

Subgoal 2 is:
 equiv_cc (arr T1 T) K (fix R) (clos' (abs' F) VE)

app_equiv_cc_arr < backchain equiv_cc_closed with K = N2.
Subgoal 1:

Variables: 
  N1,N2,K : nat
  V1 : tm
  VE,V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
H10 : forall J V1 V1' V2 V2', lt J N1 -> equiv_cc T1 J V1 V1' ->
        equiv_cc (arr T1 T) J V2 V2' ->
        sim_cc T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
 le K N2

Subgoal 2 is:
 equiv_cc (arr T1 T) K (fix R) (clos' (abs' F) VE)

app_equiv_cc_arr < backchain lt_to_le.
Subgoal 2:

Variables: 
  N1,N2,K : nat
  V1 : tm
  VE,V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
H10 : forall J V1 V1' V2 V2', lt J N1 -> equiv_cc T1 J V1 V1' ->
        equiv_cc (arr T1 T) J V2 V2' ->
        sim_cc T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
 equiv_cc (arr T1 T) K (fix R) (clos' (abs' F) VE)

app_equiv_cc_arr < backchain equiv_cc_closed with K = N1.
Subgoal 2:

Variables: 
  N1,N2,K : nat
  V1 : tm
  VE,V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  F : tm' -> tm'
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_cc (arr T1 T) N1 (fix R) (clos' (abs' F) VE)
H5 : equiv_cc T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_sty T1}
H9 : {is_sty T}
H10 : forall J V1 V1' V2 V2', lt J N1 -> equiv_cc T1 J V1 V1' ->
        equiv_cc (arr T1 T) J V2 V2' ->
        sim_cc T J (R V2 V1) (F (pair' V2' (pair' V1' VE)))
============================
 le K N1

app_equiv_cc_arr < backchain lt_to_le.
Proof completed.
Abella < Define equiv_cc_arr : ty -> nat -> tm -> tm' -> prop by 
equiv_cc_arr (arr T1 T2) K (fix R) (clos' (abs' R') VE) := {val' VE} /\ {tm (fix R)} /\ {tm' (clos' (abs' R') VE)} /\
  (forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))).

Abella < Theorem equiv_cc_arr_closed : 
forall J K T M M', {is_nat K} -> le J K -> equiv_cc_arr T K M M' ->
  equiv_cc_arr T J M M'.


============================
 forall J K T M M', {is_nat K} -> le J K -> equiv_cc_arr T K M M' ->
   equiv_cc_arr T J M M'

equiv_cc_arr_closed < intros.

Variables: 
  J,K : nat
  M : tm
  M' : tm'
  T : ty
H1 : {is_nat K}
H2 : le J K
H3 : equiv_cc_arr T K M M'
============================
 equiv_cc_arr T J M M'

equiv_cc_arr_closed < case H3.

Variables: 
  J,K : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 equiv_cc_arr (arr T1 T2) J (fix R) (clos' (abs' R') VE)

equiv_cc_arr_closed < unfold.
Subgoal 1:

Variables: 
  J,K : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 {val' VE}

Subgoal 2 is:
 {tm (fix R)}

Subgoal 3 is:
 {tm' (clos' (abs' R') VE)}

Subgoal 4 is:
 forall J1 V1 V1' V2 V2', lt J1 J -> equiv_cc T1 J1 V1 V1' ->
   equiv_cc (arr T1 T2) J1 V2 V2' ->
   sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_closed < search.
Subgoal 2:

Variables: 
  J,K : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 {tm (fix R)}

Subgoal 3 is:
 {tm' (clos' (abs' R') VE)}

Subgoal 4 is:
 forall J1 V1 V1' V2 V2', lt J1 J -> equiv_cc T1 J1 V1 V1' ->
   equiv_cc (arr T1 T2) J1 V2 V2' ->
   sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_closed < search.
Subgoal 3:

Variables: 
  J,K : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 {tm' (clos' (abs' R') VE)}

Subgoal 4 is:
 forall J1 V1 V1' V2 V2', lt J1 J -> equiv_cc T1 J1 V1 V1' ->
   equiv_cc (arr T1 T2) J1 V2 V2' ->
   sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_closed < search.
Subgoal 4:

Variables: 
  J,K : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 forall J1 V1 V1' V2 V2', lt J1 J -> equiv_cc T1 J1 V1 V1' ->
   equiv_cc (arr T1 T2) J1 V2 V2' ->
   sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_closed < intros.
Subgoal 4:

Variables: 
  J,K,J1 : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : lt J1 J
H9 : equiv_cc T1 J1 V1 V1'
H10 : equiv_cc (arr T1 T2) J1 V2 V2'
============================
 sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_closed < apply lt_le_compose to H8 H2.
Subgoal 4:

Variables: 
  J,K,J1 : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : lt J1 J
H9 : equiv_cc T1 J1 V1 V1'
H10 : equiv_cc (arr T1 T2) J1 V2 V2'
H11 : lt J1 K
============================
 sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_closed < apply H7 to _ H9 H10.
Subgoal 4:

Variables: 
  J,K,J1 : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat K}
H2 : le J K
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : lt J1 J
H9 : equiv_cc T1 J1 V1 V1'
H10 : equiv_cc (arr T1 T2) J1 V2 V2'
H11 : lt J1 K
H12 : sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 sim_cc T2 J1 (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_closed < search.
Proof completed.
Abella < Theorem equiv_cc_arr_to_equiv_cc : 
forall T K M M', {is_nat K} -> {is_sty T} -> equiv_cc_arr T K M M' ->
  equiv_cc T K M M'.


============================
 forall T K M M', {is_nat K} -> {is_sty T} -> equiv_cc_arr T K M M' ->
   equiv_cc T K M M'

equiv_cc_arr_to_equiv_cc < induction on 1.

IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
============================
 forall T K M M', {is_nat K}@ -> {is_sty T} -> equiv_cc_arr T K M M' ->
   equiv_cc T K M M'

equiv_cc_arr_to_equiv_cc < intros.

Variables: 
  K : nat
  M : tm
  M' : tm'
  T : ty
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H1 : {is_nat K}@
H2 : {is_sty T}
H3 : equiv_cc_arr T K M M'
============================
 equiv_cc T K M M'

equiv_cc_arr_to_equiv_cc < case H3 (keep).

Variables: 
  K : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H1 : {is_nat K}@
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) K (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 equiv_cc (arr T1 T2) K (fix R) (clos' (abs' R') VE)

equiv_cc_arr_to_equiv_cc < case H1.
Subgoal 1:

Variables: 
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) z (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J z -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
============================
 equiv_cc (arr T1 T2) z (fix R) (clos' (abs' R') VE)

Subgoal 2 is:
 equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)

equiv_cc_arr_to_equiv_cc < search.
Subgoal 2:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
 equiv_cc (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)

equiv_cc_arr_to_equiv_cc < unfold.
Subgoal 2.1:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
 equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)

Subgoal 2.2 is:
 forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
   equiv_cc (arr T1 T2) N V2 V2' ->
   sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_to_equiv_cc < apply equiv_cc_arr_closed to _ _ H3 with J = N.
Subgoal 2.1.1:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
 le N (s N)

Subgoal 2.1 is:
 equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)

Subgoal 2.2 is:
 forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
   equiv_cc (arr T1 T2) N V2 V2' ->
   sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_to_equiv_cc < backchain le_succ.
Subgoal 2.1.1:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
 le N N

Subgoal 2.1 is:
 equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)

Subgoal 2.2 is:
 forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
   equiv_cc (arr T1 T2) N V2 V2' ->
   sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_to_equiv_cc < backchain le_refl.
Subgoal 2.1:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc_arr (arr T1 T2) N (fix R) (clos' (abs' R') VE)
============================
 equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)

Subgoal 2.2 is:
 forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
   equiv_cc (arr T1 T2) N V2 V2' ->
   sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_to_equiv_cc < apply IH to H8 _ H9.
Subgoal 2.1:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc_arr (arr T1 T2) N (fix R) (clos' (abs' R') VE)
H10 : equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)
============================
 equiv_cc (arr T1 T2) N (fix R) (clos' (abs' R') VE)

Subgoal 2.2 is:
 forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
   equiv_cc (arr T1 T2) N V2 V2' ->
   sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_to_equiv_cc < search.
Subgoal 2.2:

Variables: 
  N : nat
  VE : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
============================
 forall V1 V1' V2 V2', equiv_cc T1 N V1 V1' ->
   equiv_cc (arr T1 T2) N V2 V2' ->
   sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_to_equiv_cc < intros.
Subgoal 2.2:

Variables: 
  N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc T1 N V1 V1'
H10 : equiv_cc (arr T1 T2) N V2 V2'
============================
 sim_cc T2 N (R V2 V1) (R' (pair' V2' (pair' V1' VE)))

equiv_cc_arr_to_equiv_cc < backchain H7.
Subgoal 2.2:

Variables: 
  N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc T1 N V1 V1'
H10 : equiv_cc (arr T1 T2) N V2 V2'
============================
 lt N (s N)

equiv_cc_arr_to_equiv_cc < unfold.
Subgoal 2.2:

Variables: 
  N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc T1 N V1 V1'
H10 : equiv_cc (arr T1 T2) N V2 V2'
============================
 exists N1, {add N (s N1) (s N)}

equiv_cc_arr_to_equiv_cc < exists z.
Subgoal 2.2:

Variables: 
  N : nat
  V1,V2 : tm
  VE,V1',V2' : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
IH : forall T K M M', {is_nat K}* -> {is_sty T} -> equiv_cc_arr T K M M' ->
       equiv_cc T K M M'
H2 : {is_sty (arr T1 T2)}
H3 : equiv_cc_arr (arr T1 T2) (s N) (fix R) (clos' (abs' R') VE)
H4 : {val' VE}
H5 : {tm (fix R)}
H6 : {tm' (clos' (abs' R') VE)}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_cc T1 J V1 V1' ->
       equiv_cc (arr T1 T2) J V2 V2' ->
       sim_cc T2 J (R V2 V1) (R' (pair' V2' (pair' V1' VE)))
H8 : {is_nat N}*
H9 : equiv_cc T1 N V1 V1'
H10 : equiv_cc (arr T1 T2) N V2 V2'
============================
 {add N (s z) (s N)}

equiv_cc_arr_to_equiv_cc < backchain add_comm.
Proof completed.
Abella < Theorem sim_cc_val_tm' : 
forall V T K M' V', {val V} -> {eval' M' V'} -> equiv_cc T K V V' ->
  sim_cc T K V M'.


============================
 forall V T K M' V', {val V} -> {eval' M' V'} -> equiv_cc T K V V' ->
   sim_cc T K V M'

sim_cc_val_tm' < intros.

Variables: 
  K : nat
  V : tm
  M',V' : tm'
  T : ty
H1 : {val V}
H2 : {eval' M' V'}
H3 : equiv_cc T K V V'
============================
 sim_cc T K V M'

sim_cc_val_tm' < unfold.

Variables: 
  K : nat
  V : tm
  M',V' : tm'
  T : ty
H1 : {val V}
H2 : {eval' M' V'}
H3 : equiv_cc T K V V'
============================
 forall J V1, le J K -> {nstep J V V1} -> {val V1} ->
   (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V1 V')

sim_cc_val_tm' < intros.

Variables: 
  K,J : nat
  V,V1 : tm
  M',V' : tm'
  T : ty
H1 : {val V}
H2 : {eval' M' V'}
H3 : equiv_cc T K V V'
H4 : le J K
H5 : {nstep J V V1}
H6 : {val V1}
============================
 exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V1 V'

sim_cc_val_tm' < apply nstep_val_inv to H1 H5.

Variables: 
  K : nat
  V1 : tm
  M',V' : tm'
  T : ty
H1 : {val V1}
H2 : {eval' M' V'}
H3 : equiv_cc T K V1 V'
H4 : le z K
H5 : {nstep z V1 V1}
H6 : {val V1}
============================
 exists V' N, {eval' M' V'} /\ {add z N K} /\ equiv_cc T N V1 V'

sim_cc_val_tm' < search.
Proof completed.
Abella < Theorem sim_cc_nat : 
forall K N, sim_cc tnat K (nat N) (nat' N).


============================
 forall K N, sim_cc tnat K (nat N) (nat' N)

sim_cc_nat < intros.

Variables: 
  K,N : nat
============================
 sim_cc tnat K (nat N) (nat' N)

sim_cc_nat < unfold.

Variables: 
  K,N : nat
============================
 forall J V, le J K -> {nstep J (nat N) V} -> {val V} ->
   (exists V' N1, {eval' (nat' N) V'} /\ {add J N1 K} /\
        equiv_cc tnat N1 V V')

sim_cc_nat < intros.

Variables: 
  K,N,J : nat
  V : tm
H1 : le J K
H2 : {nstep J (nat N) V}
H3 : {val V}
============================
 exists V' N1, {eval' (nat' N) V'} /\ {add J N1 K} /\ equiv_cc tnat N1 V V'

sim_cc_nat < apply nstep_val_inv to _ H2.

Variables: 
  K,N : nat
H1 : le z K
H2 : {nstep z (nat N) (nat N)}
H3 : {val (nat N)}
============================
 exists V' N1, {eval' (nat' N) V'} /\ {add z N1 K} /\
   equiv_cc tnat N1 (nat N) V'

sim_cc_nat < search.
Proof completed.
Abella < Theorem sim_cc_pred : 
forall K M M', sim_cc tnat K M M' -> sim_cc tnat K (pred M) (pred' M').


============================
 forall K M M', sim_cc tnat K M M' -> sim_cc tnat K (pred M) (pred' M')

sim_cc_pred < intros.

Variables: 
  K : nat
  M : tm
  M' : tm'
H1 : sim_cc tnat K M M'
============================
 sim_cc tnat K (pred M) (pred' M')

sim_cc_pred < case H1.

Variables: 
  K : nat
  M : tm
  M' : tm'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
 sim_cc tnat K (pred M) (pred' M')

sim_cc_pred < unfold.

Variables: 
  K : nat
  M : tm
  M' : tm'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
 forall J V, le J K -> {nstep J (pred M) V} -> {val V} ->
   (exists V' N, {eval' (pred' M') V'} /\ {add J N K} /\
        equiv_cc tnat N V V')

sim_cc_pred < intros.

Variables: 
  K,J : nat
  M,V : tm
  M' : tm'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H3 : le J K
H4 : {nstep J (pred M) V}
H5 : {val V}
============================
 exists V' N, {eval' (pred' M') V'} /\ {add J N K} /\ equiv_cc tnat N V V'

sim_cc_pred < apply nstep_pred_inv to H5 H4.

Variables: 
  K,J1,N,N' : nat
  M : tm
  M' : tm'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H3 : le (s J1) K
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
============================
 exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N K} /\
   equiv_cc tnat N (nat N') V'

sim_cc_pred < case H3.

Variables: 
  K,J1,N,N',N1 : nat
  M : tm
  M' : tm'
H2 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H8 : {add (s J1) N1 K}
============================
 exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N K} /\
   equiv_cc tnat N (nat N') V'

sim_cc_pred < case H8.

Variables: 
  J1,N,N',N1,N3 : nat
  M : tm
  M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
============================
 exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
   equiv_cc tnat N (nat N') V'

sim_cc_pred < assert {add J1 (s N1) (s N3)}.
Subgoal 1:

Variables: 
  J1,N,N',N1,N3 : nat
  M : tm
  M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
============================
 {add J1 (s N1) (s N3)}

Subgoal is:
 exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
   equiv_cc tnat N (nat N') V'

sim_cc_pred < backchain add_s.

Variables: 
  J1,N,N',N1,N3 : nat
  M : tm
  M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
============================
 exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
   equiv_cc tnat N (nat N') V'

sim_cc_pred < apply H2 to _ H6 _ with J = J1.

Variables: 
  J1,N,N',N1,N3,N2 : nat
  M : tm
  M',V' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' V'}
H12 : {add J1 N2 (s N3)}
H13 : equiv_cc tnat N2 (nat N) V'
============================
 exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
   equiv_cc tnat N (nat N') V'

sim_cc_pred < case H13.

Variables: 
  J1,N,N',N1,N3,N2 : nat
  M : tm
  M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
 exists V' N, {eval' (pred' M') V'} /\ {add (s J1) N (s N3)} /\
   equiv_cc tnat N (nat N') V'

sim_cc_pred < exists nat' N'.

Variables: 
  J1,N,N',N1,N3,N2 : nat
  M : tm
  M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
 exists N, {eval' (pred' M') (nat' N')} /\ {add (s J1) N (s N3)} /\
   equiv_cc tnat N (nat N') (nat' N')

sim_cc_pred < exists N1.

Variables: 
  J1,N,N',N1,N3,N2 : nat
  M : tm
  M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
 {eval' (pred' M') (nat' N')} /\ {add (s J1) N1 (s N3)} /\
   equiv_cc tnat N1 (nat N') (nat' N')

sim_cc_pred < split.
Subgoal 2:

Variables: 
  J1,N,N',N1,N3,N2 : nat
  M : tm
  M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
 {eval' (pred' M') (nat' N')}

Subgoal 3 is:
 {add (s J1) N1 (s N3)}

Subgoal 4 is:
 equiv_cc tnat N1 (nat N') (nat' N')

sim_cc_pred < backchain eval'_pred_fwd.
Subgoal 3:

Variables: 
  J1,N,N',N1,N3,N2 : nat
  M : tm
  M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
 {add (s J1) N1 (s N3)}

Subgoal 4 is:
 equiv_cc tnat N1 (nat N') (nat' N')

sim_cc_pred < search.
Subgoal 4:

Variables: 
  J1,N,N',N1,N3,N2 : nat
  M : tm
  M' : tm'
H2 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc tnat N V V')
H4 : {nstep (s J1) (pred M) (nat N')}
H5 : {val (nat N')}
H6 : {nstep J1 M (nat N)}
H7 : {npred N N'}
H9 : {add J1 N1 N3}
H10 : {add J1 (s N1) (s N3)}
H11 : {eval' M' (nat' N)}
H12 : {add J1 N2 (s N3)}
============================
 equiv_cc tnat N1 (nat N') (nat' N')

sim_cc_pred < search.
Proof completed.
Abella < Theorem sim_cc_plus : 
forall K M1 M2 M1' M2', {is_nat K} -> sim_cc tnat K M1 M1' ->
  sim_cc tnat K M2 M2' -> sim_cc tnat K (plus M1 M2) (plus' M1' M2').


============================
 forall K M1 M2 M1' M2', {is_nat K} -> sim_cc tnat K M1 M1' ->
   sim_cc tnat K M2 M2' -> sim_cc tnat K (plus M1 M2) (plus' M1' M2')

sim_cc_plus < intros.

Variables: 
  K : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
============================
 sim_cc tnat K (plus M1 M2) (plus' M1' M2')

sim_cc_plus < unfold.

Variables: 
  K : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
============================
 forall J V, le J K -> {nstep J (plus M1 M2) V} -> {val V} ->
   (exists V' N, {eval' (plus' M1' M2') V'} /\ {add J N K} /\
        equiv_cc tnat N V V')

sim_cc_plus < intros.

Variables: 
  K,J : nat
  M1,M2,V : tm
  M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le J K
H5 : {nstep J (plus M1 M2) V}
H6 : {val V}
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add J N K} /\
   equiv_cc tnat N V V'

sim_cc_plus < apply nstep_plus_inv to H6 H5.

Variables: 
  K,J1,J2,J12,N1,N2,N3 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < assert le J1 K.
Subgoal 1:

Variables: 
  K,J1,J2,J12,N1,N2,N3 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
============================
 le J1 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < apply add_s to H7.
Subgoal 1:

Variables: 
  K,J1,J2,J12,N1,N2,N3 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : {add J1 (s J2) (s J12)}
============================
 le J1 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < apply le_trans to _ H4.
Subgoal 1:

Variables: 
  K,J1,J2,J12,N1,N2,N3 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : {add J1 (s J2) (s J12)}
H12 : le J1 K
============================
 le J1 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < search.

Variables: 
  K,J1,J2,J12,N1,N2,N3 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H2 : sim_cc tnat K M1 M1'
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < case H2.

Variables: 
  K,J1,J2,J12,N1,N2,N3 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < apply H12 to H11 H8 _.

Variables: 
  K,J1,J2,J12,N1,N2,N3,N : nat
  M1,M2 : tm
  M1',M2',V' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' V'}
H14 : {add J1 N K}
H15 : equiv_cc tnat N (nat N1) V'
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < case H15.

Variables: 
  K,J1,J2,J12,N1,N2,N3,N : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < assert le J2 K.
Subgoal 2:

Variables: 
  K,J1,J2,J12,N1,N2,N3,N : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
============================
 le J2 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < apply add_comm to _ H7.
Subgoal 2.1:

Variables: 
  K,J1,J2,J12,N1,N2,N3,N : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
============================
 {is_nat J12}

Subgoal 2 is:
 le J2 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < case H4.
Subgoal 2.1:

Variables: 
  K,J1,J2,J12,N1,N2,N3,N,N4 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add (s J12) N4 K}
============================
 {is_nat J12}

Subgoal 2 is:
 le J2 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < apply add_arg1_isnat to H16.
Subgoal 2.1:

Variables: 
  K,J1,J2,J12,N1,N2,N3,N,N4 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add (s J12) N4 K}
H17 : {is_nat (s J12)}
============================
 {is_nat J12}

Subgoal 2 is:
 le J2 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < case H17.
Subgoal 2.1:

Variables: 
  K,J1,J2,J12,N1,N2,N3,N,N4 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add (s J12) N4 K}
H18 : {is_nat J12}
============================
 {is_nat J12}

Subgoal 2 is:
 le J2 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < search.
Subgoal 2:

Variables: 
  K,J1,J2,J12,N1,N2,N3,N : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add J2 J1 J12}
============================
 le J2 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < apply add_s to H16.
Subgoal 2:

Variables: 
  K,J1,J2,J12,N1,N2,N3,N : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add J2 J1 J12}
H17 : {add J2 (s J1) (s J12)}
============================
 le J2 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < apply le_trans to _ H4.
Subgoal 2:

Variables: 
  K,J1,J2,J12,N1,N2,N3,N : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : {add J2 J1 J12}
H17 : {add J2 (s J1) (s J12)}
H18 : le J2 K
============================
 le J2 K

Subgoal is:
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < search.

Variables: 
  K,J1,J2,J12,N1,N2,N3,N : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H3 : sim_cc tnat K M2 M2'
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < case H3.

Variables: 
  K,J1,J2,J12,N1,N2,N3,N : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
H17 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < apply H17 to H16 H9 _.

Variables: 
  K,J1,J2,J12,N1,N2,N3,N,N4 : nat
  M1,M2 : tm
  M1',M2',V'1 : tm'
H1 : {is_nat K}
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
H17 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H18 : {eval' M2' V'1}
H19 : {add J2 N4 K}
H20 : equiv_cc tnat N4 (nat N2) V'1
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < case H20.

Variables: 
  K,J1,J2,J12,N1,N2,N3,N,N4 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
H17 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H18 : {eval' M2' (nat' N2)}
H19 : {add J2 N4 K}
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < apply eval'_plus_fwd to H13 H18 H10.

Variables: 
  K,J1,J2,J12,N1,N2,N3,N,N4 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H4 : le (s J12) K
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
H17 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H18 : {eval' M2' (nat' N2)}
H19 : {add J2 N4 K}
H21 : {eval' (plus' M1' M2') (nat' N3)}
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < case H4.

Variables: 
  K,J1,J2,J12,N1,N2,N3,N,N4,N5 : nat
  M1,M2 : tm
  M1',M2' : tm'
H1 : {is_nat K}
H5 : {nstep (s J12) (plus M1 M2) (nat N3)}
H6 : {val (nat N3)}
H7 : {add J1 J2 J12}
H8 : {nstep J1 M1 (nat N1)}
H9 : {nstep J2 M2 (nat N2)}
H10 : {add N1 N2 N3}
H11 : le J1 K
H12 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H13 : {eval' M1' (nat' N1)}
H14 : {add J1 N K}
H16 : le J2 K
H17 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H18 : {eval' M2' (nat' N2)}
H19 : {add J2 N4 K}
H21 : {eval' (plus' M1' M2') (nat' N3)}
H22 : {add (s J12) N5 K}
============================
 exists V' N, {eval' (plus' M1' M2') V'} /\ {add (s J12) N K} /\
   equiv_cc tnat N (nat N3) V'

sim_cc_plus < search.
Proof completed.
Abella < Theorem sim_cc_ifz : 
forall K T M M1 M2 M' M1' M2', {is_nat K} -> {is_sty T} ->
  sim_cc tnat K M M' -> sim_cc T K M1 M1' -> sim_cc T K M2 M2' ->
  sim_cc T K (ifz M M1 M2) (ifz' M' M1' M2').


============================
 forall K T M M1 M2 M' M1' M2', {is_nat K} -> {is_sty T} ->
   sim_cc tnat K M M' -> sim_cc T K M1 M1' -> sim_cc T K M2 M2' ->
   sim_cc T K (ifz M M1 M2) (ifz' M' M1' M2')

sim_cc_ifz < intros.

Variables: 
  K : nat
  M,M1,M2 : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
============================
 sim_cc T K (ifz M M1 M2) (ifz' M' M1' M2')

sim_cc_ifz < unfold.

Variables: 
  K : nat
  M,M1,M2 : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
============================
 forall J V, le J K -> {nstep J (ifz M M1 M2) V} -> {val V} ->
   (exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
        equiv_cc T N V V')

sim_cc_ifz < intros.

Variables: 
  K,J : nat
  M,M1,M2,V : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < apply nstep_ifz_inv to _ _ H7.
Subgoal 1:

Variables: 
  K,J : nat
  M,M1,M2,V : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
============================
 {is_nat J}

Subgoal is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < case H6.
Subgoal 1:

Variables: 
  K,J,N : nat
  M,M1,M2,V : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : {add J N K}
============================
 {is_nat J}

Subgoal is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < backchain add_arg1_isnat.

Variables: 
  K,J,I,J1,N : nat
  M,M1,M2,V : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H11 : {nstep J1 M (nat z)} /\ {nstep I M1 V} \/ {nstep J1 M (nat (s N))} /\
        {nstep I M2 V}
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < case H11.
Subgoal 2:

Variables: 
  K,J,I,J1,N : nat
  M,M1,M2,V : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < apply le_trans to H9 H6.
Subgoal 2:

Variables: 
  K,J,I,J1,N : nat
  M,M1,M2,V : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < case H3.
Subgoal 2:

Variables: 
  K,J,I,J1,N : nat
  M,M1,M2,V : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < apply H15 to _ H12 _.
Subgoal 2:

Variables: 
  K,J,I,J1,N,N1 : nat
  M,M1,M2,V : tm
  M',M1',M2',V' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat z) V'
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < apply le_trans to H10 H6.
Subgoal 2:

Variables: 
  K,J,I,J1,N,N1 : nat
  M,M1,M2,V : tm
  M',M1',M2',V' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat z) V'
H19 : le I K
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < case H4.
Subgoal 2:

Variables: 
  K,J,I,J1,N,N1 : nat
  M,M1,M2,V : tm
  M',M1',M2',V' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat z) V'
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < apply H20 to _ H13 _.
Subgoal 2:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M,M1,M2,V : tm
  M',M1',M2',V',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat z) V'
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < case H18.
Subgoal 2:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < case H6.
Subgoal 2:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < exists V'1.
Subgoal 2:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 exists N, {eval' (ifz' M' M1' M2') V'1} /\ {add J N K} /\ equiv_cc T N V V'1

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < exists N3.
Subgoal 2:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 {eval' (ifz' M' M1' M2') V'1} /\ {add J N3 K} /\ equiv_cc T N3 V V'1

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < split.
Subgoal 2.1:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 {eval' (ifz' M' M1' M2') V'1}

Subgoal 2.2 is:
 {add J N3 K}

Subgoal 2.3 is:
 equiv_cc T N3 V V'1

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < backchain eval'_ifz_fwd1.
Subgoal 2.2:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 {add J N3 K}

Subgoal 2.3 is:
 equiv_cc T N3 V V'1

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < search.
Subgoal 2.3:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 equiv_cc T N3 V V'1

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < backchain equiv_cc_closed with K = N2.
Subgoal 2.3.1:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 {is_nat N2}

Subgoal 2.3.2 is:
 le N3 N2

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < backchain add_arg2_isnat.
Subgoal 2.3.2:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 le N3 N2

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < backchain add_le_complement with N = K, N1 = I, N1' = J.
Subgoal 2.3.2:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H5 : sim_cc T K M2 M2'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat z)}
H13 : {nstep I M1 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' z)}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M1' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 {is_nat N2}

Subgoal 3 is:
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < backchain add_arg2_isnat.
Subgoal 3:

Variables: 
  K,J,I,J1,N : nat
  M,M1,M2,V : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < apply le_trans to H9 H6.
Subgoal 3:

Variables: 
  K,J,I,J1,N : nat
  M,M1,M2,V : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H3 : sim_cc tnat K M M'
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < case H3.
Subgoal 3:

Variables: 
  K,J,I,J1,N : nat
  M,M1,M2,V : tm
  M',M1',M2' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < apply H15 to _ H12 _.
Subgoal 3:

Variables: 
  K,J,I,J1,N,N1 : nat
  M,M1,M2,V : tm
  M',M1',M2',V' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat (s N)) V'
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < apply le_trans to H10 H6.
Subgoal 3:

Variables: 
  K,J,I,J1,N,N1 : nat
  M,M1,M2,V : tm
  M',M1',M2',V' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H5 : sim_cc T K M2 M2'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat (s N)) V'
H19 : le I K
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < case H5.
Subgoal 3:

Variables: 
  K,J,I,J1,N,N1 : nat
  M,M1,M2,V : tm
  M',M1',M2',V' : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat (s N)) V'
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < apply H20 to _ H13 _.
Subgoal 3:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M,M1,M2,V : tm
  M',M1',M2',V',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' V'}
H17 : {add J1 N1 K}
H18 : equiv_cc tnat N1 (nat (s N)) V'
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < case H18.
Subgoal 3:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H6 : le J K
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < case H6.
Subgoal 3:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 exists V' N, {eval' (ifz' M' M1' M2') V'} /\ {add J N K} /\
   equiv_cc T N V V'

sim_cc_ifz < exists V'1.
Subgoal 3:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 exists N, {eval' (ifz' M' M1' M2') V'1} /\ {add J N K} /\ equiv_cc T N V V'1

sim_cc_ifz < exists N3.
Subgoal 3:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 {eval' (ifz' M' M1' M2') V'1} /\ {add J N3 K} /\ equiv_cc T N3 V V'1

sim_cc_ifz < split.
Subgoal 3.1:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 {eval' (ifz' M' M1' M2') V'1}

Subgoal 3.2 is:
 {add J N3 K}

Subgoal 3.3 is:
 equiv_cc T N3 V V'1

sim_cc_ifz < backchain eval'_ifz_fwd2.
Subgoal 3.2:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 {add J N3 K}

Subgoal 3.3 is:
 equiv_cc T N3 V V'1

sim_cc_ifz < search.
Subgoal 3.3:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 equiv_cc T N3 V V'1

sim_cc_ifz < backchain equiv_cc_closed with K = N2.
Subgoal 3.3.1:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 {is_nat N2}

Subgoal 3.3.2 is:
 le N3 N2

sim_cc_ifz < backchain add_arg2_isnat.
Subgoal 3.3.2:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 le N3 N2

sim_cc_ifz < backchain add_le_complement with N = K, N1 = I, N1' = J.
Subgoal 3.3.2:

Variables: 
  K,J,I,J1,N,N1,N2,N3 : nat
  M,M1,M2,V : tm
  M',M1',M2',V'1 : tm'
  T : ty
H1 : {is_nat K}
H2 : {is_sty T}
H4 : sim_cc T K M1 M1'
H7 : {nstep J (ifz M M1 M2) V}
H8 : {val V}
H9 : le J1 J
H10 : le I J
H12 : {nstep J1 M (nat (s N))}
H13 : {nstep I M2 V}
H14 : le J1 K
H15 : forall J V, le J K -> {nstep J M V} -> {val V} ->
        (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc tnat N V V')
H16 : {eval' M' (nat' (s N))}
H17 : {add J1 N1 K}
H19 : le I K
H20 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T N V V')
H21 : {eval' M2' V'1}
H22 : {add I N2 K}
H23 : equiv_cc T N2 V V'1
H24 : {add J N3 K}
============================
 {is_nat N2}

sim_cc_ifz < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_cc_unit : 
forall K, sim_cc tunit K unit unit'.


============================
 forall K, sim_cc tunit K unit unit'

sim_cc_unit < intros.

Variables: 
  K : nat
============================
 sim_cc tunit K unit unit'

sim_cc_unit < unfold.

Variables: 
  K : nat
============================
 forall J V, le J K -> {nstep J unit V} -> {val V} ->
   (exists V' N, {eval' unit' V'} /\ {add J N K} /\ equiv_cc tunit N V V')

sim_cc_unit < intros.

Variables: 
  K,J : nat
  V : tm
H1 : le J K
H2 : {nstep J unit V}
H3 : {val V}
============================
 exists V' N, {eval' unit' V'} /\ {add J N K} /\ equiv_cc tunit N V V'

sim_cc_unit < apply nstep_val_inv to _ H2.

Variables: 
  K : nat
H1 : le z K
H2 : {nstep z unit unit}
H3 : {val unit}
============================
 exists V' N, {eval' unit' V'} /\ {add z N K} /\ equiv_cc tunit N unit V'

sim_cc_unit < search.
Proof completed.
Abella < Theorem sim_cc_pair : 
forall T1 T2 K M1 M2 M1' M2', {is_nat K} -> {is_sty T1} -> {is_sty T2} ->
  sim_cc T1 K M1 M1' -> sim_cc T2 K M2 M2' ->
  sim_cc (prod T1 T2) K (pair M1 M2) (pair' M1' M2').


============================
 forall T1 T2 K M1 M2 M1' M2', {is_nat K} -> {is_sty T1} -> {is_sty T2} ->
   sim_cc T1 K M1 M1' -> sim_cc T2 K M2 M2' ->
   sim_cc (prod T1 T2) K (pair M1 M2) (pair' M1' M2')

sim_cc_pair < intros.

Variables: 
  K : nat
  M1,M2 : tm
  M1',M2' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
============================
 sim_cc (prod T1 T2) K (pair M1 M2) (pair' M1' M2')

sim_cc_pair < unfold.

Variables: 
  K : nat
  M1,M2 : tm
  M1',M2' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
============================
 forall J V, le J K -> {nstep J (pair M1 M2) V} -> {val V} ->
   (exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
        equiv_cc (prod T1 T2) N V V')

sim_cc_pair < intros.

Variables: 
  K,J : nat
  M1,M2,V : tm
  M1',M2' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) V}
H8 : {val V}
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N V V'

sim_cc_pair < apply nstep_pair_inv to _ H7.

Variables: 
  K,J,I,J1 : nat
  M1,M2,V1,V2 : tm
  M1',M2' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H8 : {val (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < case H8.

Variables: 
  K,J,I,J1 : nat
  M1,M2,V1,V2 : tm
  M1',M2' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < case H6 (keep).

Variables: 
  K,J,I,J1,N : nat
  M1,M2,V1,V2 : tm
  M1',M2' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < apply le_trans to _ H6.

Variables: 
  K,J,I,J1,N : nat
  M1,M2,V1,V2 : tm
  M1',M2' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H4 : sim_cc T1 K M1 M1'
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < case H4.

Variables: 
  K,J,I,J1,N : nat
  M1,M2,V1,V2 : tm
  M1',M2' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < apply H16 to _ H10 _.

Variables: 
  K,J,I,J1,N,N1 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < assert le J1 J.
Subgoal 1:

Variables: 
  K,J,I,J1,N,N1 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
============================
 le J1 J

Subgoal is:
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < unfold.
Subgoal 1:

Variables: 
  K,J,I,J1,N,N1 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
============================
 exists N, {add J1 N J}

Subgoal is:
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < exists I.
Subgoal 1:

Variables: 
  K,J,I,J1,N,N1 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
============================
 {add J1 I J}

Subgoal is:
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < backchain add_comm.
Subgoal 1:

Variables: 
  K,J,I,J1,N,N1 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
============================
 {is_nat J}

Subgoal is:
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < backchain add_arg1_isnat.

Variables: 
  K,J,I,J1,N,N1 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < apply le_trans to H20 H6.

Variables: 
  K,J,I,J1,N,N1 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H5 : sim_cc T2 K M2 M2'
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < case H5.

Variables: 
  K,J,I,J1,N,N1 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < apply H22 to _ H11 _.

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 exists V' N, {eval' (pair' M1' M2') V'} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) V'

sim_cc_pair < exists pair' V' V'1.

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 exists N, {eval' (pair' M1' M2') (pair' V' V'1)} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) (pair' V' V'1)

sim_cc_pair < exists N.

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 {eval' (pair' M1' M2') (pair' V' V'1)} /\ {add J N K} /\
   equiv_cc (prod T1 T2) N (pair V1 V2) (pair' V' V'1)

sim_cc_pair < split.
Subgoal 2:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 {eval' (pair' M1' M2') (pair' V' V'1)}

Subgoal 3 is:
 {add J N K}

Subgoal 4 is:
 equiv_cc (prod T1 T2) N (pair V1 V2) (pair' V' V'1)

sim_cc_pair < backchain eval'_pair_fwd.
Subgoal 3:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 {add J N K}

Subgoal 4 is:
 equiv_cc (prod T1 T2) N (pair V1 V2) (pair' V' V'1)

sim_cc_pair < search.
Subgoal 4:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 equiv_cc (prod T1 T2) N (pair V1 V2) (pair' V' V'1)

sim_cc_pair < unfold.
Subgoal 4.1:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 equiv_cc T1 N V1 V'

Subgoal 4.2 is:
 equiv_cc T2 N V2 V'1

sim_cc_pair < backchain equiv_cc_closed with K = N1.
Subgoal 4.1.1:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 {is_nat N1}

Subgoal 4.1.2 is:
 le N N1

Subgoal 4.2 is:
 equiv_cc T2 N V2 V'1

sim_cc_pair < backchain add_arg2_isnat.
Subgoal 4.1.2:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 le N N1

Subgoal 4.2 is:
 equiv_cc T2 N V2 V'1

sim_cc_pair < backchain add_le_complement with N = K, N1 = I, N1' = J.
Subgoal 4.1.2:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 {is_nat N1}

Subgoal 4.2 is:
 equiv_cc T2 N V2 V'1

sim_cc_pair < backchain add_arg2_isnat.
Subgoal 4.2:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 equiv_cc T2 N V2 V'1

sim_cc_pair < backchain equiv_cc_closed with K = N2.
Subgoal 4.2.1:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 {is_nat N2}

Subgoal 4.2.2 is:
 le N N2

sim_cc_pair < backchain add_arg2_isnat.
Subgoal 4.2.2:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 le N N2

sim_cc_pair < backchain add_le_complement with N = K, N1 = J1, N1' = J.
Subgoal 4.2.2:

Variables: 
  K,J,I,J1,N,N1,N2 : nat
  M1,M2,V1,V2 : tm
  M1',M2',V',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty T1}
H3 : {is_sty T2}
H6 : le J K
H7 : {nstep J (pair M1 M2) (pair V1 V2)}
H9 : {add I J1 J}
H10 : {nstep I M1 V1}
H11 : {nstep J1 M2 V2}
H12 : {val V1}
H13 : {val V2}
H14 : {add J N K}
H15 : le I K
H16 : forall J V, le J K -> {nstep J M1 V} -> {val V} ->
        (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T1 N V V')
H17 : {eval' M1' V'}
H18 : {add I N1 K}
H19 : equiv_cc T1 N1 V1 V'
H20 : le J1 J
H21 : le J1 K
H22 : forall J V, le J K -> {nstep J M2 V} -> {val V} ->
        (exists V' N, {eval' M2' V'} /\ {add J N K} /\ equiv_cc T2 N V V')
H23 : {eval' M2' V'1}
H24 : {add J1 N2 K}
H25 : equiv_cc T2 N2 V2 V'1
============================
 {is_nat N2}

sim_cc_pair < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_cc_fst : 
forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
  sim_cc (prod T1 T2) K M M' -> sim_cc T1 K (fst M) (fst' M').


============================
 forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
   sim_cc (prod T1 T2) K M M' -> sim_cc T1 K (fst M) (fst' M')

sim_cc_fst < intros.

Variables: 
  K : nat
  M : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
============================
 sim_cc T1 K (fst M) (fst' M')

sim_cc_fst < unfold.

Variables: 
  K : nat
  M : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
============================
 forall J V, le J K -> {nstep J (fst M) V} -> {val V} ->
   (exists V' N, {eval' (fst' M') V'} /\ {add J N K} /\ equiv_cc T1 N V V')

sim_cc_fst < intros.

Variables: 
  K,J : nat
  M,V : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
H4 : le J K
H5 : {nstep J (fst M) V}
H6 : {val V}
============================
 exists V' N, {eval' (fst' M') V'} /\ {add J N K} /\ equiv_cc T1 N V V'

sim_cc_fst < apply nstep_fst_inv to H6 H5.

Variables: 
  K,K' : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
H4 : le (s K') K
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
============================
 exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'

sim_cc_fst < case H3.

Variables: 
  K,K' : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
============================
 exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'

sim_cc_fst < apply H9 to _ H8 _.
Subgoal 1:

Variables: 
  K,K' : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
============================
 le K' K

Subgoal is:
 exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'

sim_cc_fst < case H4.
Subgoal 1:

Variables: 
  K,K',N : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {add (s K') N K}
============================
 le K' K

Subgoal is:
 exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'

sim_cc_fst < case H10.
Subgoal 1:

Variables: 
  K',N,N3 : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat (s N3)}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc (prod T1 T2) N V V')
H11 : {add K' N N3}
============================
 le K' (s N3)

Subgoal is:
 exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'

sim_cc_fst < apply add_s to H11.
Subgoal 1:

Variables: 
  K',N,N3 : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat (s N3)}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc (prod T1 T2) N V V')
H11 : {add K' N N3}
H12 : {add K' (s N) (s N3)}
============================
 le K' (s N3)

Subgoal is:
 exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'

sim_cc_fst < search.

Variables: 
  K,K',N : nat
  M,V,V' : tm
  M',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv_cc (prod T1 T2) N (pair V V') V'1
============================
 exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'

sim_cc_fst < case H4.

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv_cc (prod T1 T2) N (pair V V') V'1
H13 : {add (s K') N1 K}
============================
 exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'

sim_cc_fst < case H12.

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
 exists V' N, {eval' (fst' M') V'} /\ {add (s K') N K} /\ equiv_cc T1 N V V'

sim_cc_fst < exists V1'.

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
 exists N, {eval' (fst' M') V1'} /\ {add (s K') N K} /\ equiv_cc T1 N V V1'

sim_cc_fst < exists N1.

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
 {eval' (fst' M') V1'} /\ {add (s K') N1 K} /\ equiv_cc T1 N1 V V1'

sim_cc_fst < split.
Subgoal 2:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
 {eval' (fst' M') V1'}

Subgoal 3 is:
 {add (s K') N1 K}

Subgoal 4 is:
 equiv_cc T1 N1 V V1'

sim_cc_fst < backchain eval'_fst_fwd.
Subgoal 3:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
 {add (s K') N1 K}

Subgoal 4 is:
 equiv_cc T1 N1 V V1'

sim_cc_fst < search.
Subgoal 4:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
 equiv_cc T1 N1 V V1'

sim_cc_fst < apply add_le_complement to _ _ H11 H13.
Subgoal 4.1:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
 le K' (s K')

Subgoal 4.2 is:
 {is_nat N}

Subgoal 4 is:
 equiv_cc T1 N1 V V1'

sim_cc_fst < backchain le_succ.
Subgoal 4.1:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
 le K' K'

Subgoal 4.2 is:
 {is_nat N}

Subgoal 4 is:
 equiv_cc T1 N1 V V1'

sim_cc_fst < backchain le_refl.
Subgoal 4.1:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
 {is_nat K'}

Subgoal 4.2 is:
 {is_nat N}

Subgoal 4 is:
 equiv_cc T1 N1 V V1'

sim_cc_fst < backchain add_arg1_isnat.
Subgoal 4.2:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
============================
 {is_nat N}

Subgoal 4 is:
 equiv_cc T1 N1 V V1'

sim_cc_fst < backchain add_arg2_isnat.
Subgoal 4:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
H16 : le N1 N
============================
 equiv_cc T1 N1 V V1'

sim_cc_fst < backchain equiv_cc_closed with K = N.
Subgoal 4.3:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
H16 : le N1 N
============================
 {is_sty T1}

Subgoal 4.4 is:
 {is_nat N}

sim_cc_fst < case H2.
Subgoal 4.3:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
H16 : le N1 N
H17 : {is_sty T1}
H18 : {is_sty T2}
============================
 {is_sty T1}

Subgoal 4.4 is:
 {is_nat N}

sim_cc_fst < search.
Subgoal 4.4:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (fst M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V V')}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V V1'
H15 : equiv_cc T2 N V' V2'
H16 : le N1 N
============================
 {is_nat N}

sim_cc_fst < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_cc_snd : 
forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
  sim_cc (prod T1 T2) K M M' -> sim_cc T2 K (snd M) (snd' M').


============================
 forall T1 T2 K M M', {is_nat K} -> {is_sty (prod T1 T2)} ->
   sim_cc (prod T1 T2) K M M' -> sim_cc T2 K (snd M) (snd' M')

sim_cc_snd < intros.

Variables: 
  K : nat
  M : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
============================
 sim_cc T2 K (snd M) (snd' M')

sim_cc_snd < unfold.

Variables: 
  K : nat
  M : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
============================
 forall J V, le J K -> {nstep J (snd M) V} -> {val V} ->
   (exists V' N, {eval' (snd' M') V'} /\ {add J N K} /\ equiv_cc T2 N V V')

sim_cc_snd < intros.

Variables: 
  K,J : nat
  M,V : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
H4 : le J K
H5 : {nstep J (snd M) V}
H6 : {val V}
============================
 exists V' N, {eval' (snd' M') V'} /\ {add J N K} /\ equiv_cc T2 N V V'

sim_cc_snd < apply nstep_snd_inv to H6 H5.

Variables: 
  K,K' : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H3 : sim_cc (prod T1 T2) K M M'
H4 : le (s K') K
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
============================
 exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'

sim_cc_snd < case H3.

Variables: 
  K,K' : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
============================
 exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'

sim_cc_snd < apply H9 to _ H8 _.
Subgoal 1:

Variables: 
  K,K' : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
============================
 le K' K

Subgoal is:
 exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'

sim_cc_snd < case H4.
Subgoal 1:

Variables: 
  K,K',N : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {add (s K') N K}
============================
 le K' K

Subgoal is:
 exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'

sim_cc_snd < case H10.
Subgoal 1:

Variables: 
  K',N,N3 : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat (s N3)}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc (prod T1 T2) N V V')
H11 : {add K' N N3}
============================
 le K' (s N3)

Subgoal is:
 exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'

sim_cc_snd < apply add_s to H11.
Subgoal 1:

Variables: 
  K',N,N3 : nat
  M,V,V' : tm
  M' : tm'
  T1,T2 : ty
H1 : {is_nat (s N3)}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J (s N3) -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N (s N3)} /\
            equiv_cc (prod T1 T2) N V V')
H11 : {add K' N N3}
H12 : {add K' (s N) (s N3)}
============================
 le K' (s N3)

Subgoal is:
 exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'

sim_cc_snd < search.

Variables: 
  K,K',N : nat
  M,V,V' : tm
  M',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H4 : le (s K') K
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv_cc (prod T1 T2) N (pair V' V) V'1
============================
 exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'

sim_cc_snd < case H4.

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V'1 : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' V'1}
H11 : {add K' N K}
H12 : equiv_cc (prod T1 T2) N (pair V' V) V'1
H13 : {add (s K') N1 K}
============================
 exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'

sim_cc_snd < case H12.

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
 exists V' N, {eval' (snd' M') V'} /\ {add (s K') N K} /\ equiv_cc T2 N V V'

sim_cc_snd < exists V2'.

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
 exists N, {eval' (snd' M') V2'} /\ {add (s K') N K} /\ equiv_cc T2 N V V2'

sim_cc_snd < exists N1.

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
 {eval' (snd' M') V2'} /\ {add (s K') N1 K} /\ equiv_cc T2 N1 V V2'

sim_cc_snd < split.
Subgoal 2:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
 {eval' (snd' M') V2'}

Subgoal 3 is:
 {add (s K') N1 K}

Subgoal 4 is:
 equiv_cc T2 N1 V V2'

sim_cc_snd < backchain eval'_snd_fwd.
Subgoal 3:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
 {add (s K') N1 K}

Subgoal 4 is:
 equiv_cc T2 N1 V V2'

sim_cc_snd < search.
Subgoal 4:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
 equiv_cc T2 N1 V V2'

sim_cc_snd < apply add_le_complement to _ _ H11 H13.
Subgoal 4.1:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
 le K' (s K')

Subgoal 4.2 is:
 {is_nat N}

Subgoal 4 is:
 equiv_cc T2 N1 V V2'

sim_cc_snd < backchain le_succ.
Subgoal 4.1:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
 le K' K'

Subgoal 4.2 is:
 {is_nat N}

Subgoal 4 is:
 equiv_cc T2 N1 V V2'

sim_cc_snd < backchain le_refl.
Subgoal 4.1:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
 {is_nat K'}

Subgoal 4.2 is:
 {is_nat N}

Subgoal 4 is:
 equiv_cc T2 N1 V V2'

sim_cc_snd < backchain add_arg1_isnat.
Subgoal 4.2:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
============================
 {is_nat N}

Subgoal 4 is:
 equiv_cc T2 N1 V V2'

sim_cc_snd < backchain add_arg2_isnat.
Subgoal 4:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
H16 : le N1 N
============================
 equiv_cc T2 N1 V V2'

sim_cc_snd < backchain equiv_cc_closed with K = N.
Subgoal 4.3:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
H16 : le N1 N
============================
 {is_sty T2}

Subgoal 4.4 is:
 {is_nat N}

sim_cc_snd < case H2.
Subgoal 4.3:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
H16 : le N1 N
H17 : {is_sty T1}
H18 : {is_sty T2}
============================
 {is_sty T2}

Subgoal 4.4 is:
 {is_nat N}

sim_cc_snd < search.
Subgoal 4.4:

Variables: 
  K,K',N,N1 : nat
  M,V,V' : tm
  M',V2',V1' : tm'
  T1,T2 : ty
H1 : {is_nat K}
H2 : {is_sty (prod T1 T2)}
H5 : {nstep (s K') (snd M) V}
H6 : {val V}
H7 : {val V'}
H8 : {nstep K' M (pair V' V)}
H9 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\
            equiv_cc (prod T1 T2) N V V')
H10 : {eval' M' (pair' V1' V2')}
H11 : {add K' N K}
H13 : {add (s K') N1 K}
H14 : equiv_cc T1 N V' V1'
H15 : equiv_cc T2 N V V2'
H16 : le N1 N
============================
 {is_nat N}

sim_cc_snd < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_cc_nstep : 
forall T K M M' J I V, sim_cc T K M M' -> {nstep J M V} -> {val V} ->
  {add J I K} -> (exists V', {eval' M' V'} /\ equiv_cc T I V V').


============================
 forall T K M M' J I V, sim_cc T K M M' -> {nstep J M V} -> {val V} ->
   {add J I K} -> (exists V', {eval' M' V'} /\ equiv_cc T I V V')

sim_cc_nstep < intros.

Variables: 
  K,J,I : nat
  M,V : tm
  M' : tm'
  T : ty
H1 : sim_cc T K M M'
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
============================
 exists V', {eval' M' V'} /\ equiv_cc T I V V'

sim_cc_nstep < case H1.

Variables: 
  K,J,I : nat
  M,V : tm
  M' : tm'
  T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
============================
 exists V', {eval' M' V'} /\ equiv_cc T I V V'

sim_cc_nstep < apply H5 to _ H2 H3.

Variables: 
  K,J,I,N : nat
  M,V : tm
  M',V' : tm'
  T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
 exists V', {eval' M' V'} /\ equiv_cc T I V V'

sim_cc_nstep < exists V'.

Variables: 
  K,J,I,N : nat
  M,V : tm
  M',V' : tm'
  T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
 {eval' M' V'} /\ equiv_cc T I V V'

sim_cc_nstep < split.
Subgoal 1:

Variables: 
  K,J,I,N : nat
  M,V : tm
  M',V' : tm'
  T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
 {eval' M' V'}

Subgoal 2 is:
 equiv_cc T I V V'

sim_cc_nstep < search.
Subgoal 2:

Variables: 
  K,J,I,N : nat
  M,V : tm
  M',V' : tm'
  T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
 equiv_cc T I V V'

sim_cc_nstep < assert I = N.
Subgoal 2.1:

Variables: 
  K,J,I,N : nat
  M,V : tm
  M',V' : tm'
  T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
 I = N

Subgoal 2 is:
 equiv_cc T I V V'

sim_cc_nstep < backchain add_arg2_det.
Subgoal 2:

Variables: 
  K,J,I,N : nat
  M,V : tm
  M',V' : tm'
  T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J I K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
H9 : I = N
============================
 equiv_cc T I V V'

sim_cc_nstep < case H9.
Subgoal 2:

Variables: 
  K,J,N : nat
  M,V : tm
  M',V' : tm'
  T : ty
H2 : {nstep J M V}
H3 : {val V}
H4 : {add J N K}
H5 : forall J V, le J K -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N K} /\ equiv_cc T N V V')
H6 : {eval' M' V'}
H7 : {add J N K}
H8 : equiv_cc T N V V'
============================
 equiv_cc T N V V'

sim_cc_nstep < search.
Proof completed.
Abella < Theorem sim_cc_closed_nstep' : 
forall T K N M M' M1', {nstep' N M1' M'} -> sim_cc T K M M' ->
  sim_cc T K M M1'.


============================
 forall T K N M M' M1', {nstep' N M1' M'} -> sim_cc T K M M' ->
   sim_cc T K M M1'

sim_cc_closed_nstep' < intros.

Variables: 
  K,N : nat
  M : tm
  M',M1' : tm'
  T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
============================
 sim_cc T K M M1'

sim_cc_closed_nstep' < unfold.

Variables: 
  K,N : nat
  M : tm
  M',M1' : tm'
  T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
============================
 forall J V, le J K -> {nstep J M V} -> {val V} ->
   (exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V')

sim_cc_closed_nstep' < intros.

Variables: 
  K,N,J : nat
  M,V : tm
  M',M1' : tm'
  T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
H3 : le J K
H4 : {nstep J M V}
H5 : {val V}
============================
 exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V'

sim_cc_closed_nstep' < case H3.

Variables: 
  K,N,J,N1 : nat
  M,V : tm
  M',M1' : tm'
  T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
H4 : {nstep J M V}
H5 : {val V}
H6 : {add J N1 K}
============================
 exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V'

sim_cc_closed_nstep' < apply sim_cc_nstep to H2 H4 _ _.

Variables: 
  K,N,J,N1 : nat
  M,V : tm
  M',M1',V' : tm'
  T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
H4 : {nstep J M V}
H5 : {val V}
H6 : {add J N1 K}
H7 : {eval' M' V'}
H8 : equiv_cc T N1 V V'
============================
 exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V'

sim_cc_closed_nstep' < apply nstep'_eval_closed to _ H7.

Variables: 
  K,N,J,N1 : nat
  M,V : tm
  M',M1',V' : tm'
  T : ty
H1 : {nstep' N M1' M'}
H2 : sim_cc T K M M'
H4 : {nstep J M V}
H5 : {val V}
H6 : {add J N1 K}
H7 : {eval' M' V'}
H8 : equiv_cc T N1 V V'
H9 : {eval' M1' V'}
============================
 exists V' N, {eval' M1' V'} /\ {add J N K} /\ equiv_cc T N V V'

sim_cc_closed_nstep' < search.
Proof completed.
Abella < Theorem sim_cc_app : 
forall T1 T K M1 M1' M2 M2', {is_nat K} -> {is_sty (arr T1 T)} ->
  sim_cc (arr T1 T) K M1 M1' -> sim_cc T1 K M2 M2' ->
  sim_cc T K (app M1 M2)
    (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))).


============================
 forall T1 T K M1 M1' M2 M2', {is_nat K} -> {is_sty (arr T1 T)} ->
   sim_cc (arr T1 T) K M1 M1' -> sim_cc T1 K M2 M2' ->
   sim_cc T K (app M1 M2)
     (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))

sim_cc_app < intros.

Variables: 
  K : nat
  M1,M2 : tm
  M1',M2' : tm'
  T1,T : ty
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
============================
 sim_cc T K (app M1 M2)
   (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))

sim_cc_app < unfold.

Variables: 
  K : nat
  M1,M2 : tm
  M1',M2' : tm'
  T1,T : ty
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
============================
 forall J V, le J K -> {nstep J (app M1 M2) V} -> {val V} ->
   (exists V' N, {eval'
                    (let' M1'
                       (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                    V'} /\
        {add J N K} /\ equiv_cc T N V V')

sim_cc_app < intros.

Variables: 
  K,J : nat
  M1,M2,V : tm
  M1',M2' : tm'
  T1,T : ty
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
H5 : le J K
H6 : {nstep J (app M1 M2) V}
H7 : {val V}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add J N K} /\ equiv_cc T N V V'

sim_cc_app < assert exists J1 J2 J3 J23 J123 V2 R, {add J2 J3 J23} /\ {add J1 J23 J123} /\ J =
s J123 /\ {nstep J1 M1 (fix R)} /\ {nstep J2 M2 V2} /\ {val V2} /\
  {nstep J3 (R (fix R) V2) V}.
Subgoal 1:

Variables: 
  K,J : nat
  M1,M2,V : tm
  M1',M2' : tm'
  T1,T : ty
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
H5 : le J K
H6 : {nstep J (app M1 M2) V}
H7 : {val V}
============================
 exists J1 J2 J3 J23 J123 V2 R, {add J2 J3 J23} /\ {add J1 J23 J123} /\ J =
 s J123 /\ {nstep J1 M1 (fix R)} /\ {nstep J2 M2 V2} /\ {val V2} /\
   {nstep J3 (R (fix R) V2) V}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add J N K} /\ equiv_cc T N V V'

sim_cc_app < backchain nstep_app_inv.

Variables: 
  K,J : nat
  M1,M2,V : tm
  M1',M2' : tm'
  T1,T : ty
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
H5 : le J K
H6 : {nstep J (app M1 M2) V}
H7 : {val V}
H8 : exists J1 J2 J3 J23 J123 V2 R, {add J2 J3 J23} /\ {add J1 J23 J123} /\
       J =
     s J123 /\ {nstep J1 M1 (fix R)} /\ {nstep J2 M2 V2} /\ {val V2} /\
       {nstep J3 (R (fix R) V2) V}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add J N K} /\ equiv_cc T N V V'

sim_cc_app < case H8.

Variables: 
  K,J1,J2,J3,J23,J123 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
H5 : le (s J123) K
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N K} /\ equiv_cc T N V V'

sim_cc_app < case H5.

Variables: 
  K,J1,J2,J3,J23,J123,N : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat K}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) K M1 M1'
H4 : sim_cc T1 K M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H15 : {add (s J123) N K}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N K} /\ equiv_cc T N V V'

sim_cc_app < case H15.

Variables: 
  J1,J2,J3,J23,J123,N,N3 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert exists N1, {add J1 N1 N3}.
Subgoal 2:

Variables: 
  J1,J2,J3,J23,J123,N,N3 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
============================
 exists N1, {add J1 N1 N3}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain k_minus_n1.

Variables: 
  J1,J2,J3,J23,J123,N,N3 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H17 : exists N1, {add J1 N1 N3}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < case H17.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert exists N2, {add J2 N2 N3}.
Subgoal 3:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
============================
 exists N2, {add J2 N2 N3}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain k_minus_n2.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H19 : exists N2, {add J2 N2 N3}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < case H19.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert exists V1', {eval' M1' V1'} /\ equiv_cc (arr T1 T) (s N1) (fix R) V1'.
Subgoal 4:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
============================
 exists V1', {eval' M1' V1'} /\ equiv_cc (arr T1 T) (s N1) (fix R) V1'

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain sim_cc_nstep.
Subgoal 4:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
============================
 {add J1 (s N1) (s N3)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain add_s.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H21 : exists V1', {eval' M1' V1'} /\ equiv_cc (arr T1 T) (s N1) (fix R) V1'
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < case H21.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert exists V2', {eval' M2' V2'} /\ equiv_cc T1 (s N2) V2 V2'.
Subgoal 5:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
============================
 exists V2', {eval' M2' V2'} /\ equiv_cc T1 (s N2) V2 V2'

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain sim_cc_nstep.
Subgoal 5:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
============================
 {add J2 (s N2) (s N3)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain add_s.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H24 : exists V2', {eval' M2' V2'} /\ equiv_cc T1 (s N2) V2 V2'
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < case H24.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert exists K' J12, {add J1 J2 J12} /\ {add J3 N K'} /\ {add J12 K' N3}.
Subgoal 6:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
============================
 exists K' J12, {add J1 J2 J12} /\ {add J3 N K'} /\ {add J12 K' N3}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain k_minus_n12.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H27 : exists K' J12, {add J1 J2 J12} /\ {add J3 N K'} /\ {add J12 K' N3}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < case H27.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert lt K' (s N1).
Subgoal 7:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
============================
 lt K' (s N1)

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain sum_complement_to_lt1 with N1 = J1, N2 = J2, N = N3.
Subgoal 7:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
============================
 {is_nat N3}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < case H1.
Subgoal 7:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : {is_nat N3}
============================
 {is_nat N3}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < search.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert lt K' (s N2).
Subgoal 8:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
============================
 lt K' (s N2)

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain sum_complement_to_lt2 with N1 = J1, N2 = J2, N = N3.
Subgoal 8:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
============================
 {is_nat N3}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < case H1.
Subgoal 8:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : {is_nat N3}
============================
 {is_nat N3}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < search.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < apply equiv_cc_arr_val' to _ H23.
Subgoal 9:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
============================
 {is_nat (s N1)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert {is_nat N1}.
Subgoal 9.1:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
============================
 {is_nat N1}

Subgoal 9 is:
 {is_nat (s N1)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain add_arg2_isnat.
Subgoal 9:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V1',V2' : tm'
  T1,T : ty
  R : tm -> tm -> tm
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' V1'}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) V1'
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {is_nat N1}
============================
 {is_nat (s N1)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < search.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert sim_cc T K' (R (fix R) V2) (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))).
Subgoal 10:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
 sim_cc T K' (R (fix R) V2) (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain app_equiv_cc_arr with T1 = T1, N1 = s N1, N2 = s N2, R = R, F = R'.
Subgoal 10.1:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
 {is_nat (s N1)}

Subgoal 10.2 is:
 {is_nat (s N2)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert {is_nat N1}.
Subgoal 10.1.1:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
 {is_nat N1}

Subgoal 10.1 is:
 {is_nat (s N1)}

Subgoal 10.2 is:
 {is_nat (s N2)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain add_arg2_isnat.
Subgoal 10.1:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : {is_nat N1}
============================
 {is_nat (s N1)}

Subgoal 10.2 is:
 {is_nat (s N2)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < search.
Subgoal 10.2:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
 {is_nat (s N2)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert {is_nat N2}.
Subgoal 10.2.1:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
============================
 {is_nat N2}

Subgoal 10.2 is:
 {is_nat (s N2)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain add_arg2_isnat.
Subgoal 10.2:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : {is_nat N2}
============================
 {is_nat (s N2)}

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < search.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
        (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < assert exists V', {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'} /\
  equiv_cc T N V V'.
Subgoal 11:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
        (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
============================
 exists V', {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'} /\
   equiv_cc T N V V'

Subgoal is:
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < backchain sim_cc_nstep.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
        (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H35 : exists V', {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'} /\
        equiv_cc T N V V'
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < case H35.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE,V' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
        (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
 exists V' N, {eval'
                 (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
                 V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < exists V'.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE,V' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
        (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
 exists N, {eval' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
              V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < exists N.

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE,V' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
        (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
 {eval' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) V'} /\
   {add (s J123) N (s N3)} /\ equiv_cc T N V V'

sim_cc_app < split.
Subgoal 12:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE,V' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
        (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
 {eval' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) V'}

Subgoal 13 is:
 {add (s J123) N (s N3)}

Subgoal 14 is:
 equiv_cc T N V V'

sim_cc_app < apply eval'_open_fwd to _ H25 H36 with R = R', M1 = clos' (abs' R') VE.
Subgoal 12:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE,V' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
        (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
H38 : {eval'
         (open' (clos' (abs' R') VE)
            (f\e\app' f (pair' (clos' (abs' R') VE) (pair' M2' e))))
         V'}
============================
 {eval' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) V'}

Subgoal 13 is:
 {add (s J123) N (s N3)}

Subgoal 14 is:
 equiv_cc T N V V'

sim_cc_app < backchain eval'_let_fwd with R = g\open' g (f\e\app' f (pair' g (pair' M2' e))).
Subgoal 13:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE,V' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
        (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
 {add (s J123) N (s N3)}

Subgoal 14 is:
 equiv_cc T N V V'

sim_cc_app < search.
Subgoal 14:

Variables: 
  J1,J2,J3,J23,J123,N,N3,N1,N2 : nat
  K',J12 : nat
  M1,M2,V,V2 : tm
  M1',M2',V2',VE,V' : tm'
  T1,T : ty
  R : tm -> tm -> tm
  R' : tm' -> tm'
H1 : {is_nat (s N3)}
H2 : {is_sty (arr T1 T)}
H3 : sim_cc (arr T1 T) (s N3) M1 M1'
H4 : sim_cc T1 (s N3) M2 M2'
H6 : {nstep (s J123) (app M1 M2) V}
H7 : {val V}
H9 : {add J2 J3 J23}
H10 : {add J1 J23 J123}
H11 : {nstep J1 M1 (fix R)}
H12 : {nstep J2 M2 V2}
H13 : {val V2}
H14 : {nstep J3 (R (fix R) V2) V}
H16 : {add J123 N N3}
H18 : {add J1 N1 N3}
H20 : {add J2 N2 N3}
H22 : {eval' M1' (clos' (abs' R') VE)}
H23 : equiv_cc (arr T1 T) (s N1) (fix R) (clos' (abs' R') VE)
H25 : {eval' M2' V2'}
H26 : equiv_cc T1 (s N2) V2 V2'
H28 : {add J1 J2 J12}
H29 : {add J3 N K'}
H30 : {add J12 K' N3}
H31 : lt K' (s N1)
H32 : lt K' (s N2)
H33 : {val' VE}
H34 : sim_cc T K' (R (fix R) V2)
        (R' (pair' (clos' (abs' R') VE) (pair' V2' VE)))
H36 : {eval' (R' (pair' (clos' (abs' R') VE) (pair' V2' VE))) V'}
H37 : equiv_cc T N V V'
============================
 equiv_cc T N V V'

sim_cc_app < search.
Proof completed.
Abella < Define subst_env_equiv_cc : (list o) -> nat -> (list (map tm tm)) -> tm' -> prop by 
subst_env_equiv_cc nil K ML unit';
subst_env_equiv_cc (of X T :: L) K ML (pair' V' VE) := exists V, subst_env_equiv_cc L K ML VE /\ member (map X V) ML /\
  equiv_cc T K V V'.

Abella < Define subst_equiv_cc : (list o) -> nat -> (list (map tm tm)) -> (list (map tm' tm')) -> prop by 
nabla e, subst_equiv_cc L K ML (map e VE :: nil) := subst_env_equiv_cc L K ML VE;
nabla x y, subst_equiv_cc (of x T :: L) K (map x V :: ML) (map y V' :: ML') := equiv_cc T K V V' /\ subst_equiv_cc L K ML ML'.

Abella < Theorem subst_env_equiv_cc_closed : 
forall L K J ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
  le J K -> subst_env_equiv_cc L J ML VE.


============================
 forall L K J ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
   le J K -> subst_env_equiv_cc L J ML VE

subst_env_equiv_cc_closed < induction on 3.

IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
============================
 forall L K J ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE @ ->
   le J K -> subst_env_equiv_cc L J ML VE

subst_env_equiv_cc_closed < intros.

Variables: 
  ML : list (map tm tm)
  L : list o
  K,J : nat
  VE : tm'
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx L
H3 : subst_env_equiv_cc L K ML VE @
H4 : le J K
============================
 subst_env_equiv_cc L J ML VE

subst_env_equiv_cc_closed < case H3.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  K,J : nat
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx nil
H4 : le J K
============================
 subst_env_equiv_cc nil J ML unit'

Subgoal 2 is:
 subst_env_equiv_cc (of X T :: L1) J ML (pair' V' VE1)

subst_env_equiv_cc_closed < search.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K,J : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
 subst_env_equiv_cc (of X T :: L1) J ML (pair' V' VE1)

subst_env_equiv_cc_closed < unfold.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K,J : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
 exists V, subst_env_equiv_cc L1 J ML VE1 /\ member (map X V) ML /\
   equiv_cc T J V V'

subst_env_equiv_cc_closed < exists V.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K,J : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
 subst_env_equiv_cc L1 J ML VE1 /\ member (map X V) ML /\ equiv_cc T J V V'

subst_env_equiv_cc_closed < split.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K,J : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
 subst_env_equiv_cc L1 J ML VE1

Subgoal 2.2 is:
 member (map X V) ML

Subgoal 2.3 is:
 equiv_cc T J V V'

subst_env_equiv_cc_closed < backchain IH.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K,J : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
 ctx L1

Subgoal 2.2 is:
 member (map X V) ML

Subgoal 2.3 is:
 equiv_cc T J V V'

subst_env_equiv_cc_closed < case H2.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K,J : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
H8 : ctx L1
H9 : name X
H10 : {is_sty T}
H11 : forall T', member (of X T') L1 -> T = T'
============================
 ctx L1

Subgoal 2.2 is:
 member (map X V) ML

Subgoal 2.3 is:
 equiv_cc T J V V'

subst_env_equiv_cc_closed < search.
Subgoal 2.2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K,J : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
 member (map X V) ML

Subgoal 2.3 is:
 equiv_cc T J V V'

subst_env_equiv_cc_closed < search.
Subgoal 2.3:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K,J : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
 equiv_cc T J V V'

subst_env_equiv_cc_closed < backchain equiv_cc_closed with K = K.
Subgoal 2.3:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K,J : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
 {is_sty T}

subst_env_equiv_cc_closed < case H2.
Subgoal 2.3:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K,J : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K J ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> le J K ->
       subst_env_equiv_cc L J ML VE
H1 : {is_nat K}
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML VE1 *
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
H8 : ctx L1
H9 : name X
H10 : {is_sty T}
H11 : forall T', member (of X T') L1 -> T = T'
============================
 {is_sty T}

subst_env_equiv_cc_closed < search.
Proof completed.
Abella < Theorem subst_equiv_cc_closed : 
forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv_cc L K ML ML' ->
  le J K -> subst_equiv_cc L J ML ML'.


============================
 forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv_cc L K ML ML' ->
   le J K -> subst_equiv_cc L J ML ML'

subst_equiv_cc_closed < induction on 3.

IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
============================
 forall L K J ML ML', {is_nat K} -> ctx L -> subst_equiv_cc L K ML ML' @ ->
   le J K -> subst_equiv_cc L J ML ML'

subst_equiv_cc_closed < intros.

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  K,J : nat
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : ctx L
H3 : subst_equiv_cc L K ML ML' @
H4 : le J K
============================
 subst_equiv_cc L J ML ML'

subst_equiv_cc_closed < case H3.
Subgoal 1:

Variables: 
  ML1 : list (map tm tm)
  L1 : list o
  K,J : nat
  VE : tm'
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : ctx L1
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML1 VE
============================
 [n1 : tm']
 |> subst_equiv_cc L1 J ML1 (map n1 VE :: nil)

Subgoal 2 is:
 [n1 : tm, n2 : tm']
 |> subst_equiv_cc (of n1 T :: L1) J (map n1 V :: ML1) (map n2 V' :: ML'1)

subst_equiv_cc_closed < unfold.
Subgoal 1:

Variables: 
  ML1 : list (map tm tm)
  L1 : list o
  K,J : nat
  VE : tm'
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : ctx L1
H4 : le J K
H5 : subst_env_equiv_cc L1 K ML1 VE
============================
 subst_env_equiv_cc L1 J ML1 VE

Subgoal 2 is:
 [n1 : tm, n2 : tm']
 |> subst_equiv_cc (of n1 T :: L1) J (map n1 V :: ML1) (map n2 V' :: ML'1)

subst_equiv_cc_closed < backchain subst_env_equiv_cc_closed.
Subgoal 2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K,J : nat
  V : tm
  V' : tm'
  T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : [n1 : tm]
     |> ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
============================
 [n1 : tm, n2 : tm']
 |> subst_equiv_cc (of n1 T :: L1) J (map n1 V :: ML1) (map n2 V' :: ML'1)

subst_equiv_cc_closed < unfold.
Subgoal 2.1:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K,J : nat
  V : tm
  V' : tm'
  T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : [n1 : tm]
     |> ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
============================
 equiv_cc T J V V'

Subgoal 2.2 is:
 subst_equiv_cc L1 J ML1 ML'1

subst_equiv_cc_closed < backchain equiv_cc_closed.
Subgoal 2.1:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K,J : nat
  V : tm
  V' : tm'
  T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : [n1 : tm]
     |> ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
============================
 {is_sty T}

Subgoal 2.2 is:
 subst_equiv_cc L1 J ML1 ML'1

subst_equiv_cc_closed < case H2.
Subgoal 2.1:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K,J : nat
  V : tm
  V' : tm'
  T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
H7 : ctx L1
H8 : [n1 : tm]
     |> name n1
H9 : {is_sty T}
H10 : [n1 : tm]
      |> forall T', member (of n1 T') L1 -> T = T'
============================
 {is_sty T}

Subgoal 2.2 is:
 subst_equiv_cc L1 J ML1 ML'1

subst_equiv_cc_closed < search.
Subgoal 2.2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K,J : nat
  V : tm
  V' : tm'
  T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : [n1 : tm]
     |> ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
============================
 subst_equiv_cc L1 J ML1 ML'1

subst_equiv_cc_closed < backchain IH.
Subgoal 2.2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K,J : nat
  V : tm
  V' : tm'
  T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H2 : [n1 : tm]
     |> ctx (of n1 T :: L1)
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
============================
 ctx L1

subst_equiv_cc_closed < case H2.
Subgoal 2.2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K,J : nat
  V : tm
  V' : tm'
  T : ty
IH : forall L K J ML ML', {is_nat K} -> ctx L ->
       subst_equiv_cc L K ML ML' * -> le J K -> subst_equiv_cc L J ML ML'
H1 : {is_nat K}
H4 : le J K
H5 : equiv_cc T K V V'
H6 : subst_equiv_cc L1 K ML1 ML'1 *
H7 : ctx L1
H8 : [n1 : tm]
     |> name n1
H9 : {is_sty T}
H10 : [n1 : tm]
      |> forall T', member (of n1 T') L1 -> T = T'
============================
 ctx L1

subst_equiv_cc_closed < search.
Proof completed.
Abella < Theorem subst_equiv_cc_extend : 
forall T L K ML ML' V V', nabla x y, subst_equiv_cc L K ML ML' ->
  equiv_cc T K V V' ->
  subst_equiv_cc (of x T :: L) K (map x V :: ML) (map y V' :: ML').


============================
 forall T L K ML ML' V V', nabla x y, subst_equiv_cc L K ML ML' ->
   equiv_cc T K V V' ->
   subst_equiv_cc (of x T :: L) K (map x V :: ML) (map y V' :: ML')

subst_equiv_cc_extend < intros.

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
H1 : subst_equiv_cc L K ML ML'
H2 : equiv_cc T K V V'
============================
 [n1 : tm, n2 : tm']
 |> subst_equiv_cc (of n1 T :: L) K (map n1 V :: ML) (map n2 V' :: ML')

subst_equiv_cc_extend < unfold.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
H1 : subst_equiv_cc L K ML ML'
H2 : equiv_cc T K V V'
============================
 equiv_cc T K V V'

Subgoal 2 is:
 subst_equiv_cc L K ML ML'

subst_equiv_cc_extend < search.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
H1 : subst_equiv_cc L K ML ML'
H2 : equiv_cc T K V V'
============================
 subst_equiv_cc L K ML ML'

subst_equiv_cc_extend < search.
Proof completed.
Abella < Theorem subst_env_equiv_cc_val' : 
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
  {val' VE}.


============================
 forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
   {val' VE}

subst_env_equiv_cc_val' < induction on 3.

IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {val' VE}
============================
 forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE @ ->
   {val' VE}

subst_env_equiv_cc_val' < intros.

Variables: 
  ML : list (map tm tm)
  L : list o
  K : nat
  VE : tm'
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H2 : ctx L
H3 : subst_env_equiv_cc L K ML VE @
============================
 {val' VE}

subst_env_equiv_cc_val' < case H3.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  K : nat
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H2 : ctx nil
============================
 {val' unit'}

Subgoal 2 is:
 {val' (pair' V' VE1)}

subst_env_equiv_cc_val' < search.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
============================
 {val' (pair' V' VE1)}

subst_env_equiv_cc_val' < case H2.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
============================
 {val' (pair' V' VE1)}

subst_env_equiv_cc_val' < assert {val' VE1}.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
============================
 {val' VE1}

Subgoal 2 is:
 {val' (pair' V' VE1)}

subst_env_equiv_cc_val' < backchain IH.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {val' VE1}
============================
 {val' (pair' V' VE1)}

subst_env_equiv_cc_val' < assert {val' V'}.
Subgoal 2.2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {val' VE1}
============================
 {val' V'}

Subgoal 2 is:
 {val' (pair' V' VE1)}

subst_env_equiv_cc_val' < backchain equiv_cc_val'.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {val' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {val' VE1}
H12 : {val' V'}
============================
 {val' (pair' V' VE1)}

subst_env_equiv_cc_val' < search.
Proof completed.
Abella < Theorem subst_env_equiv_cc_tm' : 
forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
  {tm' VE}.


============================
 forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE ->
   {tm' VE}

subst_env_equiv_cc_tm' < induction on 3.

IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {tm' VE}
============================
 forall L K ML VE, {is_nat K} -> ctx L -> subst_env_equiv_cc L K ML VE @ ->
   {tm' VE}

subst_env_equiv_cc_tm' < intros.

Variables: 
  ML : list (map tm tm)
  L : list o
  K : nat
  VE : tm'
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H2 : ctx L
H3 : subst_env_equiv_cc L K ML VE @
============================
 {tm' VE}

subst_env_equiv_cc_tm' < case H3.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  K : nat
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H2 : ctx nil
============================
 {tm' unit'}

Subgoal 2 is:
 {tm' (pair' V' VE1)}

subst_env_equiv_cc_tm' < search.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H2 : ctx (of X T :: L1)
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
============================
 {tm' (pair' V' VE1)}

subst_env_equiv_cc_tm' < case H2.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
============================
 {tm' (pair' V' VE1)}

subst_env_equiv_cc_tm' < assert {tm' VE1}.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
============================
 {tm' VE1}

Subgoal 2 is:
 {tm' (pair' V' VE1)}

subst_env_equiv_cc_tm' < backchain IH.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {tm' VE1}
============================
 {tm' (pair' V' VE1)}

subst_env_equiv_cc_tm' < assert {tm' V'}.
Subgoal 2.2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {tm' VE1}
============================
 {tm' V'}

Subgoal 2 is:
 {tm' (pair' V' VE1)}

subst_env_equiv_cc_tm' < backchain equiv_cc_tm'.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE, {is_nat K} -> ctx L ->
       subst_env_equiv_cc L K ML VE * -> {tm' VE}
H1 : {is_nat K}
H4 : subst_env_equiv_cc L1 K ML VE1 *
H5 : member (map X V) ML
H6 : equiv_cc T K V V'
H7 : ctx L1
H8 : name X
H9 : {is_sty T}
H10 : forall T', member (of X T') L1 -> T = T'
H11 : {tm' VE1}
H12 : {tm' V'}
============================
 {tm' (pair' V' VE1)}

subst_env_equiv_cc_tm' < search.
Proof completed.
Abella < Theorem subst_env_equiv_cc_vars_in_subst : 
forall L K ML VE Vs, subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
  vars_in_subst Vs ML.


============================
 forall L K ML VE Vs, subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
   vars_in_subst Vs ML

subst_env_equiv_cc_vars_in_subst < induction on 1.

IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
       vars_of_ctx L Vs -> vars_in_subst Vs ML
============================
 forall L K ML VE Vs, subst_env_equiv_cc L K ML VE @ -> vars_of_ctx L Vs ->
   vars_in_subst Vs ML

subst_env_equiv_cc_vars_in_subst < intros.

Variables: 
  ML : list (map tm tm)
  L : list o
  Vs : list tm
  K : nat
  VE : tm'
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
       vars_of_ctx L Vs -> vars_in_subst Vs ML
H1 : subst_env_equiv_cc L K ML VE @
H2 : vars_of_ctx L Vs
============================
 vars_in_subst Vs ML

subst_env_equiv_cc_vars_in_subst < case H1.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  Vs : list tm
  K : nat
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
       vars_of_ctx L Vs -> vars_in_subst Vs ML
H2 : vars_of_ctx nil Vs
============================
 vars_in_subst Vs ML

Subgoal 2 is:
 vars_in_subst Vs ML

subst_env_equiv_cc_vars_in_subst < case H2.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  K : nat
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
       vars_of_ctx L Vs -> vars_in_subst Vs ML
============================
 vars_in_subst nil ML

Subgoal 2 is:
 vars_in_subst Vs ML

subst_env_equiv_cc_vars_in_subst < search.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  Vs : list tm
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
       vars_of_ctx L Vs -> vars_in_subst Vs ML
H2 : vars_of_ctx (of X T :: L1) Vs
H3 : subst_env_equiv_cc L1 K ML VE1 *
H4 : member (map X V) ML
H5 : equiv_cc T K V V'
============================
 vars_in_subst Vs ML

subst_env_equiv_cc_vars_in_subst < case H2.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  Vs1 : list tm
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
       vars_of_ctx L Vs -> vars_in_subst Vs ML
H3 : subst_env_equiv_cc L1 K ML VE1 *
H4 : member (map X V) ML
H5 : equiv_cc T K V V'
H6 : vars_of_ctx L1 Vs1
============================
 vars_in_subst (X :: Vs1) ML

subst_env_equiv_cc_vars_in_subst < unfold.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  Vs1 : list tm
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
       vars_of_ctx L Vs -> vars_in_subst Vs ML
H3 : subst_env_equiv_cc L1 K ML VE1 *
H4 : member (map X V) ML
H5 : equiv_cc T K V V'
H6 : vars_of_ctx L1 Vs1
============================
 vars_in_subst Vs1 ML

Subgoal 2.2 is:
 exists V, member (map X V) ML

subst_env_equiv_cc_vars_in_subst < backchain IH.
Subgoal 2.2:

Variables: 
  ML : list (map tm tm)
  L1 : list o
  Vs1 : list tm
  K : nat
  V,X : tm
  VE1,V' : tm'
  T : ty
IH : forall L K ML VE Vs, subst_env_equiv_cc L K ML VE * ->
       vars_of_ctx L Vs -> vars_in_subst Vs ML
H3 : subst_env_equiv_cc L1 K ML VE1 *
H4 : member (map X V) ML
H5 : equiv_cc T K V V'
H6 : vars_of_ctx L1 Vs1
============================
 exists V, member (map X V) ML

subst_env_equiv_cc_vars_in_subst < search.
Proof completed.
Abella < Theorem subst_equiv_cc_vars_in_subst : 
forall L K Vs ML ML', subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
  vars_in_subst Vs ML.


============================
 forall L K Vs ML ML', subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
   vars_in_subst Vs ML

subst_equiv_cc_vars_in_subst < induction on 1.

IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
       vars_in_subst Vs ML
============================
 forall L K Vs ML ML', subst_equiv_cc L K ML ML' @ -> vars_of_ctx L Vs ->
   vars_in_subst Vs ML

subst_equiv_cc_vars_in_subst < intros.

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  K : nat
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
       vars_in_subst Vs ML
H1 : subst_equiv_cc L K ML ML' @
H2 : vars_of_ctx L Vs
============================
 vars_in_subst Vs ML

subst_equiv_cc_vars_in_subst < case H1.
Subgoal 1:

Variables: 
  ML1 : list (map tm tm)
  L1 : list o
  Vs : list tm
  K : nat
  VE : tm'
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
       vars_in_subst Vs ML
H2 : vars_of_ctx L1 Vs
H3 : subst_env_equiv_cc L1 K ML1 VE
============================
 vars_in_subst Vs ML1

Subgoal 2 is:
 [n1 : tm]
 |> vars_in_subst (Vs n1) (map n1 V :: ML1)

subst_equiv_cc_vars_in_subst < backchain subst_env_equiv_cc_vars_in_subst.
Subgoal 2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
  Vs : tm -> (list tm)
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
       vars_in_subst Vs ML
H2 : [n1 : tm]
     |> vars_of_ctx (of n1 T :: L1) (Vs n1)
H3 : equiv_cc T K V V'
H4 : subst_equiv_cc L1 K ML1 ML'1 *
============================
 [n1 : tm]
 |> vars_in_subst (Vs n1) (map n1 V :: ML1)

subst_equiv_cc_vars_in_subst < case H2.
Subgoal 2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
  Vs1 : tm -> (list tm)
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
       vars_in_subst Vs ML
H3 : equiv_cc T K V V'
H4 : subst_equiv_cc L1 K ML1 ML'1 *
H5 : [n1 : tm]
     |> vars_of_ctx L1 (Vs1 n1)
============================
 [n1 : tm]
 |> vars_in_subst (n1 :: Vs1 n1) (map n1 V :: ML1)

subst_equiv_cc_vars_in_subst < unfold.
Subgoal 2.1:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
  Vs1 : tm -> (list tm)
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
       vars_in_subst Vs ML
H3 : equiv_cc T K V V'
H4 : subst_equiv_cc L1 K ML1 ML'1 *
H5 : [n1 : tm]
     |> vars_of_ctx L1 (Vs1 n1)
============================
 [n1 : tm]
 |> vars_in_subst (Vs1 n1) (map n1 V :: ML1)

Subgoal 2.2 is:
 [n1 : tm]
 |> exists V1, member (map n1 V1) (map n1 V :: ML1)

subst_equiv_cc_vars_in_subst < apply IH to H4 H5.
Subgoal 2.1:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
  Vs1 : tm -> (list tm)
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
       vars_in_subst Vs ML
H3 : equiv_cc T K V V'
H4 : subst_equiv_cc L1 K ML1 ML'1 *
H5 : [n1 : tm]
     |> vars_of_ctx L1 (Vs1 n1)
H6 : [n1 : tm]
     |> vars_in_subst (Vs1 n1) ML1
============================
 [n1 : tm]
 |> vars_in_subst (Vs1 n1) (map n1 V :: ML1)

Subgoal 2.2 is:
 [n1 : tm]
 |> exists V1, member (map n1 V1) (map n1 V :: ML1)

subst_equiv_cc_vars_in_subst < backchain vars_in_subst_extend.
Subgoal 2.2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
  Vs1 : tm -> (list tm)
IH : forall L K Vs ML ML', subst_equiv_cc L K ML ML' * -> vars_of_ctx L Vs ->
       vars_in_subst Vs ML
H3 : equiv_cc T K V V'
H4 : subst_equiv_cc L1 K ML1 ML'1 *
H5 : [n1 : tm]
     |> vars_of_ctx L1 (Vs1 n1)
============================
 [n1 : tm]
 |> exists V1, member (map n1 V1) (map n1 V :: ML1)

subst_equiv_cc_vars_in_subst < search.
Proof completed.
Abella < Theorem subst_env_equiv_cc_mem : 
forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
  {memb X Vs} -> (exists V, member (map X V) ML).


============================
 forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
   {memb X Vs} -> (exists V, member (map X V) ML)

subst_env_equiv_cc_mem < induction on 3.

IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
       {memb X Vs}* -> (exists V, member (map X V) ML)
============================
 forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
   {memb X Vs}@ -> (exists V, member (map X V) ML)

subst_env_equiv_cc_mem < intros.

Variables: 
  ML : list (map tm tm)
  L : list o
  Vs : list tm
  K : nat
  X : tm
  E : tm'
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
       {memb X Vs}* -> (exists V, member (map X V) ML)
H1 : subst_env_equiv_cc L K ML E
H2 : vars_of_ctx L Vs
H3 : {memb X Vs}@
============================
 exists V, member (map X V) ML

subst_env_equiv_cc_mem < case H3.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  L : list o
  L1 : list tm
  K : nat
  X : tm
  E : tm'
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
       {memb X Vs}* -> (exists V, member (map X V) ML)
H1 : subst_env_equiv_cc L K ML E
H2 : vars_of_ctx L (X :: L1)
============================
 exists V, member (map X V) ML

Subgoal 2 is:
 exists V, member (map X V) ML

subst_env_equiv_cc_mem < case H2.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  L2 : list o
  L1 : list tm
  K : nat
  X : tm
  E : tm'
  T : ty
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
       {memb X Vs}* -> (exists V, member (map X V) ML)
H1 : subst_env_equiv_cc (of X T :: L2) K ML E
H4 : vars_of_ctx L2 L1
============================
 exists V, member (map X V) ML

Subgoal 2 is:
 exists V, member (map X V) ML

subst_env_equiv_cc_mem < case H1.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  L2 : list o
  L1 : list tm
  K : nat
  X,V : tm
  VE,V' : tm'
  T : ty
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
       {memb X Vs}* -> (exists V, member (map X V) ML)
H4 : vars_of_ctx L2 L1
H5 : subst_env_equiv_cc L2 K ML VE
H6 : member (map X V) ML
H7 : equiv_cc T K V V'
============================
 exists V, member (map X V) ML

Subgoal 2 is:
 exists V, member (map X V) ML

subst_env_equiv_cc_mem < search.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L : list o
  L1 : list tm
  K : nat
  X,X1 : tm
  E : tm'
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
       {memb X Vs}* -> (exists V, member (map X V) ML)
H1 : subst_env_equiv_cc L K ML E
H2 : vars_of_ctx L (X1 :: L1)
H4 : {memb X L1}*
============================
 exists V, member (map X V) ML

subst_env_equiv_cc_mem < case H2.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L2 : list o
  L1 : list tm
  K : nat
  X,X1 : tm
  E : tm'
  T : ty
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
       {memb X Vs}* -> (exists V, member (map X V) ML)
H1 : subst_env_equiv_cc (of X1 T :: L2) K ML E
H4 : {memb X L1}*
H5 : vars_of_ctx L2 L1
============================
 exists V, member (map X V) ML

subst_env_equiv_cc_mem < case H1.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L2 : list o
  L1 : list tm
  K : nat
  X,X1,V : tm
  VE,V' : tm'
  T : ty
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
       {memb X Vs}* -> (exists V, member (map X V) ML)
H4 : {memb X L1}*
H5 : vars_of_ctx L2 L1
H6 : subst_env_equiv_cc L2 K ML VE
H7 : member (map X1 V) ML
H8 : equiv_cc T K V V'
============================
 exists V, member (map X V) ML

subst_env_equiv_cc_mem < apply IH to H6 H5 H4.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L2 : list o
  L1 : list tm
  K : nat
  X,X1,V,V1 : tm
  VE,V' : tm'
  T : ty
IH : forall L K ML Vs E X, subst_env_equiv_cc L K ML E -> vars_of_ctx L Vs ->
       {memb X Vs}* -> (exists V, member (map X V) ML)
H4 : {memb X L1}*
H5 : vars_of_ctx L2 L1
H6 : subst_env_equiv_cc L2 K ML VE
H7 : member (map X1 V) ML
H8 : equiv_cc T K V V'
H9 : member (map X V1) ML
============================
 exists V, member (map X V) ML

subst_env_equiv_cc_mem < search.
Proof completed.
Abella < Theorem subst_equiv_cc_mem : 
forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
  {memb X Vs} -> (exists V, member (map X V) ML).


============================
 forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
   {memb X Vs} -> (exists V, member (map X V) ML)

subst_equiv_cc_mem < induction on 1.

IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
       vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
============================
 forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' @ -> vars_of_ctx L Vs ->
   {memb X Vs} -> (exists V, member (map X V) ML)

subst_equiv_cc_mem < intros.

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  K : nat
  X : tm
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
       vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H1 : subst_equiv_cc L K ML ML' @
H2 : vars_of_ctx L Vs
H3 : {memb X Vs}
============================
 exists V, member (map X V) ML

subst_equiv_cc_mem < case H1.
Subgoal 1:

Variables: 
  ML1 : list (map tm tm)
  L1 : list o
  Vs : list tm
  K : nat
  X : tm
  VE : tm'
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
       vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H2 : vars_of_ctx L1 Vs
H3 : {memb X Vs}
H4 : subst_env_equiv_cc L1 K ML1 VE
============================
 exists V, member (map X V) ML1

Subgoal 2 is:
 [n1 : tm]
 |> exists V1, member (map (X n1) V1) (map n1 V :: ML1)

subst_equiv_cc_mem < backchain subst_env_equiv_cc_mem.
Subgoal 2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
  Vs : tm -> (list tm)
  X : tm -> tm
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
       vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H2 : [n1 : tm]
     |> vars_of_ctx (of n1 T :: L1) (Vs n1)
H3 : [n1 : tm]
     |> {memb (X n1) (Vs n1)}
H4 : equiv_cc T K V V'
H5 : subst_equiv_cc L1 K ML1 ML'1 *
============================
 [n1 : tm]
 |> exists V1, member (map (X n1) V1) (map n1 V :: ML1)

subst_equiv_cc_mem < case H2.
Subgoal 2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
  Vs1 : tm -> (list tm)
  X : tm -> tm
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
       vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H3 : [n1 : tm]
     |> {memb (X n1) (n1 :: Vs1 n1)}
H4 : equiv_cc T K V V'
H5 : subst_equiv_cc L1 K ML1 ML'1 *
H6 : [n1 : tm]
     |> vars_of_ctx L1 (Vs1 n1)
============================
 [n1 : tm]
 |> exists V1, member (map (X n1) V1) (map n1 V :: ML1)

subst_equiv_cc_mem < case H3.
Subgoal 2.1:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
  Vs1 : tm -> (list tm)
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
       vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H4 : equiv_cc T K V V'
H5 : subst_equiv_cc L1 K ML1 ML'1 *
H6 : [n1 : tm]
     |> vars_of_ctx L1 (Vs1 n1)
============================
 [n1 : tm]
 |> exists V1, member (map n1 V1) (map n1 V :: ML1)

Subgoal 2.2 is:
 [n1 : tm]
 |> exists V1, member (map (X n1) V1) (map n1 V :: ML1)

subst_equiv_cc_mem < search.
Subgoal 2.2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
  Vs1 : tm -> (list tm)
  X : tm -> tm
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
       vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H4 : equiv_cc T K V V'
H5 : subst_equiv_cc L1 K ML1 ML'1 *
H6 : [n1 : tm]
     |> vars_of_ctx L1 (Vs1 n1)
H7 : [n1 : tm]
     |> {memb (X n1) (Vs1 n1)}
============================
 [n1 : tm]
 |> exists V1, member (map (X n1) V1) (map n1 V :: ML1)

subst_equiv_cc_mem < apply IH to H5 H6 H7.
Subgoal 2.2:

Variables: 
  ML1 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L1 : list o
  K : nat
  V : tm
  V' : tm'
  T : ty
  Vs1 : tm -> (list tm)
  X,V1 : tm -> tm
IH : forall L ML ML' K Vs X, subst_equiv_cc L K ML ML' * ->
       vars_of_ctx L Vs -> {memb X Vs} -> (exists V, member (map X V) ML)
H4 : equiv_cc T K V V'
H5 : subst_equiv_cc L1 K ML1 ML'1 *
H6 : [n1 : tm]
     |> vars_of_ctx L1 (Vs1 n1)
H7 : [n1 : tm]
     |> {memb (X n1) (Vs1 n1)}
H8 : [n1 : tm]
     |> member (map (X n1) (V1 n1)) ML1
============================
 [n1 : tm]
 |> exists V1, member (map (X n1) V1) (map n1 V :: ML1)

subst_equiv_cc_mem < search.
Proof completed.
Abella < Theorem eq_memb_rewrite_tm' : 
forall A B X M', nabla x, A = B -> {memb (map X (M' x)) (B x)} ->
  {memb (map X (M' x)) (A x)}.


============================
 forall A B X M', nabla x, A = B -> {memb (map X (M' x)) (B x)} ->
   {memb (map X (M' x)) (A x)}

eq_memb_rewrite_tm' < intros.

Variables: 
  X : tm
  A,B : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
H1 : A = B
H2 : [n1 : tm']
     |> {memb (map X (M' n1)) (B n1)}
============================
 [n1 : tm']
 |> {memb (map X (M' n1)) (A n1)}

eq_memb_rewrite_tm' < case H1.

Variables: 
  X : tm
  B : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
H2 : [n1 : tm']
     |> {memb (map X (M' n1)) (B n1)}
============================
 [n1 : tm']
 |> {memb (map X (M' n1)) (B n1)}

eq_memb_rewrite_tm' < search.
Proof completed.
Abella < Define env_elem_aux : (tm' -> tm') -> prop by 
env_elem_aux x\x;
env_elem_aux (x\snd' (R x)) := env_elem_aux R.

Abella < Define env_elem : (tm' -> tm') -> prop by 
env_elem (x\fst' (R x)) := env_elem_aux R.

Abella < Theorem env_elem_aux_closed : 
forall E, nabla x, env_elem_aux (E x) -> (exists E', E = y\E').


============================
 forall E, nabla x, env_elem_aux (E x) -> (exists E', E = y\E')

env_elem_aux_closed < induction on 1.

IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
============================
 forall E, nabla x, env_elem_aux (E x) @ -> (exists E', E = y\E')

env_elem_aux_closed < intros.

Variables: 
  E : tm' -> tm' -> tm'
IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
H1 : [n1 : tm']
     |> env_elem_aux (E n1) @
============================
 exists E', E = y\E'

env_elem_aux_closed < case H1.
Subgoal 1:

IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
============================
 exists E', z1\z2\z2 = y\E'

Subgoal 2 is:
 exists E', z1\z2\snd' (R z1 z2) = y\E'

env_elem_aux_closed < search.
Subgoal 2:

Variables: 
  R : tm' -> tm' -> tm'
IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
H2 : [n1 : tm']
     |> env_elem_aux (R n1) *
============================
 exists E', z1\z2\snd' (R z1 z2) = y\E'

env_elem_aux_closed < apply IH to H2.
Subgoal 2:

Variables: 
  E' : tm' -> tm'
IH : forall E, nabla x, env_elem_aux (E x) * -> (exists E', E = y\E')
H2 : env_elem_aux E' *
============================
 exists E'1, z1\z2\snd' (E' z2) = y\E'1

env_elem_aux_closed < search.
Proof completed.
Abella < Theorem env_elem_closed : 
forall E, nabla x, env_elem (E x) -> (exists E', E = y\E').


============================
 forall E, nabla x, env_elem (E x) -> (exists E', E = y\E')

env_elem_closed < intros.

Variables: 
  E : tm' -> tm' -> tm'
H1 : [n1 : tm']
     |> env_elem (E n1)
============================
 exists E', E = y\E'

env_elem_closed < case H1.

Variables: 
  R : tm' -> tm' -> tm'
H2 : [n1 : tm']
     |> env_elem_aux (R n1)
============================
 exists E', z1\z2\fst' (R z1 z2) = y\E'

env_elem_closed < apply env_elem_aux_closed to H2.

Variables: 
  E' : tm' -> tm'
H2 : env_elem_aux E'
============================
 exists E'1, z1\z2\fst' (E' z2) = y\E'1

env_elem_closed < search.
Proof completed.
Abella < Theorem env_elem_aux_extend : 
forall E, env_elem_aux E -> env_elem_aux (x\E (snd' x)).


============================
 forall E, env_elem_aux E -> env_elem_aux (x\E (snd' x))

env_elem_aux_extend < induction on 1.

IH : forall E, env_elem_aux E * -> env_elem_aux (x\E (snd' x))
============================
 forall E, env_elem_aux E @ -> env_elem_aux (x\E (snd' x))

env_elem_aux_extend < intros.

Variables: 
  E : tm' -> tm'
IH : forall E, env_elem_aux E * -> env_elem_aux (x\E (snd' x))
H1 : env_elem_aux E @
============================
 env_elem_aux (x\E (snd' x))

env_elem_aux_extend < case H1.
Subgoal 1:

IH : forall E, env_elem_aux E * -> env_elem_aux (x\E (snd' x))
============================
 env_elem_aux (x\snd' x)

Subgoal 2 is:
 env_elem_aux (x\snd' (R (snd' x)))

env_elem_aux_extend < search.
Subgoal 2:

Variables: 
  R : tm' -> tm'
IH : forall E, env_elem_aux E * -> env_elem_aux (x\E (snd' x))
H2 : env_elem_aux R *
============================
 env_elem_aux (x\snd' (R (snd' x)))

env_elem_aux_extend < apply IH to H2.
Subgoal 2:

Variables: 
  R : tm' -> tm'
IH : forall E, env_elem_aux E * -> env_elem_aux (x\E (snd' x))
H2 : env_elem_aux R *
H3 : env_elem_aux (x\R (snd' x))
============================
 env_elem_aux (x\snd' (R (snd' x)))

env_elem_aux_extend < search.
Proof completed.
Abella < Theorem env_elem_extend : 
forall E, env_elem E -> env_elem (x\E (snd' x)).


============================
 forall E, env_elem E -> env_elem (x\E (snd' x))

env_elem_extend < intros.

Variables: 
  E : tm' -> tm'
H1 : env_elem E
============================
 env_elem (x\E (snd' x))

env_elem_extend < case H1.

Variables: 
  R : tm' -> tm'
H2 : env_elem_aux R
============================
 env_elem (x\fst' (R (snd' x)))

env_elem_extend < apply env_elem_aux_extend to H2.

Variables: 
  R : tm' -> tm'
H2 : env_elem_aux R
H3 : env_elem_aux (x\R (snd' x))
============================
 env_elem (x\fst' (R (snd' x)))

env_elem_extend < search.
Proof completed.
Abella < Theorem env_elem_aux_eval'_cong : 
forall E E1 E2 V V', env_elem_aux E -> {eval' E1 V} -> {eval' E2 V} ->
  {eval' (E E1) V'} -> {eval' (E E2) V'}.


============================
 forall E E1 E2 V V', env_elem_aux E -> {eval' E1 V} -> {eval' E2 V} ->
   {eval' (E E1) V'} -> {eval' (E E2) V'}

env_elem_aux_eval'_cong < induction on 1.

IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
       {eval' (E E1) V'} -> {eval' (E E2) V'}
============================
 forall E E1 E2 V V', env_elem_aux E @ -> {eval' E1 V} -> {eval' E2 V} ->
   {eval' (E E1) V'} -> {eval' (E E2) V'}

env_elem_aux_eval'_cong < intros.

Variables: 
  E1,E2,V,V' : tm'
  E : tm' -> tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
       {eval' (E E1) V'} -> {eval' (E E2) V'}
H1 : env_elem_aux E @
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (E E1) V'}
============================
 {eval' (E E2) V'}

env_elem_aux_eval'_cong < case H1.
Subgoal 1:

Variables: 
  E1,E2,V,V' : tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
       {eval' (E E1) V'} -> {eval' (E E2) V'}
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' E1 V'}
============================
 {eval' E2 V'}

Subgoal 2 is:
 {eval' (snd' (R E2)) V'}

env_elem_aux_eval'_cong < apply eval'_det to H2 H4.
Subgoal 1:

Variables: 
  E1,E2,V' : tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
       {eval' (E E1) V'} -> {eval' (E E2) V'}
H2 : {eval' E1 V'}
H3 : {eval' E2 V'}
H4 : {eval' E1 V'}
============================
 {eval' E2 V'}

Subgoal 2 is:
 {eval' (snd' (R E2)) V'}

env_elem_aux_eval'_cong < search.
Subgoal 2:

Variables: 
  E1,E2,V,V' : tm'
  R : tm' -> tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
       {eval' (E E1) V'} -> {eval' (E E2) V'}
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (snd' (R E1)) V'}
H5 : env_elem_aux R *
============================
 {eval' (snd' (R E2)) V'}

env_elem_aux_eval'_cong < apply eval'_snd_inv to H4.
Subgoal 2:

Variables: 
  E1,E2,V,V',V'1 : tm'
  R : tm' -> tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
       {eval' (E E1) V'} -> {eval' (E E2) V'}
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (snd' (R E1)) V'}
H5 : env_elem_aux R *
H6 : {eval' (R E1) (pair' V'1 V')}
============================
 {eval' (snd' (R E2)) V'}

env_elem_aux_eval'_cong < apply IH to H5 H2 H3 H6.
Subgoal 2:

Variables: 
  E1,E2,V,V',V'1 : tm'
  R : tm' -> tm'
IH : forall E E1 E2 V V', env_elem_aux E * -> {eval' E1 V} -> {eval' E2 V} ->
       {eval' (E E1) V'} -> {eval' (E E2) V'}
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (snd' (R E1)) V'}
H5 : env_elem_aux R *
H6 : {eval' (R E1) (pair' V'1 V')}
H7 : {eval' (R E2) (pair' V'1 V')}
============================
 {eval' (snd' (R E2)) V'}

env_elem_aux_eval'_cong < backchain eval'_snd_fwd.
Proof completed.
Abella < Theorem env_elem_eval'_cong : 
forall E E1 E2 V V', env_elem E -> {eval' E1 V} -> {eval' E2 V} ->
  {eval' (E E1) V'} -> {eval' (E E2) V'}.


============================
 forall E E1 E2 V V', env_elem E -> {eval' E1 V} -> {eval' E2 V} ->
   {eval' (E E1) V'} -> {eval' (E E2) V'}

env_elem_eval'_cong < intros.

Variables: 
  E1,E2,V,V' : tm'
  E : tm' -> tm'
H1 : env_elem E
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (E E1) V'}
============================
 {eval' (E E2) V'}

env_elem_eval'_cong < case H1.

Variables: 
  E1,E2,V,V' : tm'
  R : tm' -> tm'
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (fst' (R E1)) V'}
H5 : env_elem_aux R
============================
 {eval' (fst' (R E2)) V'}

env_elem_eval'_cong < apply eval'_fst_inv to H4.

Variables: 
  E1,E2,V,V',V'1 : tm'
  R : tm' -> tm'
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (fst' (R E1)) V'}
H5 : env_elem_aux R
H6 : {eval' (R E1) (pair' V' V'1)}
============================
 {eval' (fst' (R E2)) V'}

env_elem_eval'_cong < apply env_elem_aux_eval'_cong to H5 H2 H3 H6.

Variables: 
  E1,E2,V,V',V'1 : tm'
  R : tm' -> tm'
H2 : {eval' E1 V}
H3 : {eval' E2 V}
H4 : {eval' (fst' (R E1)) V'}
H5 : env_elem_aux R
H6 : {eval' (R E1) (pair' V' V'1)}
H7 : {eval' (R E2) (pair' V' V'1)}
============================
 {eval' (fst' (R E2)) V'}

env_elem_eval'_cong < backchain eval'_fst_fwd.
Proof completed.
Abella < Theorem mapvar_mem : 
forall FVs Map X E Env, nabla x, {mapvar FVs Map} ->
  {memb (map X E) (Map Env)} ->
  (exists E', E = E' Env /\ env_elem E' /\ {memb (map X (E' x)) (Map x)}).


============================
 forall FVs Map X E Env, nabla x, {mapvar FVs Map} ->
   {memb (map X E) (Map Env)} ->
   (exists E', E = E' Env /\ env_elem E' /\ {memb (map X (E' x)) (Map x)})

mapvar_mem < induction on 1.

IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
============================
 forall FVs Map X E Env, nabla x, {mapvar FVs Map}@ ->
   {memb (map X E) (Map Env)} ->
   (exists E', E = E' Env /\ env_elem E' /\ {memb (map X (E' x)) (Map x)})

mapvar_mem < intros.

Variables: 
  FVs : list tm
  X : tm
  E,Env : tm'
  Map : tm' -> (list (map tm tm'))
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H1 : {mapvar FVs Map}@
H2 : {memb (map X E) (Map Env)}
============================
 [n1 : tm']
 |> exists E', E = E' Env /\ env_elem E' /\ {memb (map X (E' n1)) (Map n1)}

mapvar_mem < case H1.
Subgoal 1:

Variables: 
  X : tm
  E,Env : tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H2 : {memb (map X E) nil}
============================
 [n1 : tm']
 |> exists E', E = E' Env /\ env_elem E' /\ {memb (map X (E' n1)) nil}

Subgoal 2 is:
 [n1 : tm']
 |> exists E', E = E' Env /\ env_elem E' /\
      {memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < case H2.
Subgoal 2:

Variables: 
  L : list tm
  X,X1 : tm
  E,Env : tm'
  Map1 : tm' -> (list (map tm tm'))
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H2 : {memb (map X E) (map X1 (fst' Env) :: Map1 (snd' Env))}
H3 : {mapvar L Map1}*
============================
 [n1 : tm']
 |> exists E', E = E' Env /\ env_elem E' /\
      {memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < case H2.
Subgoal 2.1:

Variables: 
  L : list tm
  X1 : tm
  Env : tm'
  Map1 : tm' -> (list (map tm tm'))
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
============================
 [n1 : tm']
 |> exists E', fst' Env = E' Env /\ env_elem E' /\
      {memb (map X1 (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}

Subgoal 2.2 is:
 [n1 : tm']
 |> exists E', E = E' Env /\ env_elem E' /\
      {memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < exists x\fst' x.
Subgoal 2.1:

Variables: 
  L : list tm
  X1 : tm
  Env : tm'
  Map1 : tm' -> (list (map tm tm'))
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
============================
 [n1 : tm']
 |> fst' Env = fst' Env /\ env_elem (x\fst' x) /\
      {memb (map X1 (fst' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}

Subgoal 2.2 is:
 [n1 : tm']
 |> exists E', E = E' Env /\ env_elem E' /\
      {memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < search.
Subgoal 2.2:

Variables: 
  L : list tm
  X,X1 : tm
  E,Env : tm'
  Map1 : tm' -> (list (map tm tm'))
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
============================
 [n1 : tm']
 |> exists E', E = E' Env /\ env_elem E' /\
      {memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < apply IH to H3 H4.
Subgoal 2.2:

Variables: 
  L : list tm
  X,X1 : tm
  E,Env : tm'
  Map1 : tm' -> (list (map tm tm'))
  E' : tm' -> tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : [n1 : tm']
     |> E = E' n1 (snd' Env)
H6 : [n1 : tm']
     |> env_elem (E' n1)
H7 : [n1 : tm']
     |> {memb (map X (E' n1 n1)) (Map1 n1)}
============================
 [n1 : tm']
 |> exists E', E = E' Env /\ env_elem E' /\
      {memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < apply env_elem_closed to H6.
Subgoal 2.2:

Variables: 
  L : list tm
  X,X1 : tm
  E,Env : tm'
  Map1 : tm' -> (list (map tm tm'))
  E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
     |> {memb (map X (E'1 n1)) (Map1 n1)}
============================
 [n1 : tm']
 |> exists E', E = E' Env /\ env_elem E' /\
      {memb (map X (E' n1)) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < exists x\E'1 (snd' x).
Subgoal 2.2:

Variables: 
  L : list tm
  X,X1 : tm
  E,Env : tm'
  Map1 : tm' -> (list (map tm tm'))
  E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
     |> {memb (map X (E'1 n1)) (Map1 n1)}
============================
 [n1 : tm']
 |> E = E'1 (snd' Env) /\ env_elem (x\E'1 (snd' x)) /\
      {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < split.
Subgoal 2.2.1:

Variables: 
  L : list tm
  X,X1 : tm
  E,Env : tm'
  Map1 : tm' -> (list (map tm tm'))
  E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
     |> {memb (map X (E'1 n1)) (Map1 n1)}
============================
 E = E'1 (snd' Env)

Subgoal 2.2.2 is:
 env_elem (x\E'1 (snd' x))

Subgoal 2.2.3 is:
 [n1 : tm']
 |> {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < search.
Subgoal 2.2.2:

Variables: 
  L : list tm
  X,X1 : tm
  E,Env : tm'
  Map1 : tm' -> (list (map tm tm'))
  E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
     |> {memb (map X (E'1 n1)) (Map1 n1)}
============================
 env_elem (x\E'1 (snd' x))

Subgoal 2.2.3 is:
 [n1 : tm']
 |> {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < apply env_elem_extend to H6.
Subgoal 2.2.2:

Variables: 
  L : list tm
  X,X1 : tm
  E,Env : tm'
  Map1 : tm' -> (list (map tm tm'))
  E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
     |> {memb (map X (E'1 n1)) (Map1 n1)}
H8 : env_elem (x\E'1 (snd' x))
============================
 env_elem (x\E'1 (snd' x))

Subgoal 2.2.3 is:
 [n1 : tm']
 |> {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < search.
Subgoal 2.2.3:

Variables: 
  L : list tm
  X,X1 : tm
  E,Env : tm'
  Map1 : tm' -> (list (map tm tm'))
  E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
     |> {memb (map X (E'1 n1)) (Map1 n1)}
============================
 [n1 : tm']
 |> {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem <  inst H7 with n1 = snd' n1.
Subgoal 2.2.3:

Variables: 
  L : list tm
  X,X1 : tm
  E,Env : tm'
  Map1 : tm' -> (list (map tm tm'))
  E'1 : tm' -> tm'
IH : forall FVs Map X E Env, nabla x, {mapvar FVs Map}* ->
       {memb (map X E) (Map Env)} ->
       (exists E', E = E' Env /\ env_elem E' /\
            {memb (map X (E' x)) (Map x)})
H3 : {mapvar L Map1}*
H4 : {memb (map X E) (Map1 (snd' Env))}
H5 : E = E'1 (snd' Env)
H6 : env_elem E'1
H7 : [n1 : tm']
     |> {memb (map X (E'1 n1)) (Map1 n1)}
H8 : [n1 : tm']
     |> {memb (map X (E'1 (snd' n1))) (Map1 (snd' n1))}
============================
 [n1 : tm']
 |> {memb (map X (E'1 (snd' n1))) (map X1 (fst' n1) :: Map1 (snd' n1))}

mapvar_mem < search.
Proof completed.
Abella < Theorem mapvar_sync : 
forall Vs Map X M E, {mapvar Vs Map} -> {memb (map X (M E)) (Map E)} ->
  {memb X Vs}.


============================
 forall Vs Map X M E, {mapvar Vs Map} -> {memb (map X (M E)) (Map E)} ->
   {memb X Vs}

mapvar_sync < induction on 1.

IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
       {memb X Vs}
============================
 forall Vs Map X M E, {mapvar Vs Map}@ -> {memb (map X (M E)) (Map E)} ->
   {memb X Vs}

mapvar_sync < intros.

Variables: 
  Vs : list tm
  X : tm
  E : tm'
  Map : tm' -> (list (map tm tm'))
  M : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
       {memb X Vs}
H1 : {mapvar Vs Map}@
H2 : {memb (map X (M E)) (Map E)}
============================
 {memb X Vs}

mapvar_sync < case H1.
Subgoal 1:

Variables: 
  X : tm
  E : tm'
  M : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
       {memb X Vs}
H2 : {memb (map X (M E)) nil}
============================
 {memb X nil}

Subgoal 2 is:
 {memb X (X1 :: L)}

mapvar_sync < case H2.
Subgoal 2:

Variables: 
  L : list tm
  X,X1 : tm
  E : tm'
  Map1 : tm' -> (list (map tm tm'))
  M : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
       {memb X Vs}
H2 : {memb (map X (M E)) (map X1 (fst' E) :: Map1 (snd' E))}
H3 : {mapvar L Map1}*
============================
 {memb X (X1 :: L)}

mapvar_sync < case H2.
Subgoal 2.1:

Variables: 
  L : list tm
  X1 : tm
  E : tm'
  Map1 : tm' -> (list (map tm tm'))
  M : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
       {memb X Vs}
H3 : {mapvar L Map1}*
H4 : M E = fst' E
============================
 {memb X1 (X1 :: L)}

Subgoal 2.2 is:
 {memb X (X1 :: L)}

mapvar_sync < search.
Subgoal 2.2:

Variables: 
  L : list tm
  X,X1 : tm
  E : tm'
  Map1 : tm' -> (list (map tm tm'))
  M : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
       {memb X Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map X (M E)) (Map1 (snd' E))}
============================
 {memb X (X1 :: L)}

mapvar_sync < apply mapvar_mem to H3 H4.
Subgoal 2.2:

Variables: 
  L : list tm
  X,X1 : tm
  E : tm'
  Map1 : tm' -> (list (map tm tm'))
  M : tm' -> tm'
  E' : tm' -> tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
       {memb X Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map X (M E)) (Map1 (snd' E))}
H5 : [n1 : tm']
     |> M E = E' n1 (snd' E)
H6 : [n1 : tm']
     |> env_elem (E' n1)
H7 : [n1 : tm']
     |> {memb (map X (E' n1 n1)) (Map1 n1)}
============================
 {memb X (X1 :: L)}

mapvar_sync < apply env_elem_closed to H6.
Subgoal 2.2:

Variables: 
  L : list tm
  X,X1 : tm
  E : tm'
  Map1 : tm' -> (list (map tm tm'))
  M,E'1 : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
       {memb X Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map X (M E)) (Map1 (snd' E))}
H5 : M E = E'1 (snd' E)
H6 : env_elem E'1
H7 : [n1 : tm']
     |> {memb (map X (E'1 n1)) (Map1 n1)}
============================
 {memb X (X1 :: L)}

mapvar_sync < apply IH to H3 H7 with M = E'1, Map = Map1.
Subgoal 2.2:

Variables: 
  L : list tm
  X,X1 : tm
  E : tm'
  Map1 : tm' -> (list (map tm tm'))
  M,E'1 : tm' -> tm'
IH : forall Vs Map X M E, {mapvar Vs Map}* -> {memb (map X (M E)) (Map E)} ->
       {memb X Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map X (M E)) (Map1 (snd' E))}
H5 : M E = E'1 (snd' E)
H6 : env_elem E'1
H7 : [n1 : tm']
     |> {memb (map X (E'1 n1)) (Map1 n1)}
H8 : {memb X L}
============================
 {memb X (X1 :: L)}

mapvar_sync < search.
Proof completed.
Abella < Theorem eq_rewrite_eval' : 
forall A B C V, nabla x, A x = B x -> {eval' (B C) V} -> {eval' (A C) V}.


============================
 forall A B C V, nabla x, A x = B x -> {eval' (B C) V} -> {eval' (A C) V}

eq_rewrite_eval' < intros.

Variables: 
  C,V : tm'
  A,B : tm' -> tm'
H1 : [n1 : tm']
     |> A n1 = B n1
H2 : {eval' (B C) V}
============================
 {eval' (A C) V}

eq_rewrite_eval' < case H1.

Variables: 
  C,V : tm'
  B : tm' -> tm'
H2 : {eval' (B C) V}
============================
 {eval' (B C) V}

eq_rewrite_eval' < search.
Proof completed.
Abella < Theorem fvar_sem_pres : 
forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L -> subst ML ->
  subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs -> {mapvar Vs Map} ->
  member (of X T) L -> {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
  (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V').


============================
 forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
   subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
   {mapvar Vs Map} -> member (of X T) L -> {memb (map X (M' e)) (Map e)} ->
   app_subst ML X V -> (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')

fvar_sem_pres < induction on 6.

IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
============================
 forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
   subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
   {mapvar Vs Map}@ -> member (of X T) L -> {memb (map X (M' e)) (Map e)} ->
   app_subst ML X V -> (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')

fvar_sem_pres < intros.

Variables: 
  ML : list (map tm tm)
  L : list o
  Vs : list tm
  K : nat
  X,V : tm
  VE : tm'
  T : ty
  Map : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv_cc L K ML VE
H5 : vars_of_ctx L Vs
H6 : {mapvar Vs Map}@
H7 : member (of X T) L
H8 : [n1 : tm']
     |> {memb (map X (M' n1)) (Map n1)}
H9 : app_subst ML X V
============================
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < case H8.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  L : list o
  Vs : list tm
  K : nat
  X,V : tm
  VE : tm'
  T : ty
  L1 : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv_cc L K ML VE
H5 : vars_of_ctx L Vs
H6 : {mapvar Vs (z1\map X (M' z1) :: L1 z1)}@
H7 : member (of X T) L
H9 : app_subst ML X V
============================
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < case H6.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  L : list o
  L2 : list tm
  K : nat
  X,V : tm
  VE : tm'
  T : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv_cc L K ML VE
H5 : vars_of_ctx L (X :: L2)
H7 : member (of X T) L
H9 : app_subst ML X V
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
============================
 exists V', {eval' (fst' VE) V'} /\ equiv_cc T K V V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < case H5.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V : tm
  VE : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H4 : subst_env_equiv_cc (of X T1 :: L3) K ML VE
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
============================
 exists V', {eval' (fst' VE) V'} /\ equiv_cc T K V V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < case H4.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
 exists V'1, {eval' (fst' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < apply subst_var_eq to _ H14 H9.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
 exists V'1, {eval' (fst' (pair' V' VE1)) V'1} /\ equiv_cc T K V1 V'1

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < exists V'.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
 {eval' (fst' (pair' V' VE1)) V'} /\ equiv_cc T K V1 V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < split.
Subgoal 1.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
 {eval' (fst' (pair' V' VE1)) V'}

Subgoal 1.2 is:
 equiv_cc T K V1 V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < apply equiv_cc_val' to _ _ H15.
Subgoal 1.1.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
 {is_sty T1}

Subgoal 1.1 is:
 {eval' (fst' (pair' V' VE1)) V'}

Subgoal 1.2 is:
 equiv_cc T K V1 V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < case H2.
Subgoal 1.1.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
H16 : ctx L3
H17 : name X
H18 : {is_sty T1}
H19 : forall T', member (of X T') L3 -> T1 = T'
============================
 {is_sty T1}

Subgoal 1.1 is:
 {eval' (fst' (pair' V' VE1)) V'}

Subgoal 1.2 is:
 equiv_cc T K V1 V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < search.
Subgoal 1.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
H16 : {val' V'}
============================
 {eval' (fst' (pair' V' VE1)) V'}

Subgoal 1.2 is:
 equiv_cc T K V1 V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < apply subst_env_equiv_cc_val' to _ _ H13.
Subgoal 1.1.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
H16 : {val' V'}
============================
 ctx L3

Subgoal 1.1 is:
 {eval' (fst' (pair' V' VE1)) V'}

Subgoal 1.2 is:
 equiv_cc T K V1 V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < case H2.
Subgoal 1.1.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
H16 : {val' V'}
H17 : ctx L3
H18 : name X
H19 : {is_sty T1}
H20 : forall T', member (of X T') L3 -> T1 = T'
============================
 ctx L3

Subgoal 1.1 is:
 {eval' (fst' (pair' V' VE1)) V'}

Subgoal 1.2 is:
 equiv_cc T K V1 V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < search.
Subgoal 1.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
H16 : {val' V'}
H17 : {val' VE1}
============================
 {eval' (fst' (pair' V' VE1)) V'}

Subgoal 1.2 is:
 equiv_cc T K V1 V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < search.
Subgoal 1.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
 equiv_cc T K V1 V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < apply ctx_mem_sync to H2 H7 _ with T' = T1.
Subgoal 1.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V1 : tm
  VE1,V' : tm'
  T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X T1 :: L3)
H3 : subst ML
H7 : member (of X T1) (of X T1 :: L3)
H9 : app_subst ML X V1
H10 : e\Map1 (snd' e) = e\L1 e
H11 : {mapvar L2 Map1}*
H12 : vars_of_ctx L3 L2
H13 : subst_env_equiv_cc L3 K ML VE1
H14 : member (map X V1) ML
H15 : equiv_cc T1 K V1 V'
============================
 equiv_cc T1 K V1 V'

Subgoal 2 is:
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < search.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L : list o
  Vs : list tm
  K : nat
  X,V : tm
  VE : tm'
  T : ty
  L1 : tm' -> (list (map tm tm'))
  X1 : tm' -> (map tm tm')
  M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv_cc L K ML VE
H5 : vars_of_ctx L Vs
H6 : {mapvar Vs (z1\X1 z1 :: L1 z1)}@
H7 : member (of X T) L
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
============================
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < case H6.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L : list o
  L2 : list tm
  K : nat
  X,V,X2 : tm
  VE : tm'
  T : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst_env_equiv_cc L K ML VE
H5 : vars_of_ctx L (X2 :: L2)
H7 : member (of X T) L
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
============================
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < case H5.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2 : tm
  VE : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H4 : subst_env_equiv_cc (of X2 T1 :: L3) K ML VE
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
============================
 exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V'

fvar_sem_pres < case H4.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
============================
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply eq_memb_rewrite_tm' to H11 H10.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
============================
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply mapvar_mem to H12 H17.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
  E' : tm' -> tm' -> tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm', n2 : tm']
      |> M' n1 = E' n1 n2 (snd' n1)
H19 : [n1 : tm', n2 : tm']
      |> env_elem (E' n1 n2)
H20 : [n1 : tm', n2 : tm']
      |> {memb (map X (E' n1 n2 n2)) (Map1 n2)}
============================
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply env_elem_closed to H19.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
  E'1 : tm' -> tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm', n2 : tm']
      |> M' n1 = E'1 n2 (snd' n1)
H19 : [n2 : tm']
      |> env_elem (E'1 n2)
H20 : [n2 : tm']
      |> {memb (map X (E'1 n2 n2)) (Map1 n2)}
============================
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply env_elem_closed to H19.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
============================
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply IH to _ _ _ H14 H13 H12 _ H20 H9 with T = T.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
============================
 member (of X T) L3

Subgoal 2.2 is:
 ctx L3

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply mapvar_sync to H12 H20 with M = E'2, Map = Map1.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {memb X L2}
============================
 member (of X T) L3

Subgoal 2.2 is:
 ctx L3

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply lst_mem_to_ctx_mem to H13 H21.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1,T2 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {memb X L2}
H22 : member (of X T2) L3
============================
 member (of X T) L3

Subgoal 2.2 is:
 ctx L3

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < case H7 (keep).
Subgoal 2.1.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  V,X2,V1 : tm
  VE1,V' : tm'
  T1,T2 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X2 T1) (of X2 T1 :: L3)
H9 : app_subst ML X2 V
H10 : [n1 : tm']
      |> {memb (map X2 (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X2 (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X2 (E'2 n2)) (Map1 n2)}
H21 : {memb X2 L2}
H22 : member (of X2 T2) L3
============================
 member (of X2 T1) L3

Subgoal 2.1.2 is:
 member (of X T) L3

Subgoal 2.2 is:
 ctx L3

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply ctx_mem_sync to H2 H7 _ with T' = T2.
Subgoal 2.1.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  V,X2,V1 : tm
  VE1,V' : tm'
  T2 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T2 :: L3)
H3 : subst ML
H7 : member (of X2 T2) (of X2 T2 :: L3)
H9 : app_subst ML X2 V
H10 : [n1 : tm']
      |> {memb (map X2 (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T2 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X2 (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X2 (E'2 n2)) (Map1 n2)}
H21 : {memb X2 L2}
H22 : member (of X2 T2) L3
============================
 member (of X2 T2) L3

Subgoal 2.1.2 is:
 member (of X T) L3

Subgoal 2.2 is:
 ctx L3

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < search.
Subgoal 2.1.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1,T2 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {memb X L2}
H22 : member (of X T2) L3
H23 : member (of X T) L3
============================
 member (of X T) L3

Subgoal 2.2 is:
 ctx L3

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < search.
Subgoal 2.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
============================
 ctx L3

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < case H2.
Subgoal 2.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V' : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : ctx L3
H22 : name X2
H23 : {is_sty T1}
H24 : forall T', member (of X2 T') L3 -> T1 = T'
============================
 ctx L3

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < search.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
============================
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < assert {eval' (E'2 (snd' (pair' V' VE1))) V'1}.
Subgoal 2.3:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
============================
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < assert {eval' (snd' (pair' V' VE1)) VE1}.
Subgoal 2.3.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
============================
 {eval' (snd' (pair' V' VE1)) VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply equiv_cc_val' to _ _ H16.
Subgoal 2.3.1.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
============================
 {is_sty T1}

Subgoal 2.3.1 is:
 {eval' (snd' (pair' V' VE1)) VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < case H2.
Subgoal 2.3.1.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : ctx L3
H24 : name X2
H25 : {is_sty T1}
H26 : forall T', member (of X2 T') L3 -> T1 = T'
============================
 {is_sty T1}

Subgoal 2.3.1 is:
 {eval' (snd' (pair' V' VE1)) VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < search.
Subgoal 2.3.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {val' V'}
============================
 {eval' (snd' (pair' V' VE1)) VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply subst_env_equiv_cc_val' to _ _ H14.
Subgoal 2.3.1.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {val' V'}
============================
 ctx L3

Subgoal 2.3.1 is:
 {eval' (snd' (pair' V' VE1)) VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < case H2.
Subgoal 2.3.1.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {val' V'}
H24 : ctx L3
H25 : name X2
H26 : {is_sty T1}
H27 : forall T', member (of X2 T') L3 -> T1 = T'
============================
 ctx L3

Subgoal 2.3.1 is:
 {eval' (snd' (pair' V' VE1)) VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < search.
Subgoal 2.3.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {val' V'}
H24 : {val' VE1}
============================
 {eval' (snd' (pair' V' VE1)) VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < search.
Subgoal 2.3:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
============================
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < assert {eval' VE1 VE1}.
Subgoal 2.3.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
============================
 {eval' VE1 VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply subst_env_equiv_cc_val' to _ _ H14.
Subgoal 2.3.2.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
============================
 ctx L3

Subgoal 2.3.2 is:
 {eval' VE1 VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < case H2.
Subgoal 2.3.2.1:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
H24 : ctx L3
H25 : name X2
H26 : {is_sty T1}
H27 : forall T', member (of X2 T') L3 -> T1 = T'
============================
 ctx L3

Subgoal 2.3.2 is:
 {eval' VE1 VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < search.
Subgoal 2.3.2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
H24 : {val' VE1}
============================
 {eval' VE1 VE1}

Subgoal 2.3 is:
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < backchain eval'_refl.
Subgoal 2.3:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
H24 : {eval' VE1 VE1}
============================
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply env_elem_eval'_cong to H19 H24 H23 H21 with E = E'2.
Subgoal 2.3:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (snd' (pair' V' VE1)) VE1}
H24 : {eval' VE1 VE1}
H25 : {eval' (E'2 (snd' (pair' V' VE1))) V'1}
============================
 {eval' (E'2 (snd' (pair' V' VE1))) V'1}

Subgoal 2 is:
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < search.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (E'2 (snd' (pair' V' VE1))) V'1}
============================
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < apply eq_rewrite_eval' to H18 H23.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  L3 : list o
  L2 : list tm
  K : nat
  X,V,X2,V1 : tm
  VE1,V',V'1 : tm'
  T,T1 : ty
  L1,Map1 : tm' -> (list (map tm tm'))
  M',E'2 : tm' -> tm'
IH : forall L Vs Map ML K VE X T M' V, nabla e, {is_nat K} -> ctx L ->
       subst ML -> subst_env_equiv_cc L K ML VE -> vars_of_ctx L Vs ->
       {mapvar Vs Map}* -> member (of X T) L ->
       {memb (map X (M' e)) (Map e)} -> app_subst ML X V ->
       (exists V', {eval' (M' VE) V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X2 T1 :: L3)
H3 : subst ML
H7 : member (of X T) (of X2 T1 :: L3)
H9 : app_subst ML X V
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (L1 n1)}
H11 : e\Map1 (snd' e) = e\L1 e
H12 : {mapvar L2 Map1}*
H13 : vars_of_ctx L3 L2
H14 : subst_env_equiv_cc L3 K ML VE1
H15 : member (map X2 V1) ML
H16 : equiv_cc T1 K V1 V'
H17 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 (snd' n1))}
H18 : [n1 : tm']
      |> M' n1 = E'2 (snd' n1)
H19 : env_elem E'2
H20 : [n2 : tm']
      |> {memb (map X (E'2 n2)) (Map1 n2)}
H21 : {eval' (E'2 VE1) V'1}
H22 : equiv_cc T K V V'1
H23 : {eval' (E'2 (snd' (pair' V' VE1))) V'1}
H24 : {eval' (M' (pair' V' VE1)) V'1}
============================
 exists V'1, {eval' (M' (pair' V' VE1)) V'1} /\ equiv_cc T K V V'1

fvar_sem_pres < search.
Proof completed.
Abella < Define to_mapping : (list tm) -> (list tm') -> (list (map tm tm')) -> prop by 
to_mapping Vs (E :: nil) (Map E) := {mapvar Vs Map};
to_mapping (X :: Vs) (X' :: Vs') (map X X' :: Map) := to_mapping Vs Vs' Map.

Abella < Theorem eq_map_list_inv_tm' : 
forall A B, nabla x, A x = B x -> A = B.


============================
 forall A B, nabla x, A x = B x -> A = B

eq_map_list_inv_tm' < intros.

Variables: 
  A,B : tm' -> tm' -> (list (map tm tm'))
H1 : [n1 : tm']
     |> A n1 = B n1
============================
 A = B

eq_map_list_inv_tm' < case H1.

Variables: 
  B : tm' -> tm' -> (list (map tm tm'))
============================
 z1\B z1 = B

eq_map_list_inv_tm' < search.
Proof completed.
Abella < Theorem eq_map_list_inv_tm : 
forall A B, nabla x, A x = B x -> A = B.


============================
 forall A B, nabla x, A x = B x -> A = B

eq_map_list_inv_tm < intros.

Variables: 
  A,B : tm -> tm' -> (list (map tm tm'))
H1 : [n1 : tm]
     |> A n1 = B n1
============================
 A = B

eq_map_list_inv_tm < case H1.

Variables: 
  B : tm -> tm' -> (list (map tm tm'))
============================
 z1\B z1 = B

eq_map_list_inv_tm < search.
Proof completed.
Abella < Theorem eq_map_list_rewrite_tm' : 
forall A B X, A = B -> z1\z2\map X (fst' z2) :: A z1 z2 =
y\z2\map X (fst' z2) :: B y z2.


============================
 forall A B X, A = B -> z1\z2\map X (fst' z2) :: A z1 z2 =
 y\z2\map X (fst' z2) :: B y z2

eq_map_list_rewrite_tm' < intros.

Variables: 
  X : tm
  A,B : tm' -> tm' -> (list (map tm tm'))
H1 : A = B
============================
 z1\z2\map X (fst' z2) :: A z1 z2 = y\z2\map X (fst' z2) :: B y z2

eq_map_list_rewrite_tm' < case H1.

Variables: 
  X : tm
  B : tm' -> tm' -> (list (map tm tm'))
============================
 z1\z2\map X (fst' z2) :: B z1 z2 = y\z2\map X (fst' z2) :: B y z2

eq_map_list_rewrite_tm' < search.
Proof completed.
Abella < Theorem eq_map_list_rewrite_tm : 
forall A B X, A = B -> z1\z2\map X (fst' z2) :: A z1 z2 =
y\z2\map X (fst' z2) :: B y z2.


============================
 forall A B X, A = B -> z1\z2\map X (fst' z2) :: A z1 z2 =
 y\z2\map X (fst' z2) :: B y z2

eq_map_list_rewrite_tm < intros.

Variables: 
  X : tm
  A,B : tm -> tm' -> (list (map tm tm'))
H1 : A = B
============================
 z1\z2\map X (fst' z2) :: A z1 z2 = y\z2\map X (fst' z2) :: B y z2

eq_map_list_rewrite_tm < case H1.

Variables: 
  X : tm
  B : tm -> tm' -> (list (map tm tm'))
============================
 z1\z2\map X (fst' z2) :: B z1 z2 = y\z2\map X (fst' z2) :: B y z2

eq_map_list_rewrite_tm < search.
Proof completed.
Abella < Theorem mapvar_prune_tm : 
forall FVs ML, nabla x, {mapvar FVs (ML x)} -> (exists ML', ML = y\ML').


============================
 forall FVs ML, nabla x, {mapvar FVs (ML x)} -> (exists ML', ML = y\ML')

mapvar_prune_tm < induction on 1.

IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
============================
 forall FVs ML, nabla x, {mapvar FVs (ML x)}@ -> (exists ML', ML = y\ML')

mapvar_prune_tm < intros.

Variables: 
  FVs : list tm
  ML : tm -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H1 : [n1 : tm]
     |> {mapvar FVs (ML n1)}@
============================
 exists ML', ML = y\ML'

mapvar_prune_tm < case H1.
Subgoal 1:

IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
============================
 exists ML', z1\z2\nil = y\ML'

Subgoal 2 is:
 exists ML', ML = y\ML'

mapvar_prune_tm < search.
Subgoal 2:

Variables: 
  FVs2 : list tm
  FVs1 : tm
  ML,Map : tm -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : [n1 : tm]
     |> e\map FVs1 (fst' e) :: Map n1 (snd' e) = e\ML n1 e
H3 : [n1 : tm]
     |> {mapvar FVs2 (Map n1)}*
============================
 exists ML', ML = y\ML'

mapvar_prune_tm < apply IH to H3.
Subgoal 2:

Variables: 
  FVs2 : list tm
  FVs1 : tm
  ML : tm -> tm' -> (list (map tm tm'))
  ML' : tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : [n1 : tm]
     |> e\map FVs1 (fst' e) :: ML' (snd' e) = e\ML n1 e
H3 : {mapvar FVs2 ML'}*
============================
 exists ML', ML = y\ML'

mapvar_prune_tm < case H2.
Subgoal 2:

Variables: 
  FVs2 : list tm
  FVs1 : tm
  ML2 : tm -> tm' -> (list (map tm tm'))
  ML' : tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar FVs2 ML'}*
H4 : [n1 : tm]
     |> e\ML2 n1 e = e\ML' (snd' e)
============================
 exists ML', z1\z2\map FVs1 (fst' z2) :: ML2 z1 z2 = y\ML'

mapvar_prune_tm < exists z2\map FVs1 (fst' z2) :: ML' (snd' z2).
Subgoal 2:

Variables: 
  FVs2 : list tm
  FVs1 : tm
  ML2 : tm -> tm' -> (list (map tm tm'))
  ML' : tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar FVs2 ML'}*
H4 : [n1 : tm]
     |> e\ML2 n1 e = e\ML' (snd' e)
============================
 z1\z2\map FVs1 (fst' z2) :: ML2 z1 z2 =
 y\z2\map FVs1 (fst' z2) :: ML' (snd' z2)

mapvar_prune_tm < apply eq_map_list_inv_tm to H4.
Subgoal 2:

Variables: 
  FVs2 : list tm
  FVs1 : tm
  ML2 : tm -> tm' -> (list (map tm tm'))
  ML' : tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar FVs2 ML'}*
H4 : [n1 : tm]
     |> e\ML2 n1 e = e\ML' (snd' e)
H5 : z2\z3\ML2 z2 z3 = z2\z3\ML' (snd' z3)
============================
 z1\z2\map FVs1 (fst' z2) :: ML2 z1 z2 =
 y\z2\map FVs1 (fst' z2) :: ML' (snd' z2)

mapvar_prune_tm < backchain eq_map_list_rewrite_tm.
Proof completed.
Abella < Theorem mapvar_prune_tm' : 
forall FVs ML, nabla x, {mapvar FVs (ML x)} -> (exists ML', ML = y\ML').


============================
 forall FVs ML, nabla x, {mapvar FVs (ML x)} -> (exists ML', ML = y\ML')

mapvar_prune_tm' < induction on 1.

IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
============================
 forall FVs ML, nabla x, {mapvar FVs (ML x)}@ -> (exists ML', ML = y\ML')

mapvar_prune_tm' < intros.

Variables: 
  FVs : list tm
  ML : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H1 : [n1 : tm']
     |> {mapvar FVs (ML n1)}@
============================
 exists ML', ML = y\ML'

mapvar_prune_tm' < case H1.
Subgoal 1:

IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
============================
 exists ML', z1\z2\nil = y\ML'

Subgoal 2 is:
 exists ML', ML = y\ML'

mapvar_prune_tm' < search.
Subgoal 2:

Variables: 
  L : list tm
  X : tm
  ML,Map : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : [n1 : tm']
     |> e\map X (fst' e) :: Map n1 (snd' e) = e\ML n1 e
H3 : [n1 : tm']
     |> {mapvar L (Map n1)}*
============================
 exists ML', ML = y\ML'

mapvar_prune_tm' < apply IH to H3.
Subgoal 2:

Variables: 
  L : list tm
  X : tm
  ML' : tm' -> (list (map tm tm'))
  ML : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H2 : [n1 : tm']
     |> e\map X (fst' e) :: ML' (snd' e) = e\ML n1 e
H3 : {mapvar L ML'}*
============================
 exists ML', ML = y\ML'

mapvar_prune_tm' < case H2.
Subgoal 2:

Variables: 
  L : list tm
  X : tm
  ML' : tm' -> (list (map tm tm'))
  ML2 : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar L ML'}*
H4 : [n1 : tm']
     |> e\ML2 n1 e = e\ML' (snd' e)
============================
 exists ML', z1\z2\map X (fst' z2) :: ML2 z1 z2 = y\ML'

mapvar_prune_tm' < exists z2\map X (fst' z2) :: ML' (snd' z2).
Subgoal 2:

Variables: 
  L : list tm
  X : tm
  ML' : tm' -> (list (map tm tm'))
  ML2 : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar L ML'}*
H4 : [n1 : tm']
     |> e\ML2 n1 e = e\ML' (snd' e)
============================
 z1\z2\map X (fst' z2) :: ML2 z1 z2 = y\z2\map X (fst' z2) :: ML' (snd' z2)

mapvar_prune_tm' < apply eq_map_list_inv_tm' to H4.
Subgoal 2:

Variables: 
  L : list tm
  X : tm
  ML' : tm' -> (list (map tm tm'))
  ML2 : tm' -> tm' -> (list (map tm tm'))
IH : forall FVs ML, nabla x, {mapvar FVs (ML x)}* -> (exists ML', ML = y\ML')
H3 : {mapvar L ML'}*
H4 : [n1 : tm']
     |> e\ML2 n1 e = e\ML' (snd' e)
H5 : z2\z3\ML2 z2 z3 = z2\z3\ML' (snd' z3)
============================
 z1\z2\map X (fst' z2) :: ML2 z1 z2 = y\z2\map X (fst' z2) :: ML' (snd' z2)

mapvar_prune_tm' < backchain eq_map_list_rewrite_tm'.
Proof completed.
Abella < Theorem vars_of_ctx_prune_tm : 
forall L Vs, nabla x, vars_of_ctx L (Vs x) -> (exists Vs', Vs = y\Vs').


============================
 forall L Vs, nabla x, vars_of_ctx L (Vs x) -> (exists Vs', Vs = y\Vs')

vars_of_ctx_prune_tm < induction on 1.

IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
============================
 forall L Vs, nabla x, vars_of_ctx L (Vs x) @ -> (exists Vs', Vs = y\Vs')

vars_of_ctx_prune_tm < intros.

Variables: 
  L : list o
  Vs : tm -> (list tm)
IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
H1 : [n1 : tm]
     |> vars_of_ctx L (Vs n1) @
============================
 exists Vs', Vs = y\Vs'

vars_of_ctx_prune_tm < case H1.
Subgoal 1:

IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
============================
 exists Vs', z1\nil = y\Vs'

Subgoal 2 is:
 exists Vs', z1\L2 :: Vs1 z1 = y\Vs'

vars_of_ctx_prune_tm < search.
Subgoal 2:

Variables: 
  L3 : list o
  L2 : tm
  T : ty
  Vs1 : tm -> (list tm)
IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
H2 : [n1 : tm]
     |> vars_of_ctx L3 (Vs1 n1) *
============================
 exists Vs', z1\L2 :: Vs1 z1 = y\Vs'

vars_of_ctx_prune_tm < apply IH to H2.
Subgoal 2:

Variables: 
  L3 : list o
  Vs' : list tm
  L2 : tm
  T : ty
IH : forall L Vs, nabla x, vars_of_ctx L (Vs x) * -> (exists Vs', Vs = y\Vs')
H2 : vars_of_ctx L3 Vs' *
============================
 exists Vs'1, z1\L2 :: Vs' = y\Vs'1

vars_of_ctx_prune_tm < search.
Proof completed.
Abella < Theorem vars_of_subst'_prune_tm' : 
forall ML Vs, nabla x, vars_of_subst' ML (Vs x) -> (exists Vs', Vs = y\Vs').


============================
 forall ML Vs, nabla x, vars_of_subst' ML (Vs x) -> (exists Vs', Vs = y\Vs')

vars_of_subst'_prune_tm' < induction on 1.

IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
       (exists Vs', Vs = y\Vs')
============================
 forall ML Vs, nabla x, vars_of_subst' ML (Vs x) @ ->
   (exists Vs', Vs = y\Vs')

vars_of_subst'_prune_tm' < intros.

Variables: 
  ML : list (map tm' tm')
  Vs : tm' -> (list tm')
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
       (exists Vs', Vs = y\Vs')
H1 : [n1 : tm']
     |> vars_of_subst' ML (Vs n1) @
============================
 exists Vs', Vs = y\Vs'

vars_of_subst'_prune_tm' < case H1.
Subgoal 1:

IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
       (exists Vs', Vs = y\Vs')
============================
 exists Vs', z1\nil = y\Vs'

Subgoal 2 is:
 [n2 : tm']
 |> exists Vs', z2\n2 :: L z2 = y\Vs'

vars_of_subst'_prune_tm' < search.
Subgoal 2:

Variables: 
  ML3 : list (map tm' tm')
  ML2 : tm'
  L : tm' -> (list tm')
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
       (exists Vs', Vs = y\Vs')
H2 : [n1 : tm']
     |> vars_of_subst' ML3 (L n1) *
============================
 [n2 : tm']
 |> exists Vs', z2\n2 :: L z2 = y\Vs'

vars_of_subst'_prune_tm' < apply IH to H2.
Subgoal 2:

Variables: 
  ML3 : list (map tm' tm')
  Vs' : list tm'
  ML2 : tm'
IH : forall ML Vs, nabla x, vars_of_subst' ML (Vs x) * ->
       (exists Vs', Vs = y\Vs')
H2 : vars_of_subst' ML3 Vs' *
============================
 [n2 : tm']
 |> exists Vs'1, z2\n2 :: Vs' = y\Vs'1

vars_of_subst'_prune_tm' < search.
Proof completed.
Abella < Theorem to_mapping_prune_tm : 
forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) ->
  (exists Map', Map = y\Map').


============================
 forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) ->
   (exists Map', Map = y\Map')

to_mapping_prune_tm < induction on 1.

IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
============================
 forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) @ ->
   (exists Map', Map = y\Map')

to_mapping_prune_tm < intros.

Variables: 
  Vs : list tm
  Vs' : list tm'
  Map : tm -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
H1 : [n1 : tm]
     |> to_mapping Vs Vs' (Map n1) @
============================
 exists Map', Map = y\Map'

to_mapping_prune_tm < case H1.
Subgoal 1:

Variables: 
  Vs : list tm
  E : tm'
  Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
H2 : [n1 : tm]
     |> {mapvar Vs (Map1 n1)}
============================
 exists Map', z1\Map1 z1 E = y\Map'

Subgoal 2 is:
 exists Map', z1\map Vs2 X' :: Map1 z1 = y\Map'

to_mapping_prune_tm < apply mapvar_prune_tm to H2.
Subgoal 1:

Variables: 
  Vs : list tm
  E : tm'
  ML' : tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
H2 : {mapvar Vs ML'}
============================
 exists Map', z1\ML' E = y\Map'

Subgoal 2 is:
 exists Map', z1\map Vs2 X' :: Map1 z1 = y\Map'

to_mapping_prune_tm < search.
Subgoal 2:

Variables: 
  Vs3 : list tm
  Vs'1 : list tm'
  Vs2 : tm
  X' : tm'
  Map1 : tm -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
H2 : [n1 : tm]
     |> to_mapping Vs3 Vs'1 (Map1 n1) *
============================
 exists Map', z1\map Vs2 X' :: Map1 z1 = y\Map'

to_mapping_prune_tm < apply IH to H2.
Subgoal 2:

Variables: 
  Map' : list (map tm tm')
  Vs3 : list tm
  Vs'1 : list tm'
  Vs2 : tm
  X' : tm'
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
H2 : to_mapping Vs3 Vs'1 Map' *
============================
 exists Map'1, z1\map Vs2 X' :: Map' = y\Map'1

to_mapping_prune_tm < search.
Proof completed.
Abella < Theorem to_mapping_prune_tm' : 
forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) ->
  (exists Map', Map = y\Map').


============================
 forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) ->
   (exists Map', Map = y\Map')

to_mapping_prune_tm' < induction on 1.

IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
============================
 forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) @ ->
   (exists Map', Map = y\Map')

to_mapping_prune_tm' < intros.

Variables: 
  Vs : list tm
  Vs' : list tm'
  Map : tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
H1 : [n1 : tm']
     |> to_mapping Vs Vs' (Map n1) @
============================
 exists Map', Map = y\Map'

to_mapping_prune_tm' < case H1.
Subgoal 1:

Variables: 
  Vs : list tm
  Vs'1 : tm'
  Map1 : tm' -> tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
H2 : [n1 : tm']
     |> {mapvar Vs (Map1 n1)}
============================
 exists Map', z1\Map1 z1 Vs'1 = y\Map'

Subgoal 2 is:
 exists Map', z1\map X Vs'2 :: Map1 z1 = y\Map'

to_mapping_prune_tm' < apply mapvar_prune_tm' to H2.
Subgoal 1:

Variables: 
  Vs : list tm
  Vs'1 : tm'
  ML' : tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
H2 : {mapvar Vs ML'}
============================
 exists Map', z1\ML' Vs'1 = y\Map'

Subgoal 2 is:
 exists Map', z1\map X Vs'2 :: Map1 z1 = y\Map'

to_mapping_prune_tm' < search.
Subgoal 2:

Variables: 
  Vs1 : list tm
  Vs'3 : list tm'
  X : tm
  Vs'2 : tm'
  Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
H2 : [n1 : tm']
     |> to_mapping Vs1 Vs'3 (Map1 n1) *
============================
 exists Map', z1\map X Vs'2 :: Map1 z1 = y\Map'

to_mapping_prune_tm' < apply IH to H2.
Subgoal 2:

Variables: 
  Map' : list (map tm tm')
  Vs1 : list tm
  Vs'3 : list tm'
  X : tm
  Vs'2 : tm'
IH : forall Vs Vs' Map, nabla x, to_mapping Vs Vs' (Map x) * ->
       (exists Map', Map = y\Map')
H2 : to_mapping Vs1 Vs'3 Map' *
============================
 exists Map'1, z1\map X Vs'2 :: Map' = y\Map'1

to_mapping_prune_tm' < search.
Proof completed.
Abella < Theorem var_sem_pres : 
forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L -> subst ML ->
  subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
  vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> member (of X T) L ->
  {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
  (exists V', {eval' M'' V'} /\ equiv_cc T K V V').


============================
 forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
   subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
   vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> member (of X T) L ->
   {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
   (exists V', {eval' M'' V'} /\ equiv_cc T K V V')

var_sem_pres < induction on 8.

IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
============================
 forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
   subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
   vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map @ -> member (of X T) L ->
   {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
   (exists V', {eval' M'' V'} /\ equiv_cc T K V V')

var_sem_pres < intros.

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  X,V : tm
  M',M'' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map @
H9 : member (of X T) L
H10 : {memb (map X M') Map}
H11 : app_subst ML X V
H12 : app_subst ML' M' M''
============================
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H8.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  K : nat
  X,V : tm
  M',M'',E : tm'
  T : ty
  Map1 : tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' (E :: nil)
H9 : member (of X T) L
H10 : {memb (map X M') (Map1 E)}
H11 : app_subst ML X V
H12 : app_subst ML' M' M''
H13 : {mapvar Vs Map1}
============================
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

Subgoal 2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H7.
Subgoal 1:

Variables: 
  ML1 : list (map tm' tm')
  Vs : list tm
  K : nat
  X,V : tm
  V1 : tm'
  T : ty
  ML : tm' -> (list (map tm tm))
  L : tm' -> (list o)
  M',M'' : tm' -> tm'
  Map1 : tm' -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n1 : tm']
     |> ctx (L n1)
H3 : [n1 : tm']
     |> subst (ML n1)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML1)
H5 : [n1 : tm']
     |> subst_equiv_cc (L n1) K (ML n1) (map n1 V1 :: ML1)
H6 : [n1 : tm']
     |> vars_of_ctx (L n1) Vs
H9 : [n1 : tm']
     |> member (of X T) (L n1)
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 n1 n1)}
H11 : [n1 : tm']
      |> app_subst (ML n1) X V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML1) (M' n1) (M'' n1)
H13 : [n1 : tm']
      |> {mapvar Vs (Map1 n1)}
H14 : vars_of_subst' ML1 nil
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

Subgoal 2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H14.
Subgoal 1:

Variables: 
  Vs : list tm
  K : nat
  X,V : tm
  V1 : tm'
  T : ty
  ML : tm' -> (list (map tm tm))
  L : tm' -> (list o)
  M',M'' : tm' -> tm'
  Map1 : tm' -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n1 : tm']
     |> ctx (L n1)
H3 : [n1 : tm']
     |> subst (ML n1)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H5 : [n1 : tm']
     |> subst_equiv_cc (L n1) K (ML n1) (map n1 V1 :: nil)
H6 : [n1 : tm']
     |> vars_of_ctx (L n1) Vs
H9 : [n1 : tm']
     |> member (of X T) (L n1)
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 n1 n1)}
H11 : [n1 : tm']
      |> app_subst (ML n1) X V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : [n1 : tm']
      |> {mapvar Vs (Map1 n1)}
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

Subgoal 2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H5.
Subgoal 1.1:

Variables: 
  ML2 : list (map tm tm)
  L1 : list o
  Vs : list tm
  K : nat
  X,V : tm
  V1 : tm'
  T : ty
  M',M'' : tm' -> tm'
  Map1 : tm' -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 n1 n1)}
H11 : app_subst ML2 X V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : [n1 : tm']
      |> {mapvar Vs (Map1 n1)}
H15 : subst_env_equiv_cc L1 K ML2 V1
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

Subgoal 1.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < apply mapvar_prune_tm' to H13.
Subgoal 1.1:

Variables: 
  ML2 : list (map tm tm)
  L1 : list o
  Vs : list tm
  K : nat
  X,V : tm
  V1 : tm'
  T : ty
  ML'1 : tm' -> (list (map tm tm'))
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv_cc L1 K ML2 V1
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

Subgoal 1.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < apply fvar_sem_pres to _ _ _ _ _ H13 H9 H10 _.
Subgoal 1.1:

Variables: 
  ML2 : list (map tm tm)
  L1 : list o
  Vs : list tm
  K : nat
  X,V : tm
  V1,V' : tm'
  T : ty
  ML'1 : tm' -> (list (map tm tm'))
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv_cc L1 K ML2 V1
H16 : {eval' (M' V1) V'}
H17 : equiv_cc T K V V'
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

Subgoal 1.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H12.
Subgoal 1.1:

Variables: 
  ML2 : list (map tm tm)
  L1 : list o
  Vs : list tm
  K : nat
  X,V : tm
  V1,V',M : tm'
  T : ty
  ML'1 : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv_cc L1 K ML2 V1
H16 : {eval' (M' V1) V'}
H17 : equiv_cc T K V V'
H18 : app_subst nil (M' V1) M
============================
 exists V', {eval' M V'} /\ equiv_cc T K V V'

Subgoal 1.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H18.
Subgoal 1.1:

Variables: 
  ML2 : list (map tm tm)
  L1 : list o
  Vs : list tm
  K : nat
  X,V : tm
  V1,V' : tm'
  T : ty
  ML'1 : tm' -> (list (map tm tm'))
  M' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L1
H3 : subst ML2
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H6 : vars_of_ctx L1 Vs
H9 : member (of X T) L1
H10 : [n1 : tm']
      |> {memb (map X (M' n1)) (ML'1 n1)}
H11 : app_subst ML2 X V
H13 : {mapvar Vs ML'1}
H15 : subst_env_equiv_cc L1 K ML2 V1
H16 : {eval' (M' V1) V'}
H17 : equiv_cc T K V V'
============================
 exists V', {eval' (M' V1) V'} /\ equiv_cc T K V V'

Subgoal 1.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < search.
Subgoal 1.2:

Variables: 
  ML2 : list (map tm tm)
  L1 : list o
  K : nat
  V2 : tm
  V1 : tm'
  T,T1 : ty
  Vs : tm -> (list tm)
  X,V : tm -> tm
  Map1 : tm -> tm' -> tm' -> (list (map tm tm'))
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L1)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H6 : [n2 : tm]
     |> vars_of_ctx (of n2 T1 :: L1) (Vs n2)
H9 : [n2 : tm]
     |> member (of (X n2) T) (of n2 T1 :: L1)
H10 : [n1 : tm', n2 : tm]
      |> {memb (map (X n2) (M' n1)) (Map1 n2 n1 n1)}
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : [n1 : tm', n2 : tm]
      |> {mapvar (Vs n2) (Map1 n2 n1)}
H15 : equiv_cc T1 K V2 V1
H16 : subst_equiv_cc L1 K ML2 nil
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H16.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map1 : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs1 : list tm
  Vs'1 : list tm'
  K : nat
  X,V,X1 : tm
  M',M'',X' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L (X1 :: Vs1)
H7 : vars_of_subst' ML' (X' :: Vs'1)
H9 : member (of X T) L
H10 : {memb (map X M') (map X1 X' :: Map1)}
H11 : app_subst ML X V
H12 : app_subst ML' M' M''
H13 : to_mapping Vs1 Vs'1 Map1 *
============================
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H10.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  Map1 : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs1 : list tm
  Vs'1 : list tm'
  K : nat
  V,X1 : tm
  M'',X' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L (X1 :: Vs1)
H7 : vars_of_subst' ML' (X' :: Vs'1)
H9 : member (of X1 T) L
H11 : app_subst ML X1 V
H12 : app_subst ML' X' M''
H13 : to_mapping Vs1 Vs'1 Map1 *
============================
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H6.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  Map1 : list (map tm tm')
  ML' : list (map tm' tm')
  L1 : list o
  Vs1 : list tm
  Vs'1 : list tm'
  K : nat
  V,X1 : tm
  M'',X' : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L1)
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc (of X1 T1 :: L1) K ML ML'
H7 : vars_of_subst' ML' (X' :: Vs'1)
H9 : member (of X1 T) (of X1 T1 :: L1)
H11 : app_subst ML X1 V
H12 : app_subst ML' X' M''
H13 : to_mapping Vs1 Vs'1 Map1 *
H14 : vars_of_ctx L1 Vs1
============================
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H7.
Subgoal 2.1:

Variables: 
  ML1 : list (map tm' tm')
  Vs1 : list tm
  L2 : list tm'
  K : nat
  V,X1 : tm
  V1 : tm'
  T,T1 : ty
  ML : tm' -> (list (map tm tm))
  Map1 : tm' -> (list (map tm tm'))
  L1 : tm' -> (list o)
  M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n1 : tm']
     |> ctx (of X1 T1 :: L1 n1)
H3 : [n1 : tm']
     |> subst (ML n1)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML1)
H5 : [n1 : tm']
     |> subst_equiv_cc (of X1 T1 :: L1 n1) K (ML n1) (map n1 V1 :: ML1)
H9 : [n1 : tm']
     |> member (of X1 T) (of X1 T1 :: L1 n1)
H11 : [n1 : tm']
      |> app_subst (ML n1) X1 V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML1) n1 (M'' n1)
H13 : [n1 : tm']
      |> to_mapping Vs1 L2 (Map1 n1) *
H14 : [n1 : tm']
      |> vars_of_ctx (L1 n1) Vs1
H15 : vars_of_subst' ML1 L2
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H5.
Subgoal 2.1.1:

Variables: 
  ML2 : list (map tm tm)
  L4 : list o
  Vs1 : list tm
  L2 : list tm'
  K : nat
  V,X1 : tm
  V1 : tm'
  T,T1 : ty
  Map1 : tm' -> (list (map tm tm'))
  M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H9 : member (of X1 T) (of X1 T1 :: L4)
H11 : app_subst ML2 X1 V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: nil) n1 (M'' n1)
H13 : [n1 : tm']
      |> to_mapping Vs1 L2 (Map1 n1) *
H14 : vars_of_ctx L4 Vs1
H15 : vars_of_subst' nil L2
H16 : subst_env_equiv_cc (of X1 T1 :: L4) K ML2 V1
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

Subgoal 2.1.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H15.
Subgoal 2.1.1:

Variables: 
  ML2 : list (map tm tm)
  L4 : list o
  Vs1 : list tm
  K : nat
  V,X1 : tm
  V1 : tm'
  T,T1 : ty
  Map1 : tm' -> (list (map tm tm'))
  M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H9 : member (of X1 T) (of X1 T1 :: L4)
H11 : app_subst ML2 X1 V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: nil) n1 (M'' n1)
H13 : [n1 : tm']
      |> to_mapping Vs1 nil (Map1 n1) *
H14 : vars_of_ctx L4 Vs1
H16 : subst_env_equiv_cc (of X1 T1 :: L4) K ML2 V1
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

Subgoal 2.1.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H13.
Subgoal 2.1.2:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T,T1 : ty
  Vs1 : tm -> (list tm)
  V : tm -> tm
  Map1 : tm -> tm' -> (list (map tm tm'))
  M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
     |> member (of n2 T) (of n2 T1 :: L3)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) n2 (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) n1 (M'' n1)
H13 : [n1 : tm', n2 : tm]
      |> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
      |> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H9.
Subgoal 2.1.2.1:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T1 : ty
  Vs1 : tm -> (list tm)
  V : tm -> tm
  Map1 : tm -> tm' -> (list (map tm tm'))
  M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) n2 (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) n1 (M'' n1)
H13 : [n1 : tm', n2 : tm]
      |> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
      |> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T1 K (V n2) V'

Subgoal 2.1.2.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < apply subst_var_eq to H3 _ H11.
Subgoal 2.1.2.1:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T1 : ty
  Vs1 : tm -> (list tm)
  Map1 : tm -> tm' -> (list (map tm tm'))
  M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) n1 (M'' n1)
H13 : [n1 : tm', n2 : tm]
      |> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
      |> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T1 K V2 V'

Subgoal 2.1.2.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < apply subst'_var_eq to H4 _ H12.
Subgoal 2.1.2.1:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T1 : ty
  Vs1 : tm -> (list tm)
  Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) n1 V1
H13 : [n1 : tm', n2 : tm]
      |> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
      |> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
============================
 exists V', {eval' V1 V'} /\ equiv_cc T1 K V2 V'

Subgoal 2.1.2.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < apply equiv_cc_val' to _ _ H16.
Subgoal 2.1.2.1.1:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T1 : ty
  Vs1 : tm -> (list tm)
  Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) n1 V1
H13 : [n1 : tm', n2 : tm]
      |> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
      |> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
============================
 {is_sty T1}

Subgoal 2.1.2.1 is:
 exists V', {eval' V1 V'} /\ equiv_cc T1 K V2 V'

Subgoal 2.1.2.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H2.
Subgoal 2.1.2.1.1:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T1 : ty
  Vs1 : tm -> (list tm)
  Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) n1 V1
H13 : [n1 : tm', n2 : tm]
      |> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
      |> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
H18 : ctx L3
H19 : [n2 : tm]
      |> name n2
H20 : {is_sty T1}
H21 : [n2 : tm]
      |> forall T', member (of n2 T') L3 -> T1 = T'
============================
 {is_sty T1}

Subgoal 2.1.2.1 is:
 exists V', {eval' V1 V'} /\ equiv_cc T1 K V2 V'

Subgoal 2.1.2.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < search.
Subgoal 2.1.2.1:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T1 : ty
  Vs1 : tm -> (list tm)
  Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) n1 V1
H13 : [n1 : tm', n2 : tm]
      |> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
      |> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
H18 : {val' V1}
============================
 exists V', {eval' V1 V'} /\ equiv_cc T1 K V2 V'

Subgoal 2.1.2.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < apply eval'_refl to H18.
Subgoal 2.1.2.1:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T1 : ty
  Vs1 : tm -> (list tm)
  Map1 : tm -> tm' -> (list (map tm tm'))
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) n2 V2
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) n1 V1
H13 : [n1 : tm', n2 : tm]
      |> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
      |> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
H18 : {val' V1}
H19 : {eval' V1 V1}
============================
 exists V', {eval' V1 V'} /\ equiv_cc T1 K V2 V'

Subgoal 2.1.2.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < search.
Subgoal 2.1.2.2:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T,T1 : ty
  Vs1 : tm -> (list tm)
  V : tm -> tm
  Map1 : tm -> tm' -> (list (map tm tm'))
  M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) n2 (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) n1 (M'' n1)
H13 : [n1 : tm', n2 : tm]
      |> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n2 : tm]
      |> vars_of_ctx L3 (Vs1 n2)
H15 : vars_of_subst' ML'1 L2
H16 : equiv_cc T1 K V2 V1
H17 : subst_equiv_cc L3 K ML2 ML'1
H18 : [n2 : tm]
      |> member (of n2 T) L3
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

Subgoal 2.2 is:
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < apply member_prune to H18.
Subgoal 2.2:

Variables: 
  ML : list (map tm tm)
  Map1 : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs1 : list tm
  Vs'1 : list tm'
  K : nat
  X,V,X1 : tm
  M',M'',X' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L (X1 :: Vs1)
H7 : vars_of_subst' ML' (X' :: Vs'1)
H9 : member (of X T) L
H11 : app_subst ML X V
H12 : app_subst ML' M' M''
H13 : to_mapping Vs1 Vs'1 Map1 *
H14 : {memb (map X M') Map1}
============================
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H6.
Subgoal 2.2:

Variables: 
  ML : list (map tm tm)
  Map1 : list (map tm tm')
  ML' : list (map tm' tm')
  L1 : list o
  Vs1 : list tm
  Vs'1 : list tm'
  K : nat
  X,V,X1 : tm
  M',M'',X' : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L1)
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc (of X1 T1 :: L1) K ML ML'
H7 : vars_of_subst' ML' (X' :: Vs'1)
H9 : member (of X T) (of X1 T1 :: L1)
H11 : app_subst ML X V
H12 : app_subst ML' M' M''
H13 : to_mapping Vs1 Vs'1 Map1 *
H14 : {memb (map X M') Map1}
H15 : vars_of_ctx L1 Vs1
============================
 exists V', {eval' M'' V'} /\ equiv_cc T K V V'

var_sem_pres < case H7.
Subgoal 2.2:

Variables: 
  ML1 : list (map tm' tm')
  Vs1 : list tm
  L2 : list tm'
  K : nat
  X,V,X1 : tm
  V1 : tm'
  T,T1 : ty
  ML : tm' -> (list (map tm tm))
  Map1 : tm' -> (list (map tm tm'))
  L1 : tm' -> (list o)
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n1 : tm']
     |> ctx (of X1 T1 :: L1 n1)
H3 : [n1 : tm']
     |> subst (ML n1)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML1)
H5 : [n1 : tm']
     |> subst_equiv_cc (of X1 T1 :: L1 n1) K (ML n1) (map n1 V1 :: ML1)
H9 : [n1 : tm']
     |> member (of X T) (of X1 T1 :: L1 n1)
H11 : [n1 : tm']
      |> app_subst (ML n1) X V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML1) (M' n1) (M'' n1)
H13 : [n1 : tm']
      |> to_mapping Vs1 L2 (Map1 n1) *
H14 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 n1)}
H15 : [n1 : tm']
      |> vars_of_ctx (L1 n1) Vs1
H16 : vars_of_subst' ML1 L2
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

var_sem_pres < case H5.
Subgoal 2.2.1:

Variables: 
  ML2 : list (map tm tm)
  L4 : list o
  Vs1 : list tm
  L2 : list tm'
  K : nat
  X,V,X1 : tm
  V1 : tm'
  T,T1 : ty
  Map1 : tm' -> (list (map tm tm'))
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H9 : member (of X T) (of X1 T1 :: L4)
H11 : app_subst ML2 X V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : [n1 : tm']
      |> to_mapping Vs1 L2 (Map1 n1) *
H14 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 n1)}
H15 : vars_of_ctx L4 Vs1
H16 : vars_of_subst' nil L2
H17 : subst_env_equiv_cc (of X1 T1 :: L4) K ML2 V1
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

Subgoal 2.2.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

var_sem_pres < case H16.
Subgoal 2.2.1:

Variables: 
  ML2 : list (map tm tm)
  L4 : list o
  Vs1 : list tm
  K : nat
  X,V,X1 : tm
  V1 : tm'
  T,T1 : ty
  Map1 : tm' -> (list (map tm tm'))
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : ctx (of X1 T1 :: L4)
H3 : subst ML2
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: nil)
H9 : member (of X T) (of X1 T1 :: L4)
H11 : app_subst ML2 X V
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: nil) (M' n1) (M'' n1)
H13 : [n1 : tm']
      |> to_mapping Vs1 nil (Map1 n1) *
H14 : [n1 : tm']
      |> {memb (map X (M' n1)) (Map1 n1)}
H15 : vars_of_ctx L4 Vs1
H17 : subst_env_equiv_cc (of X1 T1 :: L4) K ML2 V1
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K V V'

Subgoal 2.2.2 is:
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

var_sem_pres < case H13.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T,T1 : ty
  Vs1 : tm -> (list tm)
  X,V : tm -> tm
  Map1 : tm -> tm' -> (list (map tm tm'))
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
     |> member (of (X n2) T) (of n2 T1 :: L3)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : [n1 : tm', n2 : tm]
      |> to_mapping (Vs1 n2) L2 (Map1 n2 n1) *
H14 : [n1 : tm', n2 : tm]
      |> {memb (map (X n2) (M' n1)) (Map1 n2 n1)}
H15 : [n2 : tm]
      |> vars_of_ctx L3 (Vs1 n2)
H16 : vars_of_subst' ML'1 L2
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

var_sem_pres < apply vars_of_ctx_prune_tm to H15.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  L2 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T,T1 : ty
  X,V : tm -> tm
  Map1 : tm -> tm' -> (list (map tm tm'))
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
     |> member (of (X n2) T) (of n2 T1 :: L3)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : [n1 : tm', n2 : tm]
      |> to_mapping Vs'2 L2 (Map1 n2 n1) *
H14 : [n1 : tm', n2 : tm]
      |> {memb (map (X n2) (M' n1)) (Map1 n2 n1)}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 L2
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

var_sem_pres < apply vars_of_subst'_prune_tm' to H16.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T,T1 : ty
  X,V : tm -> tm
  Map1 : tm -> tm' -> (list (map tm tm'))
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
     |> member (of (X n2) T) (of n2 T1 :: L3)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : [n1 : tm', n2 : tm]
      |> to_mapping Vs'2 Vs'3 (Map1 n2 n1) *
H14 : [n1 : tm', n2 : tm]
      |> {memb (map (X n2) (M' n1)) (Map1 n2 n1)}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

var_sem_pres < apply to_mapping_prune_tm to H13.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T,T1 : ty
  X,V : tm -> tm
  Map' : tm' -> (list (map tm tm'))
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
     |> member (of (X n2) T) (of n2 T1 :: L3)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : [n1 : tm']
      |> to_mapping Vs'2 Vs'3 (Map' n1) *
H14 : [n1 : tm', n2 : tm]
      |> {memb (map (X n2) (M' n1)) (Map' n1)}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

var_sem_pres < apply to_mapping_prune_tm' to H13.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2 : tm
  V1 : tm'
  T,T1 : ty
  X,V : tm -> tm
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
     |> member (of (X n2) T) (of n2 T1 :: L3)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) (X n2) (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : [n1 : tm', n2 : tm]
      |> {memb (map (X n2) (M' n1)) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

var_sem_pres < apply memb_prune to H14.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2 : tm
  V1 : tm'
  T,T1 : ty
  V : tm -> tm
  M',M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
     |> member (of M'2 T) (of n2 T1 :: L3)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) M'2 (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) (M' n1) (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : [n1 : tm']
      |> {memb (map M'2 (M' n1)) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

var_sem_pres < apply memb_prune to H14.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2 : tm
  V1,M'4 : tm'
  T,T1 : ty
  V : tm -> tm
  M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
     |> member (of M'2 T) (of n2 T1 :: L3)
H11 : [n2 : tm]
      |> app_subst (map n2 V2 :: ML2) M'2 (V n2)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) M'4 (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
============================
 [n1 : tm', n2 : tm]
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K (V n2) V'

var_sem_pres < case H11.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2,M : tm
  V1,M'4 : tm'
  T,T1 : ty
  M'' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
     |> member (of M'2 T) (of n2 T1 :: L3)
H12 : [n1 : tm']
      |> app_subst (map n1 V1 :: ML'1) M'4 (M'' n1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
============================
 [n1 : tm']
 |> exists V', {eval' (M'' n1) V'} /\ equiv_cc T K M V'

var_sem_pres < case H12.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2,M : tm
  V1,M'4,M1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H9 : [n2 : tm]
     |> member (of M'2 T) (of n2 T1 :: L3)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
============================
 exists V', {eval' M1 V'} /\ equiv_cc T K M V'

var_sem_pres < case H9.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2,M : tm
  V1,M'4,M1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
============================
 exists V', {eval' M1 V'} /\ equiv_cc T K M V'

var_sem_pres < apply IH to _ _ _ _ H18 H15 H16 H13 _ H14 H19 H20.
Subgoal 2.2.2.1:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2,M : tm
  V1,M'4,M1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
============================
 subst' ML'1

Subgoal 2.2.2.2 is:
 subst ML2

Subgoal 2.2.2.3 is:
 ctx L3

Subgoal 2.2.2 is:
 exists V', {eval' M1 V'} /\ equiv_cc T K M V'

var_sem_pres < case H4.
Subgoal 2.2.2.1:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2,M : tm
  V1,M'4,M1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
H22 : subst' ML'1
H23 : {val' V1}
H24 : {tm' V1}
============================
 subst' ML'1

Subgoal 2.2.2.2 is:
 subst ML2

Subgoal 2.2.2.3 is:
 ctx L3

Subgoal 2.2.2 is:
 exists V', {eval' M1 V'} /\ equiv_cc T K M V'

var_sem_pres < search.
Subgoal 2.2.2.2:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2,M : tm
  V1,M'4,M1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
============================
 subst ML2

Subgoal 2.2.2.3 is:
 ctx L3

Subgoal 2.2.2 is:
 exists V', {eval' M1 V'} /\ equiv_cc T K M V'

var_sem_pres < case H3.
Subgoal 2.2.2.2:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2,M : tm
  V1,M'4,M1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
H22 : subst ML2
H23 : {val V2}
H24 : {tm V2}
============================
 subst ML2

Subgoal 2.2.2.3 is:
 ctx L3

Subgoal 2.2.2 is:
 exists V', {eval' M1 V'} /\ equiv_cc T K M V'

var_sem_pres < search.
Subgoal 2.2.2.3:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2,M : tm
  V1,M'4,M1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
============================
 ctx L3

Subgoal 2.2.2 is:
 exists V', {eval' M1 V'} /\ equiv_cc T K M V'

var_sem_pres < case H2.
Subgoal 2.2.2.3:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2,M : tm
  V1,M'4,M1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
H22 : ctx L3
H23 : [n2 : tm]
      |> name n2
H24 : {is_sty T1}
H25 : [n2 : tm]
      |> forall T', member (of n2 T') L3 -> T1 = T'
============================
 ctx L3

Subgoal 2.2.2 is:
 exists V', {eval' M1 V'} /\ equiv_cc T K M V'

var_sem_pres < search.
Subgoal 2.2.2:

Variables: 
  ML2 : list (map tm tm)
  Map'1 : list (map tm tm')
  ML'1 : list (map tm' tm')
  L3 : list o
  Vs'2 : list tm
  Vs'3 : list tm'
  K : nat
  V2,M'2,M : tm
  V1,M'4,M1,V' : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map X T V M' M'', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
       to_mapping Vs Vs' Map * -> member (of X T) L ->
       {memb (map X M') Map} -> app_subst ML X V -> app_subst ML' M' M'' ->
       (exists V', {eval' M'' V'} /\ equiv_cc T K V V')
H1 : {is_nat K}
H2 : [n2 : tm]
     |> ctx (of n2 T1 :: L3)
H3 : [n2 : tm]
     |> subst (map n2 V2 :: ML2)
H4 : [n1 : tm']
     |> subst' (map n1 V1 :: ML'1)
H13 : to_mapping Vs'2 Vs'3 Map'1 *
H14 : {memb (map M'2 M'4) Map'1}
H15 : vars_of_ctx L3 Vs'2
H16 : vars_of_subst' ML'1 Vs'3
H17 : equiv_cc T1 K V2 V1
H18 : subst_equiv_cc L3 K ML2 ML'1
H19 : app_subst ML2 M'2 M
H20 : app_subst ML'1 M'4 M1
H21 : member (of M'2 T) L3
H22 : {eval' M1 V'}
H23 : equiv_cc T K M V'
============================
 exists V', {eval' M1 V'} /\ equiv_cc T K M V'

var_sem_pres < search.
Proof completed.
Abella < Theorem mapenv_sem_pres : 
forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L -> subst ML ->
  subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
  vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> prune_ctx NFVs L L' ->
  {mapenv NFVs Map E} -> app_subst ML' E E' ->
  (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE').


============================
 forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
   subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
   vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> prune_ctx NFVs L L' ->
   {mapenv NFVs Map E} -> app_subst ML' E E' ->
   (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')

mapenv_sem_pres < induction on 10.

IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
============================
 forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
   subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
   vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> prune_ctx NFVs L L' ->
   {mapenv NFVs Map E}@ -> app_subst ML' E E' ->
   (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')

mapenv_sem_pres < intros.

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,NFVs : list tm
  Vs' : list tm'
  K : nat
  E,E' : tm'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : prune_ctx NFVs L L'
H10 : {mapenv NFVs Map E}@
H11 : app_subst ML' E E'
============================
 exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'

mapenv_sem_pres < case H10.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  E' : tm'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : prune_ctx nil L L'
H11 : app_subst ML' unit' E'
============================
 exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'

Subgoal 2 is:
 exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'

mapenv_sem_pres < case H9.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  E' : tm'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' unit' E'
============================
 exists VE', {eval' E' VE'} /\ subst_env_equiv_cc nil K ML VE'

Subgoal 2 is:
 exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'

mapenv_sem_pres < apply app_subst'_unit_comm to H11.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' unit' unit'
============================
 exists VE', {eval' unit' VE'} /\ subst_env_equiv_cc nil K ML VE'

Subgoal 2 is:
 exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'

mapenv_sem_pres < search.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X : tm
  E',ML1,M : tm'
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : prune_ctx (X :: L1) L L'
H11 : app_subst ML' (pair' M ML1) E'
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
============================
 exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'

mapenv_sem_pres < case H9.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X : tm
  E',ML1,M : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) E'
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
============================
 exists VE', {eval' E' VE'} /\ subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < apply app_subst'_pair_comm to H11.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X : tm
  ML1,M,M1',M2' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
============================
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < apply ctx_mem_to_lst_mem to H6 H14.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X : tm
  ML1,M,M1',M2' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
============================
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < apply subst_equiv_cc_mem to H5 H6 H18.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X,V : tm
  ML1,M,M1',M2' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
============================
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < apply subst_var to H3 H19.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X,V : tm
  ML1,M,M1',M2' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
============================
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < assert exists V', {eval' M1' V'} /\ equiv_cc T K V V'.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X,V : tm
  ML1,M,M1',M2' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
============================
 exists V', {eval' M1' V'} /\ equiv_cc T K V V'

Subgoal 2 is:
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < backchain var_sem_pres.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X,V : tm
  ML1,M,M1',M2' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H21 : exists V', {eval' M1' V'} /\ equiv_cc T K V V'
============================
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < case H21.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X,V : tm
  ML1,M,M1',M2',V' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv_cc T K V V'
============================
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < apply IH to _ _ _ _ _ _ _ _ H15 H13 H17.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X,V : tm
  ML1,M,M1',M2',V',VE' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv_cc T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv_cc L'1 K ML VE'
============================
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < assert subst_env_equiv_cc (of X T :: L'1) K ML (pair' V' VE').
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X,V : tm
  ML1,M,M1',M2',V',VE' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv_cc T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv_cc L'1 K ML VE'
H26 : subst_env_equiv_cc (of X T :: L'1) K ML (pair' V' VE')
============================
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < assert {eval' (pair' M1' M2') (pair' V' VE')}.
Subgoal 2.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X,V : tm
  ML1,M,M1',M2',V',VE' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv_cc T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv_cc L'1 K ML VE'
H26 : subst_env_equiv_cc (of X T :: L'1) K ML (pair' V' VE')
============================
 {eval' (pair' M1' M2') (pair' V' VE')}

Subgoal 2 is:
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < backchain eval'_pair_fwd.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L'1 : list o
  Vs,L1 : list tm
  Vs' : list tm'
  K : nat
  X,V : tm
  ML1,M,M1',M2',V',VE' : tm'
  T : ty
IH : forall L L' ML ML' K Vs Vs' NFVs Map E E', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       prune_ctx NFVs L L' -> {mapenv NFVs Map E}* -> app_subst ML' E E' ->
       (exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE')
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML' (pair' M ML1) (pair' M1' M2')
H12 : {memb (map X M) Map}*
H13 : {mapenv L1 Map ML1}*
H14 : member (of X T) L
H15 : prune_ctx L1 L L'1
H16 : app_subst ML' M M1'
H17 : app_subst ML' ML1 M2'
H18 : {memb X Vs}
H19 : member (map X V) ML
H20 : app_subst ML X V
H22 : {eval' M1' V'}
H23 : equiv_cc T K V V'
H24 : {eval' M2' VE'}
H25 : subst_env_equiv_cc L'1 K ML VE'
H26 : subst_env_equiv_cc (of X T :: L'1) K ML (pair' V' VE')
H27 : {eval' (pair' M1' M2') (pair' V' VE')}
============================
 exists VE', {eval' (pair' M1' M2') VE'} /\
   subst_env_equiv_cc (of X T :: L'1) K ML VE'

mapenv_sem_pres < search.
Proof completed.
Abella < Theorem mapvar_to_lst_mem : 
forall Vs Map M M' E, {mapvar Vs Map} -> {memb (map M M') (Map E)} ->
  {memb M Vs}.


============================
 forall Vs Map M M' E, {mapvar Vs Map} -> {memb (map M M') (Map E)} ->
   {memb M Vs}

mapvar_to_lst_mem < induction on 1.

IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
       {memb M Vs}
============================
 forall Vs Map M M' E, {mapvar Vs Map}@ -> {memb (map M M') (Map E)} ->
   {memb M Vs}

mapvar_to_lst_mem < intros.

Variables: 
  Vs : list tm
  M : tm
  M',E : tm'
  Map : tm' -> (list (map tm tm'))
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
       {memb M Vs}
H1 : {mapvar Vs Map}@
H2 : {memb (map M M') (Map E)}
============================
 {memb M Vs}

mapvar_to_lst_mem < case H1.
Subgoal 1:

Variables: 
  M : tm
  M',E : tm'
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
       {memb M Vs}
H2 : {memb (map M M') nil}
============================
 {memb M nil}

Subgoal 2 is:
 {memb M (X :: L)}

mapvar_to_lst_mem < case H2.
Subgoal 2:

Variables: 
  L : list tm
  M,X : tm
  M',E : tm'
  Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
       {memb M Vs}
H2 : {memb (map M M') (map X (fst' E) :: Map1 (snd' E))}
H3 : {mapvar L Map1}*
============================
 {memb M (X :: L)}

mapvar_to_lst_mem < case H2.
Subgoal 2.1:

Variables: 
  L : list tm
  X : tm
  E : tm'
  Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
       {memb M Vs}
H3 : {mapvar L Map1}*
============================
 {memb X (X :: L)}

Subgoal 2.2 is:
 {memb M (X :: L)}

mapvar_to_lst_mem < search.
Subgoal 2.2:

Variables: 
  L : list tm
  M,X : tm
  M',E : tm'
  Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
       {memb M Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map M M') (Map1 (snd' E))}
============================
 {memb M (X :: L)}

mapvar_to_lst_mem < apply IH to H3 H4.
Subgoal 2.2:

Variables: 
  L : list tm
  M,X : tm
  M',E : tm'
  Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Map M M' E, {mapvar Vs Map}* -> {memb (map M M') (Map E)} ->
       {memb M Vs}
H3 : {mapvar L Map1}*
H4 : {memb (map M M') (Map1 (snd' E))}
H5 : {memb M L}
============================
 {memb M (X :: L)}

mapvar_to_lst_mem < search.
Proof completed.
Abella < Theorem map_mem_to_lst_mem : 
forall Vs Vs' Map M M', to_mapping Vs Vs' Map -> {memb (map M M') Map} ->
  {memb M Vs}.


============================
 forall Vs Vs' Map M M', to_mapping Vs Vs' Map -> {memb (map M M') Map} ->
   {memb M Vs}

map_mem_to_lst_mem < induction on 1.

IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
       {memb (map M M') Map} -> {memb M Vs}
============================
 forall Vs Vs' Map M M', to_mapping Vs Vs' Map @ -> {memb (map M M') Map} ->
   {memb M Vs}

map_mem_to_lst_mem < intros.

Variables: 
  Map : list (map tm tm')
  Vs : list tm
  Vs' : list tm'
  M : tm
  M' : tm'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
       {memb (map M M') Map} -> {memb M Vs}
H1 : to_mapping Vs Vs' Map @
H2 : {memb (map M M') Map}
============================
 {memb M Vs}

map_mem_to_lst_mem < case H1.
Subgoal 1:

Variables: 
  Vs : list tm
  M : tm
  M',E : tm'
  Map1 : tm' -> (list (map tm tm'))
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
       {memb (map M M') Map} -> {memb M Vs}
H2 : {memb (map M M') (Map1 E)}
H3 : {mapvar Vs Map1}
============================
 {memb M Vs}

Subgoal 2 is:
 {memb M (X :: Vs1)}

map_mem_to_lst_mem < backchain mapvar_to_lst_mem.
Subgoal 2:

Variables: 
  Map1 : list (map tm tm')
  Vs1 : list tm
  Vs'1 : list tm'
  M,X : tm
  M',X' : tm'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
       {memb (map M M') Map} -> {memb M Vs}
H2 : {memb (map M M') (map X X' :: Map1)}
H3 : to_mapping Vs1 Vs'1 Map1 *
============================
 {memb M (X :: Vs1)}

map_mem_to_lst_mem < case H2.
Subgoal 2.1:

Variables: 
  Map1 : list (map tm tm')
  Vs1 : list tm
  Vs'1 : list tm'
  X : tm
  X' : tm'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
       {memb (map M M') Map} -> {memb M Vs}
H3 : to_mapping Vs1 Vs'1 Map1 *
============================
 {memb X (X :: Vs1)}

Subgoal 2.2 is:
 {memb M (X :: Vs1)}

map_mem_to_lst_mem < search.
Subgoal 2.2:

Variables: 
  Map1 : list (map tm tm')
  Vs1 : list tm
  Vs'1 : list tm'
  M,X : tm
  M',X' : tm'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
       {memb (map M M') Map} -> {memb M Vs}
H3 : to_mapping Vs1 Vs'1 Map1 *
H4 : {memb (map M M') Map1}
============================
 {memb M (X :: Vs1)}

map_mem_to_lst_mem < apply IH to H3 H4.
Subgoal 2.2:

Variables: 
  Map1 : list (map tm tm')
  Vs1 : list tm
  Vs'1 : list tm'
  M,X : tm
  M',X' : tm'
IH : forall Vs Vs' Map M M', to_mapping Vs Vs' Map * ->
       {memb (map M M') Map} -> {memb M Vs}
H3 : to_mapping Vs1 Vs'1 Map1 *
H4 : {memb (map M M') Map1}
H5 : {memb M Vs1}
============================
 {memb M (X :: Vs1)}

map_mem_to_lst_mem < search.
Proof completed.
Abella < Theorem app_subst_var_val : 
forall L K ML ML' Vs M V, subst ML -> subst_equiv_cc L K ML ML' ->
  vars_of_ctx L Vs -> {memb M Vs} -> app_subst ML M V -> {val V}.


============================
 forall L K ML ML' Vs M V, subst ML -> subst_equiv_cc L K ML ML' ->
   vars_of_ctx L Vs -> {memb M Vs} -> app_subst ML M V -> {val V}

app_subst_var_val < intros.

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  K : nat
  M,V : tm
H1 : subst ML
H2 : subst_equiv_cc L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {memb M Vs}
H5 : app_subst ML M V
============================
 {val V}

app_subst_var_val < apply subst_equiv_cc_mem to H2 H3 H4.

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  K : nat
  M,V,V1 : tm
H1 : subst ML
H2 : subst_equiv_cc L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {memb M Vs}
H5 : app_subst ML M V
H6 : member (map M V1) ML
============================
 {val V}

app_subst_var_val < apply subst_var_eq to H1 H6 H5.

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  K : nat
  M,V1 : tm
H1 : subst ML
H2 : subst_equiv_cc L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {memb M Vs}
H5 : app_subst ML M V1
H6 : member (map M V1) ML
============================
 {val V1}

app_subst_var_val < apply subst_mem to H1 H6.

Variables: 
  ML : list (map tm tm)
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  K : nat
  X,V2 : tm
H1 : subst ML
H2 : subst_equiv_cc L K ML ML'
H3 : vars_of_ctx L Vs
H4 : {memb X Vs}
H5 : app_subst ML X V2
H6 : member (map X V2) ML
H7 : name X
H8 : {val V2}
H9 : {tm V2}
============================
 {val V2}

app_subst_var_val < search.
Proof completed.
Abella < Theorem cc_sem_pres : 
forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L -> subst ML ->
  subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
  vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> {L |- of M T} ->
  {cc Map Vs M M'} -> app_subst ML M P -> app_subst ML' M' P' ->
  sim_cc T K P P'.


============================
 forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L -> subst ML ->
   subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
   vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> {L |- of M T} ->
   {cc Map Vs M M'} -> app_subst ML M P -> app_subst ML' M' P' ->
   sim_cc T K P P'

cc_sem_pres < induction on 10.

IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
============================
 forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L -> subst ML ->
   subst' ML' -> subst_equiv_cc L K ML ML' -> vars_of_ctx L Vs ->
   vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map -> {L |- of M T} ->
   {cc Map Vs M M'}@ -> app_subst ML M P -> app_subst ML' M' P' ->
   sim_cc T K P P'

cc_sem_pres < intros.

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H10 : {cc Map Vs M M'}@
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
============================
 sim_cc T K P P'

cc_sem_pres < case H10.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K,N : nat
  P : tm
  P' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (nat N) T}
H11 : app_subst ML (nat N) P
H12 : app_subst ML' (nat' N) P'
============================
 sim_cc T K P P'

Subgoal 2 is:
 sim_cc T K P P'

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply subst_closed_tm_eq to _ H11.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K,N : nat
  P' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (nat N) T}
H11 : app_subst ML (nat N) (nat N)
H12 : app_subst ML' (nat' N) P'
============================
 sim_cc T K (nat N) P'

Subgoal 2 is:
 sim_cc T K P P'

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply subst'_closed_tm_eq to _ H12.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K,N : nat
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (nat N) T}
H11 : app_subst ML (nat N) (nat N)
H12 : app_subst ML' (nat' N) (nat' N)
============================
 sim_cc T K (nat N) (nat' N)

Subgoal 2 is:
 sim_cc T K P P'

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply of_nat_inv to H2 H9.
Subgoal 1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K,N : nat
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (nat N) tnat}
H11 : app_subst ML (nat N) (nat N)
H12 : app_subst ML' (nat' N) (nat' N)
============================
 sim_cc tnat K (nat N) (nat' N)

Subgoal 2 is:
 sim_cc T K P P'

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_nat.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
============================
 sim_cc T K P P'

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply map_mem_to_lst_mem to _ H13.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
============================
 sim_cc T K P P'

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert member (of M T) L.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
============================
 member (of M T) L

Subgoal 2 is:
 sim_cc T K P P'

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_name to _ _ H14.
Subgoal 2.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
H15 : name M
============================
 member (of M T) L

Subgoal 2 is:
 sim_cc T K P P'

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain of_var_inv.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
H15 : member (of M T) L
============================
 sim_cc T K P P'

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply var_sem_pres to _ _ _ _ _ _ _ _ H15 H13 _ _.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M',V' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
H15 : member (of M T) L
H16 : {eval' P' V'}
H17 : equiv_cc T K P V'
============================
 sim_cc T K P P'

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_val_tm'.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M',V' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
H15 : member (of M T) L
H16 : {eval' P' V'}
H17 : equiv_cc T K P V'
============================
 {val P}

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst_var_val to _ _ _ _ H11.
Subgoal 2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M',V' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of M T}
H11 : app_subst ML M P
H12 : app_subst ML' M' P'
H13 : {memb (map M M') Map}*
H14 : {memb M Vs}
H15 : member (of M T) L
H16 : {eval' P' V'}
H17 : equiv_cc T K P V'
H18 : {val P}
============================
 {val P}

Subgoal 3 is:
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search.
Subgoal 3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M1 : tm
  P',M'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pred M1) T}
H11 : app_subst ML (pred M1) P
H12 : app_subst ML' (pred' M'1) P'
H13 : {cc Map Vs M1 M'1}*
============================
 sim_cc T K P P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst_pred_comm to H11.
Subgoal 3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M'' : tm
  P',M'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pred M1) T}
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) P'
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
============================
 sim_cc T K (pred M'') P'

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst'_pred_comm to H12.
Subgoal 3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M'' : tm
  M'1,M''1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pred M1) T}
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
============================
 sim_cc T K (pred M'') (pred' M''1)

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H9.
Subgoal 3.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M'' : tm
  M'1,M''1 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
H16 : {L |- of M1 tnat}
============================
 sim_cc tnat K (pred M'') (pred' M''1)

Subgoal 3.2 is:
 sim_cc T K (pred M'') (pred' M''1)

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc tnat K M'' M''1.
Subgoal 3.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M'' : tm
  M'1,M''1 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
H16 : {L |- of M1 tnat}
============================
 sim_cc tnat K M'' M''1

Subgoal 3.1 is:
 sim_cc tnat K (pred M'') (pred' M''1)

Subgoal 3.2 is:
 sim_cc T K (pred M'') (pred' M''1)

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH.
Subgoal 3.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M'' : tm
  M'1,M''1 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
H16 : {L |- of M1 tnat}
H17 : sim_cc tnat K M'' M''1
============================
 sim_cc tnat K (pred M'') (pred' M''1)

Subgoal 3.2 is:
 sim_cc T K (pred M'') (pred' M''1)

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_pred.
Subgoal 3.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M1,M'' : tm
  M'1,M''1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
H16 : {L, [F] |- of (pred M1) T}
H17 : member F L
============================
 sim_cc T K (pred M'') (pred' M''1)

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_focus_inv to _ _ H16.
Subgoal 3.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M1,M'' : tm
  M'1,M''1 : tm'
  T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pred M1) (pred M'')
H12 : app_subst ML' (pred' M'1) (pred' M''1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M''
H15 : app_subst ML' M'1 M''1
H16 : {L, [F] |- of (pred M1) T1}
H17 : member F L
H18 : name (pred M1)
============================
 sim_cc T1 K (pred M'') (pred' M''1)

Subgoal 4 is:
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H18.
Subgoal 4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M2,M1 : tm
  P',M2',M1' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (plus M1 M2) T}
H11 : app_subst ML (plus M1 M2) P
H12 : app_subst ML' (plus' M1' M2') P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
============================
 sim_cc T K P P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst_plus_comm to H11.
Subgoal 4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  P',M2',M1' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (plus M1 M2) T}
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
============================
 sim_cc T K (plus M1'1 M2'1) P'

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst'_plus_comm to H12.
Subgoal 4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (plus M1 M2) T}
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
============================
 sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H9.
Subgoal 4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 tnat}
H20 : {L |- of M2 tnat}
============================
 sim_cc tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 4.2 is:
 sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc tnat K M1'1 M1'2.
Subgoal 4.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 tnat}
H20 : {L |- of M2 tnat}
============================
 sim_cc tnat K M1'1 M1'2

Subgoal 4.1 is:
 sim_cc tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 4.2 is:
 sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH.
Subgoal 4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 tnat}
H20 : {L |- of M2 tnat}
H21 : sim_cc tnat K M1'1 M1'2
============================
 sim_cc tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 4.2 is:
 sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc tnat K M2'1 M2'2.
Subgoal 4.1.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 tnat}
H20 : {L |- of M2 tnat}
H21 : sim_cc tnat K M1'1 M1'2
============================
 sim_cc tnat K M2'1 M2'2

Subgoal 4.1 is:
 sim_cc tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 4.2 is:
 sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH with M = M2, M' = M2'.
Subgoal 4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 tnat}
H20 : {L |- of M2 tnat}
H21 : sim_cc tnat K M1'1 M1'2
H22 : sim_cc tnat K M2'1 M2'2
============================
 sim_cc tnat K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 4.2 is:
 sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_plus.
Subgoal 4.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L, [F] |- of (plus M1 M2) T}
H20 : member F L
============================
 sim_cc T K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_focus_inv to _ _ H19.
Subgoal 4.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (plus M1 M2) (plus M1'1 M2'1)
H12 : app_subst ML' (plus' M1' M2') (plus' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L, [F] |- of (plus M1 M2) T1}
H20 : member F L
H21 : name (plus M1 M2)
============================
 sim_cc T1 K (plus M1'1 M2'1) (plus' M1'2 M2'2)

Subgoal 5 is:
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H21.
Subgoal 5:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M2,M1,M3 : tm
  P',M2',M1',M'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (ifz M3 M1 M2) T}
H11 : app_subst ML (ifz M3 M1 M2) P
H12 : app_subst ML' (ifz' M'1 M1' M2') P'
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
============================
 sim_cc T K P P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst_ifz_comm to H11.
Subgoal 5:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  P',M2',M1',M'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (ifz M3 M1 M2) T}
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') P'
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
============================
 sim_cc T K (ifz M'2 M1'1 M2'1) P'

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst'_ifz_comm to H12.
Subgoal 5:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (ifz M3 M1 M2) T}
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
============================
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H9.
Subgoal 5.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
============================
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 5.2 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc tnat K M'2 M'3.
Subgoal 5.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
============================
 sim_cc tnat K M'2 M'3

Subgoal 5.1 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 5.2 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH.
Subgoal 5.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
============================
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 5.2 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc T K M1'1 M1'2.
Subgoal 5.1.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
============================
 sim_cc T K M1'1 M1'2

Subgoal 5.1 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 5.2 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH.
Subgoal 5.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
H26 : sim_cc T K M1'1 M1'2
============================
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 5.2 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc T K M2'1 M2'2.
Subgoal 5.1.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
H26 : sim_cc T K M1'1 M1'2
============================
 sim_cc T K M2'1 M2'2

Subgoal 5.1 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 5.2 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH with M = M2, M' = M2'.
Subgoal 5.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
H26 : sim_cc T K M1'1 M1'2
H27 : sim_cc T K M2'1 M2'2
============================
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 5.2 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_ifz.
Subgoal 5.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L |- of M3 tnat}
H23 : {L |- of M1 T}
H24 : {L |- of M2 T}
H25 : sim_cc tnat K M'2 M'3
H26 : sim_cc T K M1'1 M1'2
H27 : sim_cc T K M2'1 M2'2
============================
 {is_sty T}

Subgoal 5.2 is:
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain of_is_sty with M = M1.
Subgoal 5.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L, [F] |- of (ifz M3 M1 M2) T}
H23 : member F L
============================
 sim_cc T K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_focus_inv to _ _ H22.
Subgoal 5.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M2,M1,M3,M'2,M1'1,M2'1 : tm
  M2',M1',M'1,M'3,M1'2,M2'2 : tm'
  T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (ifz M3 M1 M2) (ifz M'2 M1'1 M2'1)
H12 : app_subst ML' (ifz' M'1 M1' M2') (ifz' M'3 M1'2 M2'2)
H13 : {cc Map Vs M3 M'1}*
H14 : {cc Map Vs M1 M1'}*
H15 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M3 M'2
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst ML' M'1 M'3
H20 : app_subst ML' M1' M1'2
H21 : app_subst ML' M2' M2'2
H22 : {L, [F] |- of (ifz M3 M1 M2) T1}
H23 : member F L
H24 : name (ifz M3 M1 M2)
============================
 sim_cc T1 K (ifz M'2 M1'1 M2'1) (ifz' M'3 M1'2 M2'2)

Subgoal 6 is:
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H24.
Subgoal 6:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of unit T}
H11 : app_subst ML unit P
H12 : app_subst ML' unit' P'
============================
 sim_cc T K P P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply subst_closed_tm_eq to _ H11.
Subgoal 6:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of unit T}
H11 : app_subst ML unit unit
H12 : app_subst ML' unit' P'
============================
 sim_cc T K unit P'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply subst'_closed_tm_eq to _ H12.
Subgoal 6:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of unit T}
H11 : app_subst ML unit unit
H12 : app_subst ML' unit' unit'
============================
 sim_cc T K unit unit'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H9.
Subgoal 6.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML unit unit
H12 : app_subst ML' unit' unit'
============================
 sim_cc tunit K unit unit'

Subgoal 6.2 is:
 sim_cc T K unit unit'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_unit.
Subgoal 6.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML unit unit
H12 : app_subst ML' unit' unit'
H13 : {L, [F] |- of unit T}
H14 : member F L
============================
 sim_cc T K unit unit'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_focus_inv to _ _ H13.
Subgoal 6.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML unit unit
H12 : app_subst ML' unit' unit'
H13 : {L, [F] |- of unit T1}
H14 : member F L
H15 : name unit
============================
 sim_cc T1 K unit unit'

Subgoal 7 is:
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H15.
Subgoal 7:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M2,M1 : tm
  P',M2',M1' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pair M1 M2) T}
H11 : app_subst ML (pair M1 M2) P
H12 : app_subst ML' (pair' M1' M2') P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
============================
 sim_cc T K P P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst_pair_comm to H11.
Subgoal 7:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  P',M2',M1' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pair M1 M2) T}
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
============================
 sim_cc T K (pair M1'1 M2'1) P'

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst'_pair_comm to H12.
Subgoal 7:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (pair M1 M2) T}
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
============================
 sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H9.
Subgoal 7.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
============================
 sim_cc (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 7.2 is:
 sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc T1 K M1'1 M1'2.
Subgoal 7.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
============================
 sim_cc T1 K M1'1 M1'2

Subgoal 7.1 is:
 sim_cc (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 7.2 is:
 sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH.
Subgoal 7.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
H21 : sim_cc T1 K M1'1 M1'2
============================
 sim_cc (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 7.2 is:
 sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc T2 K M2'1 M2'2.
Subgoal 7.1.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
H21 : sim_cc T1 K M1'1 M1'2
============================
 sim_cc T2 K M2'1 M2'2

Subgoal 7.1 is:
 sim_cc (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 7.2 is:
 sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH with M = M2, M' = M2'.
Subgoal 7.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
H21 : sim_cc T1 K M1'1 M1'2
H22 : sim_cc T2 K M2'1 M2'2
============================
 sim_cc (prod T1 T2) K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 7.2 is:
 sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_pair.
Subgoal 7.1.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
H21 : sim_cc T1 K M1'1 M1'2
H22 : sim_cc T2 K M2'1 M2'2
============================
 {is_sty T1}

Subgoal 7.1.4 is:
 {is_sty T2}

Subgoal 7.2 is:
 sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain of_is_sty.
Subgoal 7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T2,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L |- of M1 T1}
H20 : {L |- of M2 T2}
H21 : sim_cc T1 K M1'1 M1'2
H22 : sim_cc T2 K M2'1 M2'2
============================
 {is_sty T2}

Subgoal 7.2 is:
 sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain of_is_sty.
Subgoal 7.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L, [F] |- of (pair M1 M2) T}
H20 : member F L
============================
 sim_cc T K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_focus_inv to _ _ H19.
Subgoal 7.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M2,M1,M1'1,M2'1 : tm
  M2',M1',M1'2,M2'2 : tm'
  T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (pair M1 M2) (pair M1'1 M2'1)
H12 : app_subst ML' (pair' M1' M2') (pair' M1'2 M2'2)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : app_subst ML M1 M1'1
H16 : app_subst ML M2 M2'1
H17 : app_subst ML' M1' M1'2
H18 : app_subst ML' M2' M2'2
H19 : {L, [F] |- of (pair M1 M2) T1}
H20 : member F L
H21 : name (pair M1 M2)
============================
 sim_cc T1 K (pair M1'1 M2'1) (pair' M1'2 M2'2)

Subgoal 8 is:
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H21.
Subgoal 8:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M1 : tm
  P',M'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fst M1) T}
H11 : app_subst ML (fst M1) P
H12 : app_subst ML' (fst' M'1) P'
H13 : {cc Map Vs M1 M'1}*
============================
 sim_cc T K P P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst_fst_comm to H11.
Subgoal 8:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  P',M'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fst M1) T}
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) P'
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
============================
 sim_cc T K (fst M1') P'

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst'_fst_comm to H12.
Subgoal 8:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  M'1,M1'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fst M1) T}
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
============================
 sim_cc T K (fst M1') (fst' M1'1)

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H9.
Subgoal 8.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  M'1,M1'1 : tm'
  T,T2 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T T2)}
============================
 sim_cc T K (fst M1') (fst' M1'1)

Subgoal 8.2 is:
 sim_cc T K (fst M1') (fst' M1'1)

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc (prod T T2) K M1' M1'1.
Subgoal 8.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  M'1,M1'1 : tm'
  T,T2 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T T2)}
============================
 sim_cc (prod T T2) K M1' M1'1

Subgoal 8.1 is:
 sim_cc T K (fst M1') (fst' M1'1)

Subgoal 8.2 is:
 sim_cc T K (fst M1') (fst' M1'1)

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH.
Subgoal 8.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  M'1,M1'1 : tm'
  T,T2 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T T2)}
H17 : sim_cc (prod T T2) K M1' M1'1
============================
 sim_cc T K (fst M1') (fst' M1'1)

Subgoal 8.2 is:
 sim_cc T K (fst M1') (fst' M1'1)

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_fst.
Subgoal 8.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  M'1,M1'1 : tm'
  T,T2 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T T2)}
H17 : sim_cc (prod T T2) K M1' M1'1
============================
 {is_sty (prod T T2)}

Subgoal 8.2 is:
 sim_cc T K (fst M1') (fst' M1'1)

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain of_is_sty.
Subgoal 8.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M1,M1' : tm
  M'1,M1'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L, [F] |- of (fst M1) T}
H17 : member F L
============================
 sim_cc T K (fst M1') (fst' M1'1)

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_focus_inv to _ _ H16.
Subgoal 8.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M1,M1' : tm
  M'1,M1'1 : tm'
  T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (fst M1) (fst M1')
H12 : app_subst ML' (fst' M'1) (fst' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L, [F] |- of (fst M1) T1}
H17 : member F L
H18 : name (fst M1)
============================
 sim_cc T1 K (fst M1') (fst' M1'1)

Subgoal 9 is:
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H18.
Subgoal 9:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M1 : tm
  P',M'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (snd M1) T}
H11 : app_subst ML (snd M1) P
H12 : app_subst ML' (snd' M'1) P'
H13 : {cc Map Vs M1 M'1}*
============================
 sim_cc T K P P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst_snd_comm to H11.
Subgoal 9:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  P',M'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (snd M1) T}
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) P'
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
============================
 sim_cc T K (snd M1') P'

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply app_subst'_snd_comm to H12.
Subgoal 9:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  M'1,M1'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (snd M1) T}
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
============================
 sim_cc T K (snd M1') (snd' M1'1)

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H9.
Subgoal 9.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  M'1,M1'1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T1 T)}
============================
 sim_cc T K (snd M1') (snd' M1'1)

Subgoal 9.2 is:
 sim_cc T K (snd M1') (snd' M1'1)

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc (prod T1 T) K M1' M1'1.
Subgoal 9.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  M'1,M1'1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T1 T)}
============================
 sim_cc (prod T1 T) K M1' M1'1

Subgoal 9.1 is:
 sim_cc T K (snd M1') (snd' M1'1)

Subgoal 9.2 is:
 sim_cc T K (snd M1') (snd' M1'1)

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH.
Subgoal 9.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  M'1,M1'1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T1 T)}
H17 : sim_cc (prod T1 T) K M1' M1'1
============================
 sim_cc T K (snd M1') (snd' M1'1)

Subgoal 9.2 is:
 sim_cc T K (snd M1') (snd' M1'1)

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_snd with T1 = T1.
Subgoal 9.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M1' : tm
  M'1,M1'1 : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L |- of M1 (prod T1 T)}
H17 : sim_cc (prod T1 T) K M1' M1'1
============================
 {is_sty (prod T1 T)}

Subgoal 9.2 is:
 sim_cc T K (snd M1') (snd' M1'1)

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain of_is_sty.
Subgoal 9.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M1,M1' : tm
  M'1,M1'1 : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L, [F] |- of (snd M1) T}
H17 : member F L
============================
 sim_cc T K (snd M1') (snd' M1'1)

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_focus_inv to _ _ H16.
Subgoal 9.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M1,M1' : tm
  M'1,M1'1 : tm'
  T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (snd M1) (snd M1')
H12 : app_subst ML' (snd' M'1) (snd' M1'1)
H13 : {cc Map Vs M1 M'1}*
H14 : app_subst ML M1 M1'
H15 : app_subst ML' M'1 M1'1
H16 : {L, [F] |- of (snd M1) T1}
H17 : member F L
H18 : name (snd M1)
============================
 sim_cc T1 K (snd M1') (snd' M1'1)

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H18.
Subgoal 10:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M1 : tm
  P',M'1 : tm'
  T : ty
  R : tm -> tm
  R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) P
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
============================
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert exists M2 R1, P = let M2 R1 /\ app_subst ML M1 M2 /\
  (nabla x, app_subst ML (R x) (R1 x)).
Subgoal 10.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M1 : tm
  P',M'1 : tm'
  T : ty
  R : tm -> tm
  R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) P
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
============================
 exists M2 R1, P = let M2 R1 /\ app_subst ML M1 M2 /\
   (nabla x, app_subst ML (R x) (R1 x))

Subgoal 10 is:
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain app_subst_let_comm.
Subgoal 10:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M1 : tm
  P',M'1 : tm'
  T : ty
  R : tm -> tm
  R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) P
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H15 : exists M2 R1, P = let M2 R1 /\ app_subst ML M1 M2 /\
        (nabla x, app_subst ML (R x) (R1 x))
============================
 sim_cc T K P P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H15.
Subgoal 10:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M2 : tm
  P',M'1 : tm'
  T : ty
  R,R1 : tm -> tm
  R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
============================
 sim_cc T K (let M2 R1) P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert exists M'2 R'1, P' = let' M'2 R'1 /\ app_subst ML' M'1 M'2 /\
  (nabla x, app_subst ML' (R' x) (R'1 x)).
Subgoal 10.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M2 : tm
  P',M'1 : tm'
  T : ty
  R,R1 : tm -> tm
  R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
============================
 exists M'2 R'1, P' = let' M'2 R'1 /\ app_subst ML' M'1 M'2 /\
   (nabla x, app_subst ML' (R' x) (R'1 x))

Subgoal 10 is:
 sim_cc T K (let M2 R1) P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain app_subst'_let_comm.
Subgoal 10:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M2 : tm
  P',M'1 : tm'
  T : ty
  R,R1 : tm -> tm
  R' : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') P'
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H18 : exists M'2 R'1, P' = let' M'2 R'1 /\ app_subst ML' M'1 M'2 /\
        (nabla x, app_subst ML' (R' x) (R'1 x))
============================
 sim_cc T K (let M2 R1) P'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H18.
Subgoal 10:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M2 : tm
  M'1,M'2 : tm'
  T : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (let M1 R) T}
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
============================
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H9.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M2 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
============================
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc T1 K M2 M'2.
Subgoal 10.3.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M2 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
============================
 sim_cc T1 K M2 M'2

Subgoal 10.3 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M2 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 K M2 M'2
============================
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < unfold.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M1,M2 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 K M2 M'2
============================
 forall J V, le J K -> {nstep J (let M2 R1) V} -> {val V} ->
   (exists V' N, {eval' (let' M'2 R'1) V'} /\ {add J N K} /\
        equiv_cc T N V V')

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < intros.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K,J : nat
  M1,M2,V : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 K M2 M'2
H24 : le J K
H25 : {nstep J (let M2 R1) V}
H26 : {val V}
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add J N K} /\ equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply nstep_let_inv to _ H25.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K,K1,K2,K3 : nat
  M1,M2,V,V1 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 K M2 M'2
H24 : le (s K3) K
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N K} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H24.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K,K1,K2,K3,N : nat
  M1,M2,V,V1 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 K M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H31 : {add (s K3) N K}
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N K} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H31.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3 : nat
  M1,M2,V,V1 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply add_assoc to H27 H32.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert exists V1', {eval' M'2 V1'} /\ equiv_cc T1 (s N23) V1 V1'.
Subgoal 10.3.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
============================
 exists V1', {eval' M'2 V1'} /\ equiv_cc T1 (s N23) V1 V1'

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_nstep.
Subgoal 10.3.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
============================
 {add K1 (s N23) (s N3)}

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain add_s.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2 : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H35 : exists V1', {eval' M'2 V1'} /\ equiv_cc T1 (s N23) V1 V1'
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H35.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply of_is_sty to _ H21.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert {is_nat N23}.
Subgoal 10.3.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
============================
 {is_nat N23}

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain add_arg2_isnat.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply equiv_cc_tm to _ _ H37.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply equiv_cc_tm' to _ _ H37.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc T (s N23) (R1 V1) (R'1 V1').
Subgoal 10.3.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 sim_cc T (s N23) (R1 V1) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH with L = of n1 T1 :: L, ML = map n1 V1 :: ML, ML' = map n2 V1' :: ML', Vs = n1 :: Vs, Vs' = n2 :: Vs', Map = map n1 n2 :: Map, T = T, M = R n1, M' = R' n2.
Subgoal 10.3.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 [n1 : tm]
 |> ctx (of n1 T1 :: L)

Subgoal 10.3.4.2 is:
 [n2 : tm']
 |> subst' (map n2 V1' :: ML')

Subgoal 10.3.4.3 is:
 [n1 : tm, n2 : tm']
 |> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
      (map n2 V1' :: ML')

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H1.
Subgoal 10.3.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : {is_nat N3}
============================
 [n1 : tm]
 |> ctx (of n1 T1 :: L)

Subgoal 10.3.4.2 is:
 [n2 : tm']
 |> subst' (map n2 V1' :: ML')

Subgoal 10.3.4.3 is:
 [n1 : tm, n2 : tm']
 |> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
      (map n2 V1' :: ML')

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain ctx_extend.
Subgoal 10.3.4.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 [n2 : tm']
 |> subst' (map n2 V1' :: ML')

Subgoal 10.3.4.3 is:
 [n1 : tm, n2 : tm']
 |> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
      (map n2 V1' :: ML')

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst'_extend.
Subgoal 10.3.4.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 {val' V1'}

Subgoal 10.3.4.3 is:
 [n1 : tm, n2 : tm']
 |> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
      (map n2 V1' :: ML')

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H36.
Subgoal 10.3.4.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23,N1 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : {nstep' N1 M'2 V1'}
H43 : {val' V1'}
============================
 {val' V1'}

Subgoal 10.3.4.3 is:
 [n1 : tm, n2 : tm']
 |> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
      (map n2 V1' :: ML')

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search.
Subgoal 10.3.4.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 [n1 : tm, n2 : tm']
 |> subst_equiv_cc (of n1 T1 :: L) (s N23) (map n1 V1 :: ML)
      (map n2 V1' :: ML')

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst_equiv_cc_extend.
Subgoal 10.3.4.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 subst_equiv_cc L (s N23) ML ML'

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst_equiv_cc_closed.
Subgoal 10.3.4.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 le (s N23) (s N3)

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < unfold.
Subgoal 10.3.4.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 exists N, {add (s N23) N (s N3)}

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < exists K1.
Subgoal 10.3.4.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 {add (s N23) K1 (s N3)}

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain add_comm.
Subgoal 10.3.4.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 {add K1 (s N23) (s N3)}

Subgoal 10.3.4.4 is:
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain add_s.
Subgoal 10.3.4.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 [n1 : tm]
 |> app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 10.3.4.5 is:
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain explct_meta_subst_comm with E = R1.
Subgoal 10.3.4.5:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
============================
 [n2 : tm']
 |> app_subst (map n2 V1' :: ML') (R' n2) (R'1 V1')

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain explct_meta_subst'_comm with E = R'1.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert exists V', {eval' (R'1 V1') V'} /\ equiv_cc T (s N) V V'.
Subgoal 10.3.5:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
============================
 exists V', {eval' (R'1 V1') V'} /\ equiv_cc T (s N) V V'

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_nstep.
Subgoal 10.3.5:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
============================
 {add K2 (s N) (s N23)}

Subgoal 10.3 is:
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain add_s.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H43 : exists V', {eval' (R'1 V1') V'} /\ equiv_cc T (s N) V V'
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H43.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
 exists V' N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < exists V'.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
 exists N, {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\
   equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < exists N.
Subgoal 10.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
 {eval' (let' M'2 R'1) V'} /\ {add (s K3) N (s N3)} /\ equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < split.
Subgoal 10.3.6:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
 {eval' (let' M'2 R'1) V'}

Subgoal 10.3.7 is:
 {add (s K3) N (s N3)}

Subgoal 10.3.8 is:
 equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain eval'_let_fwd.
Subgoal 10.3.7:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
 {add (s K3) N (s N3)}

Subgoal 10.3.8 is:
 equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search.
Subgoal 10.3.8:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
 equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert {is_nat N}.
Subgoal 10.3.8.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
============================
 {is_nat N}

Subgoal 10.3.8 is:
 equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain add_arg2_isnat.
Subgoal 10.3.8:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
H46 : {is_nat N}
============================
 equiv_cc T N V V'

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain equiv_cc_closed with K = s N.
Subgoal 10.3.8.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
H46 : {is_nat N}
============================
 {is_sty T}

Subgoal 10.3.8.3 is:
 le N (s N)

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain of_is_sty.
Subgoal 10.3.8.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
H46 : {is_nat N}
============================
 le N (s N)

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < unfold.
Subgoal 10.3.8.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
H46 : {is_nat N}
============================
 exists N1, {add N N1 (s N)}

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < exists s z.
Subgoal 10.3.8.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K1,K2,K3,N,N3,N23 : nat
  M1,M2,V,V1 : tm
  M'1,M'2,V1',V' : tm'
  T,T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat (s N3)}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L (s N3) ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L |- of M1 T1}
H22 : [n1 : tm]
      |> {L, of n1 T1 |- of (R n1) T}
H23 : sim_cc T1 (s N3) M2 M'2
H25 : {nstep (s K3) (let M2 R1) V}
H26 : {val V}
H27 : {add K1 K2 K3}
H28 : {nstep K1 M2 V1}
H29 : {val V1}
H30 : {nstep K2 (R1 V1) V}
H32 : {add K3 N N3}
H33 : {add K2 N N23}
H34 : {add K1 N23 N3}
H36 : {eval' M'2 V1'}
H37 : equiv_cc T1 (s N23) V1 V1'
H38 : {is_sty T1}
H39 : {is_nat N23}
H40 : {tm V1}
H41 : {tm' V1'}
H42 : sim_cc T (s N23) (R1 V1) (R'1 V1')
H44 : {eval' (R'1 V1') V'}
H45 : equiv_cc T (s N) V V'
H46 : {is_nat N}
============================
 {add N (s z) (s N)}

Subgoal 10.4 is:
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain add_comm.
Subgoal 10.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M1,M2 : tm
  M'1,M'2 : tm'
  T : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L, [F] |- of (let M1 R) T}
H22 : member F L
============================
 sim_cc T K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_focus_inv to _ _ H21.
Subgoal 10.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M1,M2 : tm
  M'1,M'2 : tm'
  T1 : ty
  R,R1 : tm -> tm
  R',R'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (let M1 R) (let M2 R1)
H12 : app_subst ML' (let' M'1 R') (let' M'2 R'1)
H13 : {cc Map Vs M1 M'1}*
H14 : [n1 : tm, n2 : tm']
      |> {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H16 : app_subst ML M1 M2
H17 : [n1 : tm]
      |> app_subst ML (R n1) (R1 n1)
H19 : app_subst ML' M'1 M'2
H20 : [n1 : tm']
      |> app_subst ML' (R' n1) (R'1 n1)
H21 : {L, [F] |- of (let M1 R) T1}
H22 : member F L
H23 : name (let M1 R)
============================
 sim_cc T1 K (let M2 R1) (let' M'2 R'1)

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H23.
Subgoal 11:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
============================
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert exists L', prune_ctx FVs L L' /\ {L' |- of (fix R) T}.
Subgoal 11.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
============================
 exists L', prune_ctx FVs L L' /\ {L' |- of (fix R) T}

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain fvars_typing_pres with L = L, Vs = Vs, FVs = FVs.
Subgoal 11:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H17 : exists L', prune_ctx FVs L L' /\ {L' |- of (fix R) T}
============================
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H17.
Subgoal 11:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H19 : {L' |- of (fix R) T}
============================
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert ctx L'.
Subgoal 11.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H19 : {L' |- of (fix R) T}
============================
 ctx L'

Subgoal 11 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain prune_ctx_pres.
Subgoal 11:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H19 : {L' |- of (fix R) T}
H20 : ctx L'
============================
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H19.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
============================
 sim_cc (arr T1 T2) K P P'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert vars_of_ctx L' FVs.
Subgoal 11.3.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
============================
 vars_of_ctx L' FVs

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K P P'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain prune_ctx_vars_of.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
============================
 sim_cc (arr T1 T2) K P P'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply is_sty_str to _ H22.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
============================
 sim_cc (arr T1 T2) K P P'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H24 (keep).
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
============================
 sim_cc (arr T1 T2) K P P'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert exists R1, P = fix R1 /\ (nabla f x, app_subst ML (R f x) (R1 f x)).
Subgoal 11.3.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
============================
 exists R1, P = fix R1 /\ (nabla f x, app_subst ML (R f x) (R1 f x))

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K P P'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain app_subst_fix_comm.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P : tm
  P',E : tm'
  T2,T1 : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H27 : exists R1, P = fix R1 /\ (nabla f x, app_subst ML (R f x) (R1 f x))
============================
 sim_cc (arr T1 T2) K P P'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H27.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P',E : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
============================
 sim_cc (arr T1 T2) K (fix R1) P'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert exists F' E', P' = clos' F' E' /\
  app_subst ML'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
    F' /\
  app_subst ML' E E'.
Subgoal 11.3.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P',E : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
============================
 exists F' E', P' = clos' F' E' /\
   app_subst ML'
     (abs'
        (p\let' (fst' p)
             (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
     F' /\
   app_subst ML' E E'

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) P'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain app_subst'_clos_comm.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  P',E : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H29 : exists F' E', P' = clos' F' E' /\
        app_subst ML'
          (abs'
             (p\let' (fst' p)
                  (g\let' (fst' (snd' p))
                       (y\let' (snd' (snd' p)) (e\R' g y e)))))
          F' /\
        app_subst ML' E E'
============================
 sim_cc (arr T1 T2) K (fix R1) P'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H29.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
============================
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert {tm'
   (abs'
      (p\let' (fst' p)
           (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}.
Subgoal 11.3.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
============================
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}.
Subgoal 11.3.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
============================
 [n3 : tm', n4 : tm', n5 : tm']
 |> {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}

Subgoal 11.3.4 is:
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply reified_env_exists to H20.
Subgoal 11.3.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1,Ty : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
============================
 [n3 : tm', n4 : tm', n5 : tm']
 |> {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}

Subgoal 11.3.4 is:
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}.
Subgoal 11.3.4.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1,Ty : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
============================
 [n3 : tm', n4 : tm', n5 : tm']
 |> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}

Subgoal 11.3.4.1 is:
 [n3 : tm', n4 : tm', n5 : tm']
 |> {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}

Subgoal 11.3.4 is:
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain cc_clos_code_typ_pres with SL = L', R = R, FVs = FVs, Map = NMap, x = n2, f = n1, y = n4, g = n3, e = n5.
Subgoal 11.3.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1,Ty : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
      |> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
============================
 [n3 : tm', n4 : tm', n5 : tm']
 |> {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}

Subgoal 11.3.4 is:
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain of'_to_tm' with T = T2, L = of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil, Vs = n4 :: n3 :: n5 :: nil.
Subgoal 11.3.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1,Ty : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
      |> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
============================
 [n3 : tm', n4 : tm', n5 : tm']
 |> ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.3.4 is:
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply sty_to_cty to H25.
Subgoal 11.3.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1,Ty : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
      |> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H34 : {is_cty T1}
============================
 [n3 : tm', n4 : tm', n5 : tm']
 |> ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.3.4 is:
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply sty_to_cty to H26.
Subgoal 11.3.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1,Ty : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
      |> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H34 : {is_cty T1}
H35 : {is_cty T2}
============================
 [n3 : tm', n4 : tm', n5 : tm']
 |> ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.3.4 is:
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply reified_env_sty to _ H32.
Subgoal 11.3.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1,Ty : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
      |> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H34 : {is_cty T1}
H35 : {is_cty T2}
H36 : {is_sty Ty}
============================
 [n3 : tm', n4 : tm', n5 : tm']
 |> ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.3.4 is:
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply sty_to_cty to H36.
Subgoal 11.3.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1,Ty : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : reified_env L' Ty
H33 : [n3 : tm', n4 : tm', n5 : tm']
      |> {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H34 : {is_cty T1}
H35 : {is_cty T2}
H36 : {is_sty Ty}
H37 : {is_cty Ty}
============================
 [n3 : tm', n4 : tm', n5 : tm']
 |> ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.3.4 is:
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search.
Subgoal 11.3.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : [n3 : tm', n4 : tm', n5 : tm']
      |> {tm' n5, tm' n3, tm' n4 |- tm' (R' n3 n4 n5)}
============================
 {tm'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))}

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search 7.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
============================
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert abs'
  (p\let' (fst' p)
       (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))) =
F'.
Subgoal 11.3.5:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
============================
 abs'
   (p\let' (fst' p)
        (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))) =
 F'

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst'_closed_tm_eq.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,F',E' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos' F' E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        F'
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H33 : abs'
        (p\let' (fst' p)
             (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))) =
      F'
============================
 sim_cc (arr T1 T2) K (fix R1) (clos' F' E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H33.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
============================
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'.
Subgoal 11.3.6:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
============================
 exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain mapenv_sem_pres.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H34 : exists VE', {eval' E' VE'} /\ subst_env_equiv_cc L' K ML VE'
============================
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H34.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert equiv_cc (arr T1 T2) K (fix R1)
  (clos'
     (abs'
        (p\let' (fst' p)
             (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
     VE').
Subgoal 11.3.7:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert equiv_cc_arr (arr T1 T2) K (fix R1)
  (clos'
     (abs'
        (p\let' (fst' p)
             (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
     VE').
Subgoal 11.3.7.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
 equiv_cc_arr (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < unfold.
Subgoal 11.3.7.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
 {val' VE'}

Subgoal 11.3.7.1.2 is:
 {tm (fix R1)}

Subgoal 11.3.7.1.3 is:
 {tm'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.7.1.4 is:
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H35.
Subgoal 11.3.7.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,N : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : {nstep' N E' VE'}
H38 : {val' VE'}
============================
 {val' VE'}

Subgoal 11.3.7.1.2 is:
 {tm (fix R1)}

Subgoal 11.3.7.1.3 is:
 {tm'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.7.1.4 is:
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search.
Subgoal 11.3.7.1.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
 {tm (fix R1)}

Subgoal 11.3.7.1.3 is:
 {tm'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.7.1.4 is:
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_to_tm_ctx to H2 H6.
Subgoal 11.3.7.1.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L',SL : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : tm_ctx SL
H38 : vars_of_tm_ctx SL Vs
============================
 {tm (fix R1)}

Subgoal 11.3.7.1.3 is:
 {tm'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.7.1.4 is:
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply of_to_tm to _ _ _ _ H9.
Subgoal 11.3.7.1.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L',SL : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : tm_ctx SL
H38 : vars_of_tm_ctx SL Vs
H39 : {SL |- tm (fix R)}
============================
 {tm (fix R1)}

Subgoal 11.3.7.1.3 is:
 {tm'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.7.1.4 is:
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply subst_equiv_cc_vars_in_subst to H5 _.
Subgoal 11.3.7.1.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L',SL : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : tm_ctx SL
H38 : vars_of_tm_ctx SL Vs
H39 : {SL |- tm (fix R)}
H40 : vars_in_subst Vs ML
============================
 {tm (fix R1)}

Subgoal 11.3.7.1.3 is:
 {tm'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.7.1.4 is:
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply subst_result_closed_tm_alt to _ _ H39 _ H40 H11.
Subgoal 11.3.7.1.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L',SL : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : tm_ctx SL
H38 : vars_of_tm_ctx SL Vs
H39 : {SL |- tm (fix R)}
H40 : vars_in_subst Vs ML
H41 : {tm (fix R1)}
============================
 {tm (fix R1)}

Subgoal 11.3.7.1.3 is:
 {tm'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.7.1.4 is:
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search.
Subgoal 11.3.7.1.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
 {tm'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.7.1.4 is:
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert {tm' VE'}.
Subgoal 11.3.7.1.3.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
 {tm' VE'}

Subgoal 11.3.7.1.3 is:
 {tm'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.7.1.4 is:
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst_env_equiv_cc_tm' with L = L'.
Subgoal 11.3.7.1.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : {tm' VE'}
============================
 {tm'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.7.1.4 is:
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search.
Subgoal 11.3.7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
============================
 forall J V1 V1' V2 V2', lt J K -> equiv_cc T1 J V1 V1' ->
   equiv_cc (arr T1 T2) J V2 V2' ->
   sim_cc T2 J (R1 V2 V1)
     (let' (fst' (pair' V2' (pair' V1' VE')))
        (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
             (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < intros.
Subgoal 11.3.7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
============================
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert {is_nat J}.
Subgoal 11.3.7.1.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
============================
 {is_nat J}

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H37.
Subgoal 11.3.7.1.4.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J,N : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {add J (s N) K}
============================
 {is_nat J}

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain add_arg1_isnat.
Subgoal 11.3.7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
============================
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply equiv_cc_tm to _ _ H38.
Subgoal 11.3.7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
============================
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply equiv_cc_tm' to _ _ H38.
Subgoal 11.3.7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
============================
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply equiv_cc_tm to _ _ H39.
Subgoal 11.3.7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
============================
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply equiv_cc_tm' to _ _ H39.
Subgoal 11.3.7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE').
Subgoal 11.3.7.1.4.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain IH with L = of n2 T1 :: of n1 (arr T1 T2) :: L', M = R n1 n2, M' = R' n3 n4 n5, Vs = n2 :: n1 :: FVs, Vs' = n4 :: n3 :: n5 :: nil, Map = map n2 n4 :: map n1 n3 :: NMap n5, ML = map n2 V1 :: map n1 V2 :: ML, ML' = map n4 V1' :: map n3 V2' :: map n5 VE' :: nil.
Subgoal 11.3.7.1.4.2.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n1 : tm, n2 : tm]
 |> ctx (of n2 T1 :: of n1 (arr T1 T2) :: L')

Subgoal 11.3.7.1.4.2.2 is:
 [n1 : tm, n2 : tm]
 |> subst (map n2 V1 :: map n1 V2 :: ML)

Subgoal 11.3.7.1.4.2.3 is:
 [n3 : tm', n4 : tm', n5 : tm']
 |> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain ctx_extend.
Subgoal 11.3.7.1.4.2.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n1 : tm]
 |> ctx (of n1 (arr T1 T2) :: L')

Subgoal 11.3.7.1.4.2.2 is:
 [n1 : tm, n2 : tm]
 |> subst (map n2 V1 :: map n1 V2 :: ML)

Subgoal 11.3.7.1.4.2.3 is:
 [n3 : tm', n4 : tm', n5 : tm']
 |> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain ctx_extend.
Subgoal 11.3.7.1.4.2.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n1 : tm, n2 : tm]
 |> subst (map n2 V1 :: map n1 V2 :: ML)

Subgoal 11.3.7.1.4.2.3 is:
 [n3 : tm', n4 : tm', n5 : tm']
 |> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst_extend.
Subgoal 11.3.7.1.4.2.2.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n1 : tm]
 |> subst (map n1 V2 :: ML)

Subgoal 11.3.7.1.4.2.2.2 is:
 {val V1}

Subgoal 11.3.7.1.4.2.3 is:
 [n3 : tm', n4 : tm', n5 : tm']
 |> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst_extend.
Subgoal 11.3.7.1.4.2.2.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 {val V2}

Subgoal 11.3.7.1.4.2.2.2 is:
 {val V1}

Subgoal 11.3.7.1.4.2.3 is:
 [n3 : tm', n4 : tm', n5 : tm']
 |> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain equiv_cc_val with T = arr T1 T2, K = J.
Subgoal 11.3.7.1.4.2.2.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 {val V1}

Subgoal 11.3.7.1.4.2.3 is:
 [n3 : tm', n4 : tm', n5 : tm']
 |> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain equiv_cc_val with T = T1, K = J.
Subgoal 11.3.7.1.4.2.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n3 : tm', n4 : tm', n5 : tm']
 |> subst' (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst'_extend.
Subgoal 11.3.7.1.4.2.3.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n3 : tm', n5 : tm']
 |> subst' (map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.3.2 is:
 {val' V1'}

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst'_extend.
Subgoal 11.3.7.1.4.2.3.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n5 : tm']
 |> subst' (map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.3.1.2 is:
 {val' V2'}

Subgoal 11.3.7.1.4.2.3.2 is:
 {val' V1'}

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst'_extend.
Subgoal 11.3.7.1.4.2.3.1.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 {tm' VE'}

Subgoal 11.3.7.1.4.2.3.1.1.2 is:
 {val' VE'}

Subgoal 11.3.7.1.4.2.3.1.2 is:
 {val' V2'}

Subgoal 11.3.7.1.4.2.3.2 is:
 {val' V1'}

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H35.
Subgoal 11.3.7.1.4.2.3.1.1.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J,N : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : {nstep' N E' VE'}
H46 : {val' VE'}
============================
 {tm' VE'}

Subgoal 11.3.7.1.4.2.3.1.1.2 is:
 {val' VE'}

Subgoal 11.3.7.1.4.2.3.1.2 is:
 {val' V2'}

Subgoal 11.3.7.1.4.2.3.2 is:
 {val' V1'}

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst_env_equiv_cc_tm' with L = L'.
Subgoal 11.3.7.1.4.2.3.1.1.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 {val' VE'}

Subgoal 11.3.7.1.4.2.3.1.2 is:
 {val' V2'}

Subgoal 11.3.7.1.4.2.3.2 is:
 {val' V1'}

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst_env_equiv_cc_val' with L = L'.
Subgoal 11.3.7.1.4.2.3.1.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 {val' V2'}

Subgoal 11.3.7.1.4.2.3.2 is:
 {val' V1'}

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain equiv_cc_val' with T = arr T1 T2, K = J.
Subgoal 11.3.7.1.4.2.3.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 {val' V1'}

Subgoal 11.3.7.1.4.2.4 is:
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain equiv_cc_val' with T = T1, K = J.
Subgoal 11.3.7.1.4.2.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
 |> subst_equiv_cc (of n2 T1 :: of n1 (arr T1 T2) :: L') J
      (map n2 V1 :: map n1 V2 :: ML)
      (map n4 V1' :: map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst_equiv_cc_extend.
Subgoal 11.3.7.1.4.2.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n1 : tm, n3 : tm', n5 : tm']
 |> subst_equiv_cc (of n1 (arr T1 T2) :: L') J (map n1 V2 :: ML)
      (map n3 V2' :: map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst_equiv_cc_extend.
Subgoal 11.3.7.1.4.2.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n5 : tm']
 |> subst_equiv_cc L' J ML (map n5 VE' :: nil)

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < unfold.
Subgoal 11.3.7.1.4.2.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 subst_env_equiv_cc L' J ML VE'

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain subst_env_equiv_cc_closed.
Subgoal 11.3.7.1.4.2.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 le J K

Subgoal 11.3.7.1.4.2.5 is:
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain lt_to_le.
Subgoal 11.3.7.1.4.2.5:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n1 : tm, n2 : tm]
 |> app_subst (map n2 V1 :: map n1 V2 :: ML) (R n1 n2) (R1 V2 V1)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain explct_meta_subst_comm with E = R1 V2.
Subgoal 11.3.7.1.4.2.5:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
============================
 [n1 : tm, n2 : tm]
 |> app_subst (map n1 V2 :: ML) (R n1 n2) (R1 V2 n2)

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain explct_meta_subst_comm with E = x\R1 x n2.
Subgoal 11.3.7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
============================
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < assert exists N, {nstep' N
             (let' (fst' (pair' V2' (pair' V1' VE')))
                (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
                     (y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
                          (e\R' g y e))))
             (R' V2' V1' VE')}.
Subgoal 11.3.7.1.4.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
============================
 exists N, {nstep' N
              (let' (fst' (pair' V2' (pair' V1' VE')))
                 (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
                      (y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
                           (e\R' g y e))))
              (R' V2' V1' VE')}

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply equiv_cc_val' to _ _ H38.
Subgoal 11.3.7.1.4.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
H46 : {val' V1'}
============================
 exists N, {nstep' N
              (let' (fst' (pair' V2' (pair' V1' VE')))
                 (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
                      (y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
                           (e\R' g y e))))
              (R' V2' V1' VE')}

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply equiv_cc_val' to _ _ H39.
Subgoal 11.3.7.1.4.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
H46 : {val' V1'}
H47 : {val' V2'}
============================
 exists N, {nstep' N
              (let' (fst' (pair' V2' (pair' V1' VE')))
                 (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
                      (y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
                           (e\R' g y e))))
              (R' V2' V1' VE')}

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply subst_env_equiv_cc_val' to _ _ H36.
Subgoal 11.3.7.1.4.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
H46 : {val' V1'}
H47 : {val' V2'}
H48 : {val' VE'}
============================
 exists N, {nstep' N
              (let' (fst' (pair' V2' (pair' V1' VE')))
                 (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
                      (y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
                           (e\R' g y e))))
              (R' V2' V1' VE')}

Subgoal 11.3.7.1.4 is:
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search 11.
Subgoal 11.3.7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
H46 : exists N, {nstep' N
                   (let' (fst' (pair' V2' (pair' V1' VE')))
                      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
                           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
                                (e\R' g y e))))
                   (R' V2' V1' VE')}
============================
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H46.
Subgoal 11.3.7.1.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J,N : nat
  V1,V2 : tm
  E,E',VE',V1',V2' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : lt J K
H38 : equiv_cc T1 J V1 V1'
H39 : equiv_cc (arr T1 T2) J V2 V2'
H40 : {is_nat J}
H41 : {tm V1}
H42 : {tm' V1'}
H43 : {tm V2}
H44 : {tm' V2'}
H45 : sim_cc T2 J (R1 V2 V1) (R' V2' V1' VE')
H47 : {nstep' N
         (let' (fst' (pair' V2' (pair' V1' VE')))
            (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
                 (y\let' (snd' (snd' (pair' V2' (pair' V1' VE'))))
                      (e\R' g y e))))
         (R' V2' V1' VE')}
============================
 sim_cc T2 J (R1 V2 V1)
   (let' (fst' (pair' V2' (pair' V1' VE')))
      (g\let' (fst' (snd' (pair' V2' (pair' V1' VE'))))
           (y\let' (snd' (snd' (pair' V2' (pair' V1' VE')))) (e\R' g y e))))

Subgoal 11.3.7 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain sim_cc_closed_nstep' with N = N, M' = R' V2' V1' VE'.
Subgoal 11.3.7:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc_arr (arr T1 T2) K (fix R1)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           VE')
============================
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.3 is:
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain equiv_cc_arr_to_equiv_cc.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           VE')
============================
 sim_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      E')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < unfold.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           VE')
============================
 forall J V, le J K -> {nstep J (fix R1) V} -> {val V} ->
   (exists V' N, {eval'
                    (clos'
                       (abs'
                          (p\let' (fst' p)
                               (g\let' (fst' (snd' p))
                                    (y\let' (snd' (snd' p)) (e\R' g y e)))))
                       E')
                    V'} /\
        {add J N K} /\ equiv_cc (arr T1 T2) N V V')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < intros.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K,J : nat
  V : tm
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           VE')
H38 : le J K
H39 : {nstep J (fix R1) V}
H40 : {val V}
============================
 exists V' N, {eval'
                 (clos'
                    (abs'
                       (p\let' (fst' p)
                            (g\let' (fst' (snd' p))
                                 (y\let' (snd' (snd' p)) (e\R' g y e)))))
                    E')
                 V'} /\
   {add J N K} /\ equiv_cc (arr T1 T2) N V V'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply nstep_val_inv to _ H39.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
 exists V' N, {eval'
                 (clos'
                    (abs'
                       (p\let' (fst' p)
                            (g\let' (fst' (snd' p))
                                 (y\let' (snd' (snd' p)) (e\R' g y e)))))
                    E')
                 V'} /\
   {add z N K} /\ equiv_cc (arr T1 T2) N (fix R1) V'

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < exists clos'
  (abs'
     (p\let' (fst' p)
          (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
  VE'.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
 exists N, {eval'
              (clos'
                 (abs'
                    (p\let' (fst' p)
                         (g\let' (fst' (snd' p))
                              (y\let' (snd' (snd' p)) (e\R' g y e)))))
                 E')
              (clos'
                 (abs'
                    (p\let' (fst' p)
                         (g\let' (fst' (snd' p))
                              (y\let' (snd' (snd' p)) (e\R' g y e)))))
                 VE')} /\
   {add z N K} /\
   equiv_cc (arr T1 T2) N (fix R1)
     (clos'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        VE')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < exists K.
Subgoal 11.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
 {eval'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       E')
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')} /\
   {add z K K} /\
   equiv_cc (arr T1 T2) K (fix R1)
     (clos'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        VE')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < split.
Subgoal 11.3.8:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
 {eval'
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       E')
    (clos'
       (abs'
          (p\let' (fst' p)
               (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
       VE')}

Subgoal 11.3.9 is:
 {add z K K}

Subgoal 11.3.10 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain eval'_clos_fwd.
Subgoal 11.3.9:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
 {add z K K}

Subgoal 11.3.10 is:
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search.
Subgoal 11.3.10:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  E,E',VE' : tm'
  T2,T1 : ty
  R,R1 : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) (arr T1 T2)}
H11 : app_subst ML (fix R) (fix R1)
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E')
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : [n1 : tm, n2 : tm]
      |> {L', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H22 : {L' |- is_sty (arr T1 T2)}
H23 : vars_of_ctx L' FVs
H24 : {is_sty (arr T1 T2)}
H25 : {is_sty T1}
H26 : {is_sty T2}
H28 : [n1 : tm, n2 : tm]
      |> app_subst ML (R n1 n2) (R1 n1 n2)
H30 : app_subst ML'
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
        (abs'
           (p\let' (fst' p)
                (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
H31 : app_subst ML' E E'
H32 : {tm'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))}
H35 : {eval' E' VE'}
H36 : subst_env_equiv_cc L' K ML VE'
H37 : equiv_cc (arr T1 T2) K (fix R1)
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           VE')
H38 : le z K
H39 : {nstep z (fix R1) (fix R1)}
H40 : {val (fix R1)}
============================
 equiv_cc (arr T1 T2) K (fix R1)
   (clos'
      (abs'
         (p\let' (fst' p)
              (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
      VE')

Subgoal 11.4 is:
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < search.
Subgoal 11.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  F : o
  P : tm
  P',E : tm'
  T : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {L', [F] |- of (fix R) T}
H22 : member F L'
============================
 sim_cc T K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < apply ctx_focus_inv to _ _ H21.
Subgoal 11.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L,L' : list o
  Vs,FVs : list tm
  Vs' : list tm'
  K : nat
  F : o
  P : tm
  P',E : tm'
  T1 : ty
  R : tm -> tm -> tm
  NMap : tm' -> (list (map tm tm'))
  R' : tm' -> tm' -> tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (fix R) T1}
H11 : app_subst ML (fix R) P
H12 : app_subst ML'
        (clos'
           (abs'
              (p\let' (fst' p)
                   (g\let' (fst' (snd' p))
                        (y\let' (snd' (snd' p)) (e\R' g y e)))))
           E)
        P'
H13 : {fvars (fix R) Vs FVs}*
H14 : {mapenv FVs Map E}*
H15 : {mapvar FVs NMap}*
H16 : [n1 : tm, n2 : tm, n3 : tm', n4 : tm', n5 : tm']
      |> {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
            (R' n3 n4 n5)}*
H18 : prune_ctx FVs L L'
H20 : ctx L'
H21 : {L', [F] |- of (fix R) T1}
H22 : member F L'
H23 : name (fix R)
============================
 sim_cc T1 K P P'

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < case H23.
Subgoal 12:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M2,M1 : tm
  P',M2',M1' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) P
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
============================
 sim_cc T K P P'

cc_sem_pres < assert exists M3 M4, P = app M3 M4 /\ app_subst ML M1 M3 /\ app_subst ML M2 M4.
Subgoal 12.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M2,M1 : tm
  P',M2',M1' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) P
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
============================
 exists M3 M4, P = app M3 M4 /\ app_subst ML M1 M3 /\ app_subst ML M2 M4

Subgoal 12 is:
 sim_cc T K P P'

cc_sem_pres < backchain app_subst_app_comm.
Subgoal 12:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M2,M1 : tm
  P',M2',M1' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) P
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H15 : exists M3 M4, P = app M3 M4 /\ app_subst ML M1 M3 /\ app_subst ML M2 M4
============================
 sim_cc T K P P'

cc_sem_pres < case H15.
Subgoal 12:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  P',M2',M1' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
============================
 sim_cc T K (app M3 M4) P'

cc_sem_pres < assert exists M3' M4', P' =
let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
  app_subst ML' M1' M3' /\ app_subst ML' M2' M4'.
Subgoal 12.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  P',M2',M1' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
============================
 exists M3' M4', P' =
 let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
   app_subst ML' M1' M3' /\ app_subst ML' M2' M4'

Subgoal 12 is:
 sim_cc T K (app M3 M4) P'

cc_sem_pres < apply app_subst'_let_comm to H12.
Subgoal 12.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M5 : tm'
  T : ty
  R1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M5 R1)
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : app_subst ML' M1' M5
H19 : [n1 : tm']
      |> app_subst ML' (open' n1 (f\e\app' f (pair' n1 (pair' M2' e))))
           (R1 n1)
============================
 exists M3' M4', let' M5 R1 =
 let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
   app_subst ML' M1' M3' /\ app_subst ML' M2' M4'

Subgoal 12 is:
 sim_cc T K (app M3 M4) P'

cc_sem_pres < apply app_subst'_open_comm to H19.
Subgoal 12.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M5 : tm'
  T : ty
  M1'1,M2'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M5
           (z1\open' (M1'1 z1)
                 (f\e\app' f (pair' (M1'1 z1) (pair' (M2'1 z1) e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : app_subst ML' M1' M5
H19 : [n1 : tm']
      |> app_subst ML' (open' n1 (f\e\app' f (pair' n1 (pair' M2' e))))
           (open' (M1'1 n1)
              (f\e\app' f (pair' (M1'1 n1) (pair' (M2'1 n1) e))))
H20 : [n1 : tm']
      |> app_subst ML' n1 (M1'1 n1)
H21 : [n1 : tm']
      |> app_subst ML' M2' (M2'1 n1)
============================
 exists M3' M4', let' M5
                   (z1\open' (M1'1 z1)
                         (f\e\app' f (pair' (M1'1 z1) (pair' (M2'1 z1) e)))) =
 let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
   app_subst ML' M1' M3' /\ app_subst ML' M2' M4'

Subgoal 12 is:
 sim_cc T K (app M3 M4) P'

cc_sem_pres < apply app_subst_prune to H21.
Subgoal 12.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M5,M'' : tm'
  T : ty
  M1'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M5
           (z1\open' (M1'1 z1) (f\e\app' f (pair' (M1'1 z1) (pair' M'' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : app_subst ML' M1' M5
H19 : [n1 : tm']
      |> app_subst ML' (open' n1 (f\e\app' f (pair' n1 (pair' M2' e))))
           (open' (M1'1 n1) (f\e\app' f (pair' (M1'1 n1) (pair' M'' e))))
H20 : [n1 : tm']
      |> app_subst ML' n1 (M1'1 n1)
H21 : app_subst ML' M2' M''
============================
 exists M3' M4', let' M5
                   (z1\open' (M1'1 z1)
                         (f\e\app' f (pair' (M1'1 z1) (pair' M'' e)))) =
 let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
   app_subst ML' M1' M3' /\ app_subst ML' M2' M4'

Subgoal 12 is:
 sim_cc T K (app M3 M4) P'

cc_sem_pres < apply subst'_nabla to H4 with x = n1.
Subgoal 12.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M5,M'' : tm'
  T : ty
  M1'1 : tm' -> tm'
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M5
           (z1\open' (M1'1 z1) (f\e\app' f (pair' (M1'1 z1) (pair' M'' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : app_subst ML' M1' M5
H19 : [n1 : tm']
      |> app_subst ML' (open' n1 (f\e\app' f (pair' n1 (pair' M2' e))))
           (open' (M1'1 n1) (f\e\app' f (pair' (M1'1 n1) (pair' M'' e))))
H20 : [n1 : tm']
      |> app_subst ML' n1 (M1'1 n1)
H21 : app_subst ML' M2' M''
H22 : [n1 : tm']
      |> app_subst ML' n1 n1
============================
 exists M3' M4', let' M5
                   (z1\open' (M1'1 z1)
                         (f\e\app' f (pair' (M1'1 z1) (pair' M'' e)))) =
 let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
   app_subst ML' M1' M3' /\ app_subst ML' M2' M4'

Subgoal 12 is:
 sim_cc T K (app M3 M4) P'

cc_sem_pres < apply app_subst_det to H20 H22.
Subgoal 12.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M5,M'' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M5 (z1\open' z1 (f\e\app' f (pair' z1 (pair' M'' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : app_subst ML' M1' M5
H19 : [n1 : tm']
      |> app_subst ML' (open' n1 (f\e\app' f (pair' n1 (pair' M2' e))))
           (open' n1 (f\e\app' f (pair' n1 (pair' M'' e))))
H20 : [n1 : tm']
      |> app_subst ML' n1 n1
H21 : app_subst ML' M2' M''
H22 : [n1 : tm']
      |> app_subst ML' n1 n1
============================
 exists M3' M4', let' M5 (z1\open' z1 (f\e\app' f (pair' z1 (pair' M'' e)))) =
 let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
   app_subst ML' M1' M3' /\ app_subst ML' M2' M4'

Subgoal 12 is:
 sim_cc T K (app M3 M4) P'

cc_sem_pres < search.
Subgoal 12:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  P',M2',M1' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) P'
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H18 : exists M3' M4', P' =
      let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))) /\
        app_subst ML' M1' M3' /\ app_subst ML' M2' M4'
============================
 sim_cc T K (app M3 M4) P'

cc_sem_pres < case H18.
Subgoal 12:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M3',M4' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H9 : {L |- of (app M1 M2) T}
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
============================
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

cc_sem_pres < case H9.
Subgoal 12.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M3',M4' : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
============================
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

Subgoal 12.4 is:
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

cc_sem_pres < assert sim_cc (arr T1 T) K M3 M3'.
Subgoal 12.3.1:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M3',M4' : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
============================
 sim_cc (arr T1 T) K M3 M3'

Subgoal 12.3 is:
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

Subgoal 12.4 is:
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

cc_sem_pres < backchain IH.
Subgoal 12.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M3',M4' : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
H23 : sim_cc (arr T1 T) K M3 M3'
============================
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

Subgoal 12.4 is:
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

cc_sem_pres < assert sim_cc T1 K M4 M4'.
Subgoal 12.3.2:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M3',M4' : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
H23 : sim_cc (arr T1 T) K M3 M3'
============================
 sim_cc T1 K M4 M4'

Subgoal 12.3 is:
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

Subgoal 12.4 is:
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

cc_sem_pres < backchain IH.
Subgoal 12.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M3',M4' : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
H23 : sim_cc (arr T1 T) K M3 M3'
H24 : sim_cc T1 K M4 M4'
============================
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

Subgoal 12.4 is:
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

cc_sem_pres < apply of_is_sty to _ H21.
Subgoal 12.3:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  M2,M1,M3,M4 : tm
  M2',M1',M3',M4' : tm'
  T,T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L |- of M1 (arr T1 T)}
H22 : {L |- of M2 T1}
H23 : sim_cc (arr T1 T) K M3 M3'
H24 : sim_cc T1 K M4 M4'
H25 : {is_sty (arr T1 T)}
============================
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

Subgoal 12.4 is:
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

cc_sem_pres < backchain sim_cc_app.
Subgoal 12.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M2,M1,M3,M4 : tm
  M2',M1',M3',M4' : tm'
  T : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L, [F] |- of (app M1 M2) T}
H22 : member F L
============================
 sim_cc T K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

cc_sem_pres < apply ctx_focus_inv to _ _ H21.
Subgoal 12.4:

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  F : o
  M2,M1,M3,M4 : tm
  M2',M1',M3',M4' : tm'
  T1 : ty
IH : forall L ML ML' K Vs Vs' Map T P P' M M', {is_nat K} -> ctx L ->
       subst ML -> subst' ML' -> subst_equiv_cc L K ML ML' ->
       vars_of_ctx L Vs -> vars_of_subst' ML' Vs' -> to_mapping Vs Vs' Map ->
       {L |- of M T} -> {cc Map Vs M M'}* -> app_subst ML M P ->
       app_subst ML' M' P' -> sim_cc T K P P'
H1 : {is_nat K}
H2 : ctx L
H3 : subst ML
H4 : subst' ML'
H5 : subst_equiv_cc L K ML ML'
H6 : vars_of_ctx L Vs
H7 : vars_of_subst' ML' Vs'
H8 : to_mapping Vs Vs' Map
H11 : app_subst ML (app M1 M2) (app M3 M4)
H12 : app_subst ML'
        (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e)))))
        (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))
H13 : {cc Map Vs M1 M1'}*
H14 : {cc Map Vs M2 M2'}*
H16 : app_subst ML M1 M3
H17 : app_subst ML M2 M4
H19 : app_subst ML' M1' M3'
H20 : app_subst ML' M2' M4'
H21 : {L, [F] |- of (app M1 M2) T1}
H22 : member F L
H23 : name (app M1 M2)
============================
 sim_cc T1 K (app M3 M4)
   (let' M3' (g\open' g (f\e\app' f (pair' g (pair' M4' e)))))

cc_sem_pres < case H23.
Proof completed.
Abella < Define sim_cc' : ty -> tm -> tm' -> prop by 
sim_cc' T M M' := forall K, {is_nat K} -> sim_cc T K M M'.

Abella < Define equiv_cc' : ty -> tm -> tm' -> prop by 
equiv_cc' T M M' := forall K, {is_nat K} -> equiv_cc T K M M'.

Abella < Define subst_equiv_cc' : (list o) -> (list (map tm tm)) -> (list (map tm' tm')) -> prop by 
subst_equiv_cc' L ML ML' := forall K, {is_nat K} -> subst_equiv_cc L K ML ML'.

Abella < Theorem cc_sem_pres' : 
forall L ML ML' Vs Vs' Map T P P' M M', ctx L -> subst ML -> subst' ML' ->
  subst_equiv_cc' L ML ML' -> vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
  to_mapping Vs Vs' Map -> {L |- of M T} -> {cc Map Vs M M'} ->
  app_subst ML M P -> app_subst ML' M' P' -> sim_cc' T P P'.


============================
 forall L ML ML' Vs Vs' Map T P P' M M', ctx L -> subst ML -> subst' ML' ->
   subst_equiv_cc' L ML ML' -> vars_of_ctx L Vs -> vars_of_subst' ML' Vs' ->
   to_mapping Vs Vs' Map -> {L |- of M T} -> {cc Map Vs M M'} ->
   app_subst ML M P -> app_subst ML' M' P' -> sim_cc' T P P'

cc_sem_pres' < intros.

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  P,M : tm
  P',M' : tm'
  T : ty
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv_cc' L ML ML'
H5 : vars_of_ctx L Vs
H6 : vars_of_subst' ML' Vs'
H7 : to_mapping Vs Vs' Map
H8 : {L |- of M T}
H9 : {cc Map Vs M M'}
H10 : app_subst ML M P
H11 : app_subst ML' M' P'
============================
 sim_cc' T P P'

cc_sem_pres' < unfold.

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  P,M : tm
  P',M' : tm'
  T : ty
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv_cc' L ML ML'
H5 : vars_of_ctx L Vs
H6 : vars_of_subst' ML' Vs'
H7 : to_mapping Vs Vs' Map
H8 : {L |- of M T}
H9 : {cc Map Vs M M'}
H10 : app_subst ML M P
H11 : app_subst ML' M' P'
============================
 forall K, {is_nat K} -> sim_cc T K P P'

cc_sem_pres' < intros.

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M' : tm'
  T : ty
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv_cc' L ML ML'
H5 : vars_of_ctx L Vs
H6 : vars_of_subst' ML' Vs'
H7 : to_mapping Vs Vs' Map
H8 : {L |- of M T}
H9 : {cc Map Vs M M'}
H10 : app_subst ML M P
H11 : app_subst ML' M' P'
H12 : {is_nat K}
============================
 sim_cc T K P P'

cc_sem_pres' < backchain cc_sem_pres.

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M' : tm'
  T : ty
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H4 : subst_equiv_cc' L ML ML'
H5 : vars_of_ctx L Vs
H6 : vars_of_subst' ML' Vs'
H7 : to_mapping Vs Vs' Map
H8 : {L |- of M T}
H9 : {cc Map Vs M M'}
H10 : app_subst ML M P
H11 : app_subst ML' M' P'
H12 : {is_nat K}
============================
 subst_equiv_cc L K ML ML'

cc_sem_pres' < case H4.

Variables: 
  ML : list (map tm tm)
  Map : list (map tm tm')
  ML' : list (map tm' tm')
  L : list o
  Vs : list tm
  Vs' : list tm'
  K : nat
  P,M : tm
  P',M' : tm'
  T : ty
H1 : ctx L
H2 : subst ML
H3 : subst' ML'
H5 : vars_of_ctx L Vs
H6 : vars_of_subst' ML' Vs'
H7 : to_mapping Vs Vs' Map
H8 : {L |- of M T}
H9 : {cc Map Vs M M'}
H10 : app_subst ML M P
H11 : app_subst ML' M' P'
H12 : {is_nat K}
H13 : forall K, {is_nat K} -> subst_equiv_cc L K ML ML'
============================
 subst_equiv_cc L K ML ML'

cc_sem_pres' < backchain H13.
Proof completed.
Abella < Theorem cc_nat_sem_pres : 
forall M M' N, {of M tnat} -> {cc' M M'} -> {eval M (nat N)} ->
  {eval' M' (nat' N)}.


============================
 forall M M' N, {of M tnat} -> {cc' M M'} -> {eval M (nat N)} ->
   {eval' M' (nat' N)}

cc_nat_sem_pres < intros.

Variables: 
  N : nat
  M : tm
  M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H3 : {eval M (nat N)}
============================
 {eval' M' (nat' N)}

cc_nat_sem_pres < case H3.

Variables: 
  N,N1 : nat
  M : tm
  M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
============================
 {eval' M' (nat' N)}

cc_nat_sem_pres < apply nstep_is_nat to H4.

Variables: 
  N,N1 : nat
  M : tm
  M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
============================
 {eval' M' (nat' N)}

cc_nat_sem_pres < assert sim_cc tnat N1 M M'.
Subgoal 1:

Variables: 
  N,N1 : nat
  M : tm
  M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
============================
 sim_cc tnat N1 M M'

Subgoal is:
 {eval' M' (nat' N)}

cc_nat_sem_pres < backchain cc_sem_pres with L = nil, ML = nil, ML' = map n1 unit' :: nil, Vs = nil, Vs' = n1 :: nil, Map = nil, M = M, M' = M'.
Subgoal 1:

Variables: 
  N,N1 : nat
  M : tm
  M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
============================
 {cc nil nil M M'}

Subgoal is:
 {eval' M' (nat' N)}

cc_nat_sem_pres < case H2.
Subgoal 1:

Variables: 
  N,N1 : nat
  M : tm
  M' : tm'
H1 : {of M tnat}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H7 : {cc nil nil M M'}
============================
 {cc nil nil M M'}

Subgoal is:
 {eval' M' (nat' N)}

cc_nat_sem_pres < search.

Variables: 
  N,N1 : nat
  M : tm
  M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H7 : sim_cc tnat N1 M M'
============================
 {eval' M' (nat' N)}

cc_nat_sem_pres < case H7.

Variables: 
  N,N1 : nat
  M : tm
  M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H8 : forall J V, le J N1 -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N N1} /\ equiv_cc tnat N V V')
============================
 {eval' M' (nat' N)}

cc_nat_sem_pres < apply H8 to _ H4 H5 with J = N1.
Subgoal 2:

Variables: 
  N,N1 : nat
  M : tm
  M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H8 : forall J V, le J N1 -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N N1} /\ equiv_cc tnat N V V')
============================
 le N1 N1

Subgoal is:
 {eval' M' (nat' N)}

cc_nat_sem_pres < backchain le_refl.

Variables: 
  N,N1,N2 : nat
  M : tm
  M',V' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H8 : forall J V, le J N1 -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N N1} /\ equiv_cc tnat N V V')
H9 : {eval' M' V'}
H10 : {add N1 N2 N1}
H11 : equiv_cc tnat N2 (nat N) V'
============================
 {eval' M' (nat' N)}

cc_nat_sem_pres < case H11.

Variables: 
  N,N1,N2 : nat
  M : tm
  M' : tm'
H1 : {of M tnat}
H2 : {cc' M M'}
H4 : {nstep N1 M (nat N)}
H5 : {val (nat N)}
H6 : {is_nat N1}
H8 : forall J V, le J N1 -> {nstep J M V} -> {val V} ->
       (exists V' N, {eval' M' V'} /\ {add J N N1} /\ equiv_cc tnat N V V')
H9 : {eval' M' (nat' N)}
H10 : {add N1 N2 N1}
============================
 {eval' M' (nat' N)}

cc_nat_sem_pres < search.
Proof completed.
Abella <