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 < Import "eval".
Importing from /home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/./eval

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

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

Abella < Define sim_ch : ty -> nat -> tm' -> tm' -> prop,	
equiv_ch : ty -> nat -> tm' -> tm' -> prop by 
sim_ch 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_ch T N V V');
equiv_ch tnat K (nat' N) (nat' N);
equiv_ch tunit K unit' unit';
equiv_ch (prod T1 T2) K (pair' V1 V2) (pair' V1' V2') := equiv_ch T1 K V1 V1' /\ equiv_ch T2 K V2 V2';
equiv_ch (arr' T1 T2) z (abs' R) (abs' R') := {tm' (abs' R)} /\ {tm' (abs' R')};
equiv_ch (arr' T1 T2) (s K) (abs' R) (abs' R') := equiv_ch (arr' T1 T2) K (abs' R) (abs' R') /\
  (forall V V', equiv_ch T1 K V V' ->
       sim_ch T2 K (R V) (htm nil (hbase (R' V'))));
equiv_ch (arr T1 T2) z (clos' (abs' R) VE) (clos' (abs' R') VE') := {tm' (clos' (abs' R) VE)} /\ {tm' (clos' (abs' R') VE')} /\ {val' VE} /\
  {val' VE'};
equiv_ch (arr T1 T2) (s K) (clos' (abs' R) VE) (clos' (abs' R') VE') := equiv_ch (arr T1 T2) K (clos' (abs' R) VE) (clos' (abs' R') VE') /\
  (forall V1 V1' V2 V2', equiv_ch T1 K V1 V1' ->
       equiv_ch (arr T1 T2) K V2 V2' ->
       sim_ch T2 K (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))).
Warning: Definition might not be stratified
 ("equiv_ch" occurs to the left of ->)
Warning: Definition might not be stratified
 ("equiv_ch" occurs to the left of ->)

Abella < Theorem equiv_ch_val1 : 
forall T K V V', {is_cty T} -> {is_nat K} -> equiv_ch T K V V' -> {val' V}.


============================
 forall T K V V', {is_cty T} -> {is_nat K} -> equiv_ch T K V V' -> {val' V}

equiv_ch_val1 < induction on 1.

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

equiv_ch_val1 < induction on 2.

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

equiv_ch_val1 < intros.

Variables: T K V V'
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V}
H1 : {is_cty T}@
H2 : {is_nat K}@@
H3 : equiv_ch T K V V'
============================
 {val' V}

equiv_ch_val1 < case H1 (keep).
Subgoal 1:

Variables: K V V'
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V}
H1 : {is_cty tnat}@
H2 : {is_nat K}@@
H3 : equiv_ch tnat K V V'
============================
 {val' V}

Subgoal 2 is:
 {val' V}

Subgoal 3 is:
 {val' V}

Subgoal 4 is:
 {val' V}

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < case H3.
Subgoal 1:

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

Subgoal 2 is:
 {val' V}

Subgoal 3 is:
 {val' V}

Subgoal 4 is:
 {val' V}

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < search.
Subgoal 2:

Variables: K V V'
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V}
H1 : {is_cty tunit}@
H2 : {is_nat K}@@
H3 : equiv_ch tunit K V V'
============================
 {val' V}

Subgoal 3 is:
 {val' V}

Subgoal 4 is:
 {val' V}

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < case H3.
Subgoal 2:

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

Subgoal 3 is:
 {val' V}

Subgoal 4 is:
 {val' V}

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < search.
Subgoal 3:

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

Subgoal 4 is:
 {val' V}

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < case H3.
Subgoal 3:

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

Subgoal 4 is:
 {val' V}

Subgoal 5 is:
 {val' V}

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

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

Subgoal 4 is:
 {val' V}

Subgoal 5 is:
 {val' V}

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

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

Subgoal 4 is:
 {val' V}

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < search.
Subgoal 4:

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

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < case H2.
Subgoal 4.1:

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

Subgoal 4.2 is:
 {val' V}

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < case H3.
Subgoal 4.1:

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

Subgoal 4.2 is:
 {val' V}

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < search.
Subgoal 4.2:

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

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < case H3.
Subgoal 4.2:

Variables: T2 T1 N VE' R' VE R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V}
H1 : {is_cty (arr T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H8 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {val' (clos' (abs' R) VE)}

Subgoal 5 is:
 {val' V}

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

Variables: T2 T1 N VE' R' VE R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V}
H1 : {is_cty (arr T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H8 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H9 : {val' (clos' (abs' R) VE)}
============================
 {val' (clos' (abs' R) VE)}

Subgoal 5 is:
 {val' V}

equiv_ch_val1 < search.
Subgoal 5:

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

equiv_ch_val1 < case H3.
Subgoal 5.1:

Variables: T2 T1 R' R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V}
H1 : {is_cty (arr' T1 T2)}@
H2 : {is_nat z}@@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {tm' (abs' R)}
H7 : {tm' (abs' R')}
============================
 {val' (abs' R)}

Subgoal 5.2 is:
 {val' (abs' R)}

equiv_ch_val1 < search.
Subgoal 5.2:

Variables: T2 T1 R' R K1
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V}
H1 : {is_cty (arr' T1 T2)}@
H2 : {is_nat (s K1)}@@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : equiv_ch (arr' T1 T2) K1 (abs' R) (abs' R')
H7 : forall V V', equiv_ch T1 K1 V V' ->
       sim_ch T2 K1 (R V) (htm nil (hbase (R' V')))
============================
 {val' (abs' R)}

equiv_ch_val1 < search.
Proof completed.
Abella < Theorem equiv_ch_val2 : 
forall T K V V', {is_cty T} -> {is_nat K} -> equiv_ch T K V V' -> {val' V'}.


============================
 forall T K V V', {is_cty T} -> {is_nat K} -> equiv_ch T K V V' -> {val' V'}

equiv_ch_val2 < induction on 1.

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

equiv_ch_val2 < induction on 2.

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

equiv_ch_val2 < intros.

Variables: T K V V'
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V'}
H1 : {is_cty T}@
H2 : {is_nat K}@@
H3 : equiv_ch T K V V'
============================
 {val' V'}

equiv_ch_val2 < case H1 (keep).
Subgoal 1:

Variables: K V V'
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V'}
H1 : {is_cty tnat}@
H2 : {is_nat K}@@
H3 : equiv_ch tnat K V V'
============================
 {val' V'}

Subgoal 2 is:
 {val' V'}

Subgoal 3 is:
 {val' V'}

Subgoal 4 is:
 {val' V'}

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < case H3.
Subgoal 1:

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

Subgoal 2 is:
 {val' V'}

Subgoal 3 is:
 {val' V'}

Subgoal 4 is:
 {val' V'}

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < search.
Subgoal 2:

Variables: K V V'
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V'}
H1 : {is_cty tunit}@
H2 : {is_nat K}@@
H3 : equiv_ch tunit K V V'
============================
 {val' V'}

Subgoal 3 is:
 {val' V'}

Subgoal 4 is:
 {val' V'}

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < case H3.
Subgoal 2:

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

Subgoal 3 is:
 {val' V'}

Subgoal 4 is:
 {val' V'}

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < search.
Subgoal 3:

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

Subgoal 4 is:
 {val' V'}

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < case H3.
Subgoal 3:

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

Subgoal 4 is:
 {val' V'}

Subgoal 5 is:
 {val' V'}

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

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

Subgoal 4 is:
 {val' V'}

Subgoal 5 is:
 {val' V'}

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

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

Subgoal 4 is:
 {val' V'}

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < search.
Subgoal 4:

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

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < case H2.
Subgoal 4.1:

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

Subgoal 4.2 is:
 {val' V'}

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < case H3.
Subgoal 4.1:

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

Subgoal 4.2 is:
 {val' V'}

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < search.
Subgoal 4.2:

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

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < case H3.
Subgoal 4.2:

Variables: T2 T1 N VE' R' VE R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V'}
H1 : {is_cty (arr T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H8 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {val' (clos' (abs' R') VE')}

Subgoal 5 is:
 {val' V'}

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

Variables: T2 T1 N VE' R' VE R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V'}
H1 : {is_cty (arr T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H8 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H9 : {val' (clos' (abs' R') VE')}
============================
 {val' (clos' (abs' R') VE')}

Subgoal 5 is:
 {val' V'}

equiv_ch_val2 < search.
Subgoal 5:

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

equiv_ch_val2 < case H3.
Subgoal 5.1:

Variables: T2 T1 R' R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V'}
H1 : {is_cty (arr' T1 T2)}@
H2 : {is_nat z}@@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {tm' (abs' R)}
H7 : {tm' (abs' R')}
============================
 {val' (abs' R')}

Subgoal 5.2 is:
 {val' (abs' R')}

equiv_ch_val2 < search.
Subgoal 5.2:

Variables: T2 T1 R' R K1
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {val' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {val' V'}
H1 : {is_cty (arr' T1 T2)}@
H2 : {is_nat (s K1)}@@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : equiv_ch (arr' T1 T2) K1 (abs' R) (abs' R')
H7 : forall V V', equiv_ch T1 K1 V V' ->
       sim_ch T2 K1 (R V) (htm nil (hbase (R' V')))
============================
 {val' (abs' R')}

equiv_ch_val2 < search.
Proof completed.
Abella < Theorem equiv_ch_tm1 : 
forall T K V V', {is_cty T} -> {is_nat K} -> equiv_ch T K V V' -> {tm' V}.


============================
 forall T K V V', {is_cty T} -> {is_nat K} -> equiv_ch T K V V' -> {tm' V}

equiv_ch_tm1 < induction on 1.

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

equiv_ch_tm1 < induction on 2.

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

equiv_ch_tm1 < intros.

Variables: T K V V'
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V}
H1 : {is_cty T}@
H2 : {is_nat K}@@
H3 : equiv_ch T K V V'
============================
 {tm' V}

equiv_ch_tm1 < case H1 (keep).
Subgoal 1:

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

Subgoal 2 is:
 {tm' V}

Subgoal 3 is:
 {tm' V}

Subgoal 4 is:
 {tm' V}

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < case H3.
Subgoal 1:

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

Subgoal 2 is:
 {tm' V}

Subgoal 3 is:
 {tm' V}

Subgoal 4 is:
 {tm' V}

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < search.
Subgoal 2:

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

Subgoal 3 is:
 {tm' V}

Subgoal 4 is:
 {tm' V}

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < case H3.
Subgoal 2:

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

Subgoal 3 is:
 {tm' V}

Subgoal 4 is:
 {tm' V}

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < search.
Subgoal 3:

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

Subgoal 4 is:
 {tm' V}

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < case H3.
Subgoal 3:

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

Subgoal 4 is:
 {tm' V}

Subgoal 5 is:
 {tm' V}

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

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

Subgoal 4 is:
 {tm' V}

Subgoal 5 is:
 {tm' V}

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

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

Subgoal 4 is:
 {tm' V}

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < search.
Subgoal 4:

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

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < case H2.
Subgoal 4.1:

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

Subgoal 4.2 is:
 {tm' V}

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < case H3.
Subgoal 4.1:

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

Subgoal 4.2 is:
 {tm' V}

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < search.
Subgoal 4.2:

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

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < case H3.
Subgoal 4.2:

Variables: T2 T1 N VE' R' VE R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V}
H1 : {is_cty (arr T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H8 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {tm' (clos' (abs' R) VE)}

Subgoal 5 is:
 {tm' V}

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

Variables: T2 T1 N VE' R' VE R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V}
H1 : {is_cty (arr T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H8 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H9 : {tm' (clos' (abs' R) VE)}
============================
 {tm' (clos' (abs' R) VE)}

Subgoal 5 is:
 {tm' V}

equiv_ch_tm1 < search.
Subgoal 5:

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

equiv_ch_tm1 < case H2.
Subgoal 5.1:

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

Subgoal 5.2 is:
 {tm' V}

equiv_ch_tm1 < case H3.
Subgoal 5.1:

Variables: T2 T1 R' R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V}
H1 : {is_cty (arr' T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {tm' (abs' R)}
H7 : {tm' (abs' R')}
============================
 {tm' (abs' R)}

Subgoal 5.2 is:
 {tm' V}

equiv_ch_tm1 < search.
Subgoal 5.2:

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

equiv_ch_tm1 < case H3.
Subgoal 5.2:

Variables: T2 T1 N R' R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V}
H1 : {is_cty (arr' T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H8 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
============================
 {tm' (abs' R)}

equiv_ch_tm1 < apply IH1 to H1 H6 H7.
Subgoal 5.2:

Variables: T2 T1 N R' R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V}
H1 : {is_cty (arr' T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H8 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H9 : {tm' (abs' R)}
============================
 {tm' (abs' R)}

equiv_ch_tm1 < search.
Proof completed.
Abella < Theorem equiv_ch_tm2 : 
forall T K V V', {is_cty T} -> {is_nat K} -> equiv_ch T K V V' -> {tm' V'}.


============================
 forall T K V V', {is_cty T} -> {is_nat K} -> equiv_ch T K V V' -> {tm' V'}

equiv_ch_tm2 < induction on 1.

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

equiv_ch_tm2 < induction on 2.

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

equiv_ch_tm2 < intros.

Variables: T K V V'
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V'}
H1 : {is_cty T}@
H2 : {is_nat K}@@
H3 : equiv_ch T K V V'
============================
 {tm' V'}

equiv_ch_tm2 < case H1 (keep).
Subgoal 1:

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

Subgoal 2 is:
 {tm' V'}

Subgoal 3 is:
 {tm' V'}

Subgoal 4 is:
 {tm' V'}

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < case H3.
Subgoal 1:

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

Subgoal 2 is:
 {tm' V'}

Subgoal 3 is:
 {tm' V'}

Subgoal 4 is:
 {tm' V'}

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < search.
Subgoal 2:

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

Subgoal 3 is:
 {tm' V'}

Subgoal 4 is:
 {tm' V'}

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < case H3.
Subgoal 2:

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

Subgoal 3 is:
 {tm' V'}

Subgoal 4 is:
 {tm' V'}

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < search.
Subgoal 3:

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

Subgoal 4 is:
 {tm' V'}

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < case H3.
Subgoal 3:

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

Subgoal 4 is:
 {tm' V'}

Subgoal 5 is:
 {tm' V'}

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

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

Subgoal 4 is:
 {tm' V'}

Subgoal 5 is:
 {tm' V'}

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

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

Subgoal 4 is:
 {tm' V'}

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < search.
Subgoal 4:

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

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < case H2.
Subgoal 4.1:

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

Subgoal 4.2 is:
 {tm' V'}

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < case H3.
Subgoal 4.1:

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

Subgoal 4.2 is:
 {tm' V'}

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < search.
Subgoal 4.2:

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

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < case H3.
Subgoal 4.2:

Variables: T2 T1 N VE' R' VE R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V'}
H1 : {is_cty (arr T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H8 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {tm' (clos' (abs' R') VE')}

Subgoal 5 is:
 {tm' V'}

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

Variables: T2 T1 N VE' R' VE R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V'}
H1 : {is_cty (arr T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H8 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H9 : {tm' (clos' (abs' R') VE')}
============================
 {tm' (clos' (abs' R') VE')}

Subgoal 5 is:
 {tm' V'}

equiv_ch_tm2 < search.
Subgoal 5:

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

equiv_ch_tm2 < case H2.
Subgoal 5.1:

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

Subgoal 5.2 is:
 {tm' V'}

equiv_ch_tm2 < case H3.
Subgoal 5.1:

Variables: T2 T1 R' R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V'}
H1 : {is_cty (arr' T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {tm' (abs' R)}
H7 : {tm' (abs' R')}
============================
 {tm' (abs' R')}

Subgoal 5.2 is:
 {tm' V'}

equiv_ch_tm2 < search.
Subgoal 5.2:

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

equiv_ch_tm2 < case H3.
Subgoal 5.2:

Variables: T2 T1 N R' R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V'}
H1 : {is_cty (arr' T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H8 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
============================
 {tm' (abs' R')}

equiv_ch_tm2 < apply IH1 to H1 H6 H7.
Subgoal 5.2:

Variables: T2 T1 N R' R
IH : forall T K V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       {tm' V'}
IH1 : forall T K V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        {tm' V'}
H1 : {is_cty (arr' T1 T2)}@
H4 : {is_cty T1}*
H5 : {is_cty T2}*
H6 : {is_nat N}**
H7 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H8 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H9 : {tm' (abs' R')}
============================
 {tm' (abs' R')}

equiv_ch_tm2 < search.
Proof completed.
Abella < Theorem equiv_ch_arr'_abs : 
forall T1 T K R V, {is_nat K} -> equiv_ch (arr' T1 T) K (abs' R) V ->
  (exists R', V = abs' R').


============================
 forall T1 T K R V, {is_nat K} -> equiv_ch (arr' T1 T) K (abs' R) V ->
   (exists R', V = abs' R')

equiv_ch_arr'_abs < intros.

Variables: T1 T K R V
H1 : {is_nat K}
H2 : equiv_ch (arr' T1 T) K (abs' R) V
============================
 exists R', V = abs' R'

equiv_ch_arr'_abs < case H1.
Subgoal 1:

Variables: T1 T R V
H2 : equiv_ch (arr' T1 T) z (abs' R) V
============================
 exists R', V = abs' R'

Subgoal 2 is:
 exists R', V = abs' R'

equiv_ch_arr'_abs < case H2.
Subgoal 1:

Variables: T1 T R R'
H3 : {tm' (abs' R)}
H4 : {tm' (abs' R')}
============================
 exists R'1, abs' R' = abs' R'1

Subgoal 2 is:
 exists R', V = abs' R'

equiv_ch_arr'_abs < search.
Subgoal 2:

Variables: T1 T R V N
H2 : equiv_ch (arr' T1 T) (s N) (abs' R) V
H3 : {is_nat N}
============================
 exists R', V = abs' R'

equiv_ch_arr'_abs < case H2.
Subgoal 2:

Variables: T1 T R N R'
H3 : {is_nat N}
H4 : equiv_ch (arr' T1 T) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T N (R V) (htm nil (hbase (R' V')))
============================
 exists R'1, abs' R' = abs' R'1

equiv_ch_arr'_abs < search.
Proof completed.
Abella < Theorem equiv_ch_arr_clos : 
forall T1 T K F E V, {is_nat K} ->
  equiv_ch (arr T1 T) K (clos' (abs' F) E) V ->
  (exists F' E', V = clos' (abs' F') E').


============================
 forall T1 T K F E V, {is_nat K} ->
   equiv_ch (arr T1 T) K (clos' (abs' F) E) V ->
   (exists F' E', V = clos' (abs' F') E')

equiv_ch_arr_clos < intros.

Variables: T1 T K F E V
H1 : {is_nat K}
H2 : equiv_ch (arr T1 T) K (clos' (abs' F) E) V
============================
 exists F' E', V = clos' (abs' F') E'

equiv_ch_arr_clos < case H1.
Subgoal 1:

Variables: T1 T F E V
H2 : equiv_ch (arr T1 T) z (clos' (abs' F) E) V
============================
 exists F' E', V = clos' (abs' F') E'

Subgoal 2 is:
 exists F' E', V = clos' (abs' F') E'

equiv_ch_arr_clos < case H2.
Subgoal 1:

Variables: T1 T F E VE' R'
H3 : {tm' (clos' (abs' F) E)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' E}
H6 : {val' VE'}
============================
 exists F' E', clos' (abs' R') VE' = clos' (abs' F') E'

Subgoal 2 is:
 exists F' E', V = clos' (abs' F') E'

equiv_ch_arr_clos < search.
Subgoal 2:

Variables: T1 T F E V N
H2 : equiv_ch (arr T1 T) (s N) (clos' (abs' F) E) V
H3 : {is_nat N}
============================
 exists F' E', V = clos' (abs' F') E'

equiv_ch_arr_clos < case H2.
Subgoal 2:

Variables: T1 T F E N VE' R'
H3 : {is_nat N}
H4 : equiv_ch (arr T1 T) N (clos' (abs' F) E) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T) N V2 V2' ->
       sim_ch T N (F (pair' V2 (pair' V1 E)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 exists F' E', clos' (abs' R') VE' = clos' (abs' F') E'

equiv_ch_arr_clos < search.
Proof completed.
Abella < Theorem equiv_ch_closed : 
forall T K J V V', {is_cty T} -> {is_nat K} -> equiv_ch T K V V' -> le J K ->
  equiv_ch T J V V'.


============================
 forall T K J V V', {is_cty T} -> {is_nat K} -> equiv_ch T K V V' ->
   le J K -> equiv_ch T J V V'

equiv_ch_closed < induction on 1.

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

equiv_ch_closed < induction on 2.

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

equiv_ch_closed < intros.

Variables: T K J V V'
IH : forall T K J V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       le J K -> equiv_ch T J V V'
IH1 : forall T K J V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        le J K -> equiv_ch T J V V'
H1 : {is_cty T}@
H2 : {is_nat K}@@
H3 : equiv_ch T K V V'
H4 : le J K
============================
 equiv_ch T J V V'

equiv_ch_closed < case H1 (keep).
Subgoal 1:

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

Subgoal 2 is:
 equiv_ch tunit J V V'

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

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < case H3.
Subgoal 1:

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

Subgoal 2 is:
 equiv_ch tunit J V V'

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

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < search.
Subgoal 2:

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

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

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < case H3.
Subgoal 2:

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

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

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < search.
Subgoal 3:

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

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < case H3.
Subgoal 3:

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

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < unfold.
Subgoal 3.1:

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

Subgoal 3.2 is:
 equiv_ch T2 J V2 V2'

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < backchain IH.
Subgoal 3.2:

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

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < backchain IH.
Subgoal 4:

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < apply le_to_lt to _ H4.
Subgoal 4:

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < case H7.
Subgoal 4.1:

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

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < search.
Subgoal 4.2:

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < case H2 (keep).
Subgoal 4.2.1:

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

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < apply lt_z_absurd to H8.
Subgoal 4.2.2:

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < apply lt_pred_le to _ H8.
Subgoal 4.2.2:

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

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < case H3.
Subgoal 4.2.2:

Variables: J T2 T1 N VE' R' VE R
IH : forall T K J V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       le J K -> equiv_ch T J V V'
IH1 : forall T K J V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        le J K -> equiv_ch T J V V'
H1 : {is_cty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H4 : le J (s N)
H5 : {is_cty T1}*
H6 : {is_cty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
H10 : le J N
H11 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H12 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
        equiv_ch (arr T1 T2) N V2 V2' ->
        sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 equiv_ch (arr T1 T2) J (clos' (abs' R) VE) (clos' (abs' R') VE')

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

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

Variables: J T2 T1 N VE' R' VE R
IH : forall T K J V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       le J K -> equiv_ch T J V V'
IH1 : forall T K J V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        le J K -> equiv_ch T J V V'
H1 : {is_cty (arr T1 T2)}@
H2 : {is_nat (s N)}@@
H4 : le J (s N)
H5 : {is_cty T1}*
H6 : {is_cty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
H10 : le J N
H11 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H12 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
        equiv_ch (arr T1 T2) N V2 V2' ->
        sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H13 : equiv_ch (arr T1 T2) J (clos' (abs' R) VE) (clos' (abs' R') VE')
============================
 equiv_ch (arr T1 T2) J (clos' (abs' R) VE) (clos' (abs' R') VE')

Subgoal 5 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < search.
Subgoal 5:

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

equiv_ch_closed < apply le_to_lt to _ H4.
Subgoal 5:

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

equiv_ch_closed < case H7.
Subgoal 5.1:

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

Subgoal 5.2 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < search.
Subgoal 5.2:

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

equiv_ch_closed < case H2 (keep).
Subgoal 5.2.1:

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

Subgoal 5.2.2 is:
 equiv_ch (arr' T1 T2) J V V'

equiv_ch_closed < apply lt_z_absurd to H8.
Subgoal 5.2.2:

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

equiv_ch_closed < apply lt_pred_le to _ H8.
Subgoal 5.2.2:

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

equiv_ch_closed < case H3.
Subgoal 5.2.2:

Variables: J T2 T1 N R' R
IH : forall T K J V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       le J K -> equiv_ch T J V V'
IH1 : forall T K J V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        le J K -> equiv_ch T J V V'
H1 : {is_cty (arr' T1 T2)}@
H2 : {is_nat (s N)}@@
H4 : le J (s N)
H5 : {is_cty T1}*
H6 : {is_cty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
H10 : le J N
H11 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H12 : forall V V', equiv_ch T1 N V V' ->
        sim_ch T2 N (R V) (htm nil (hbase (R' V')))
============================
 equiv_ch (arr' T1 T2) J (abs' R) (abs' R')

equiv_ch_closed < apply IH1 to H1 H9 H11 H10.
Subgoal 5.2.2:

Variables: J T2 T1 N R' R
IH : forall T K J V V', {is_cty T}* -> {is_nat K} -> equiv_ch T K V V' ->
       le J K -> equiv_ch T J V V'
IH1 : forall T K J V V', {is_cty T}@ -> {is_nat K}** -> equiv_ch T K V V' ->
        le J K -> equiv_ch T J V V'
H1 : {is_cty (arr' T1 T2)}@
H2 : {is_nat (s N)}@@
H4 : le J (s N)
H5 : {is_cty T1}*
H6 : {is_cty T2}*
H8 : lt J (s N)
H9 : {is_nat N}**
H10 : le J N
H11 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H12 : forall V V', equiv_ch T1 N V V' ->
        sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H13 : equiv_ch (arr' T1 T2) J (abs' R) (abs' R')
============================
 equiv_ch (arr' T1 T2) J (abs' R) (abs' R')

equiv_ch_closed < search.
Proof completed.
Abella < Define equiv_ch_arr' : ty -> nat -> tm' -> tm' -> prop by 
equiv_ch_arr' (arr' T1 T2) K (abs' R) (abs' R') := {tm' (abs' R)} /\ {tm' (abs' R')} /\
  (forall J V V', lt J K -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))).

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


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

equiv_ch_arr'_closed < intros.

Variables: J K T M M'
H1 : {is_nat K}
H2 : le J K
H3 : equiv_ch_arr' T K M M'
============================
 equiv_ch_arr' T J M M'

equiv_ch_arr'_closed < case H3.

Variables: J K R' R T2 T1
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J K -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 equiv_ch_arr' (arr' T1 T2) J (abs' R) (abs' R')

equiv_ch_arr'_closed < unfold.
Subgoal 1:

Variables: J K R' R T2 T1
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J K -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 {tm' (abs' R)}

Subgoal 2 is:
 {tm' (abs' R')}

Subgoal 3 is:
 forall J1 V V', lt J1 J -> equiv_ch T1 J1 V V' ->
   sim_ch T2 J1 (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_closed < search.
Subgoal 2:

Variables: J K R' R T2 T1
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J K -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 {tm' (abs' R')}

Subgoal 3 is:
 forall J1 V V', lt J1 J -> equiv_ch T1 J1 V V' ->
   sim_ch T2 J1 (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_closed < search.
Subgoal 3:

Variables: J K R' R T2 T1
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J K -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 forall J1 V V', lt J1 J -> equiv_ch T1 J1 V V' ->
   sim_ch T2 J1 (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_closed < intros.
Subgoal 3:

Variables: J K R' R T2 T1 J1 V V'
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J K -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : lt J1 J
H8 : equiv_ch T1 J1 V V'
============================
 sim_ch T2 J1 (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_closed < apply lt_le_compose to H7 H2.
Subgoal 3:

Variables: J K R' R T2 T1 J1 V V'
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J K -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : lt J1 J
H8 : equiv_ch T1 J1 V V'
H9 : lt J1 K
============================
 sim_ch T2 J1 (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_closed < apply H6 to H9 H8.
Subgoal 3:

Variables: J K R' R T2 T1 J1 V V'
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J K -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : lt J1 J
H8 : equiv_ch T1 J1 V V'
H9 : lt J1 K
H10 : sim_ch T2 J1 (R V) (htm nil (hbase (R' V')))
============================
 sim_ch T2 J1 (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_closed < search.
Proof completed.
Abella < Theorem equiv_ch_arr'_to_equiv_ch : 
forall T K M M', {is_nat K} -> {is_cty T} -> equiv_ch_arr' T K M M' ->
  equiv_ch T K M M'.


============================
 forall T K M M', {is_nat K} -> {is_cty T} -> equiv_ch_arr' T K M M' ->
   equiv_ch T K M M'

equiv_ch_arr'_to_equiv_ch < induction on 1.

IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
============================
 forall T K M M', {is_nat K}@ -> {is_cty T} -> equiv_ch_arr' T K M M' ->
   equiv_ch T K M M'

equiv_ch_arr'_to_equiv_ch < intros.

Variables: T K M M'
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H1 : {is_nat K}@
H2 : {is_cty T}
H3 : equiv_ch_arr' T K M M'
============================
 equiv_ch T K M M'

equiv_ch_arr'_to_equiv_ch < case H3 (keep).

Variables: K R' R T2 T1
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H1 : {is_nat K}@
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) K (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J K -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 equiv_ch (arr' T1 T2) K (abs' R) (abs' R')

equiv_ch_arr'_to_equiv_ch < case H1.
Subgoal 1:

Variables: R' R T2 T1
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) z (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J z -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 equiv_ch (arr' T1 T2) z (abs' R) (abs' R')

Subgoal 2 is:
 equiv_ch (arr' T1 T2) (s N) (abs' R) (abs' R')

equiv_ch_arr'_to_equiv_ch < search.
Subgoal 2:

Variables: R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
============================
 equiv_ch (arr' T1 T2) (s N) (abs' R) (abs' R')

equiv_ch_arr'_to_equiv_ch < unfold.
Subgoal 2.1:

Variables: R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
============================
 equiv_ch (arr' T1 T2) N (abs' R) (abs' R')

Subgoal 2.2 is:
 forall V V', equiv_ch T1 N V V' ->
   sim_ch T2 N (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_to_equiv_ch < apply equiv_ch_arr'_closed to _ _ H3 with J = N.
Subgoal 2.1.1:

Variables: R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
============================
 le N (s N)

Subgoal 2.1 is:
 equiv_ch (arr' T1 T2) N (abs' R) (abs' R')

Subgoal 2.2 is:
 forall V V', equiv_ch T1 N V V' ->
   sim_ch T2 N (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_to_equiv_ch < backchain le_succ.
Subgoal 2.1.1:

Variables: R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
============================
 le N N

Subgoal 2.1 is:
 equiv_ch (arr' T1 T2) N (abs' R) (abs' R')

Subgoal 2.2 is:
 forall V V', equiv_ch T1 N V V' ->
   sim_ch T2 N (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_to_equiv_ch < backchain le_refl.
Subgoal 2.1:

Variables: R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
H8 : equiv_ch_arr' (arr' T1 T2) N (abs' R) (abs' R')
============================
 equiv_ch (arr' T1 T2) N (abs' R) (abs' R')

Subgoal 2.2 is:
 forall V V', equiv_ch T1 N V V' ->
   sim_ch T2 N (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_to_equiv_ch < apply IH to H7 _ H8.
Subgoal 2.1:

Variables: R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
H8 : equiv_ch_arr' (arr' T1 T2) N (abs' R) (abs' R')
H9 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
============================
 equiv_ch (arr' T1 T2) N (abs' R) (abs' R')

Subgoal 2.2 is:
 forall V V', equiv_ch T1 N V V' ->
   sim_ch T2 N (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_to_equiv_ch < search.
Subgoal 2.2:

Variables: R' R T2 T1 N
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
============================
 forall V V', equiv_ch T1 N V V' ->
   sim_ch T2 N (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_to_equiv_ch < intros.
Subgoal 2.2:

Variables: R' R T2 T1 N V V'
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
H8 : equiv_ch T1 N V V'
============================
 sim_ch T2 N (R V) (htm nil (hbase (R' V')))

equiv_ch_arr'_to_equiv_ch < backchain H6.
Subgoal 2.2:

Variables: R' R T2 T1 N V V'
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
H8 : equiv_ch T1 N V V'
============================
 lt N (s N)

equiv_ch_arr'_to_equiv_ch < unfold.
Subgoal 2.2:

Variables: R' R T2 T1 N V V'
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
H8 : equiv_ch T1 N V V'
============================
 exists N1, {add N (s N1) (s N)}

equiv_ch_arr'_to_equiv_ch < exists z.
Subgoal 2.2:

Variables: R' R T2 T1 N V V'
IH : forall T K M M', {is_nat K}* -> {is_cty T} -> equiv_ch_arr' T K M M' ->
       equiv_ch T K M M'
H2 : {is_cty (arr' T1 T2)}
H3 : equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')
H4 : {tm' (abs' R)}
H5 : {tm' (abs' R')}
H6 : forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H7 : {is_nat N}*
H8 : equiv_ch T1 N V V'
============================
 {add N (s z) (s N)}

equiv_ch_arr'_to_equiv_ch < backchain add_comm.
Proof completed.
Abella < Theorem equiv_ch_to_equiv_ch_arr' : 
forall K T1 T2 M M', {is_nat K} -> equiv_ch (arr' T1 T2) K M M' ->
  equiv_ch_arr' (arr' T1 T2) K M M'.


============================
 forall K T1 T2 M M', {is_nat K} -> equiv_ch (arr' T1 T2) K M M' ->
   equiv_ch_arr' (arr' T1 T2) K M M'

equiv_ch_to_equiv_ch_arr' < induction on 1.

IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
============================
 forall K T1 T2 M M', {is_nat K}@ -> equiv_ch (arr' T1 T2) K M M' ->
   equiv_ch_arr' (arr' T1 T2) K M M'

equiv_ch_to_equiv_ch_arr' < intros.

Variables: K T1 T2 M M'
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H1 : {is_nat K}@
H2 : equiv_ch (arr' T1 T2) K M M'
============================
 equiv_ch_arr' (arr' T1 T2) K M M'

equiv_ch_to_equiv_ch_arr' < case H1.
Subgoal 1:

Variables: T1 T2 M M'
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H2 : equiv_ch (arr' T1 T2) z M M'
============================
 equiv_ch_arr' (arr' T1 T2) z M M'

Subgoal 2 is:
 equiv_ch_arr' (arr' T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr' < case H2.
Subgoal 1:

Variables: T1 T2 R' R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {tm' (abs' R)}
H4 : {tm' (abs' R')}
============================
 equiv_ch_arr' (arr' T1 T2) z (abs' R) (abs' R')

Subgoal 2 is:
 equiv_ch_arr' (arr' T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr' < unfold.
Subgoal 1.1:

Variables: T1 T2 R' R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {tm' (abs' R)}
H4 : {tm' (abs' R')}
============================
 {tm' (abs' R)}

Subgoal 1.2 is:
 {tm' (abs' R')}

Subgoal 1.3 is:
 forall J V V', lt J z -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R V) (htm nil (hbase (R' V')))

Subgoal 2 is:
 equiv_ch_arr' (arr' T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr' < search.
Subgoal 1.2:

Variables: T1 T2 R' R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {tm' (abs' R)}
H4 : {tm' (abs' R')}
============================
 {tm' (abs' R')}

Subgoal 1.3 is:
 forall J V V', lt J z -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R V) (htm nil (hbase (R' V')))

Subgoal 2 is:
 equiv_ch_arr' (arr' T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr' < search.
Subgoal 1.3:

Variables: T1 T2 R' R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {tm' (abs' R)}
H4 : {tm' (abs' R')}
============================
 forall J V V', lt J z -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R V) (htm nil (hbase (R' V')))

Subgoal 2 is:
 equiv_ch_arr' (arr' T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr' < intros.
Subgoal 1.3:

Variables: T1 T2 R' R J V V'
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {tm' (abs' R)}
H4 : {tm' (abs' R')}
H5 : lt J z
H6 : equiv_ch T1 J V V'
============================
 sim_ch T2 J (R V) (htm nil (hbase (R' V')))

Subgoal 2 is:
 equiv_ch_arr' (arr' T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr' < case H5.
Subgoal 1.3:

Variables: T1 T2 R' R J V V' N
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {tm' (abs' R)}
H4 : {tm' (abs' R')}
H6 : equiv_ch T1 J V V'
H7 : {add J (s N) z}
============================
 sim_ch T2 J (R V) (htm nil (hbase (R' V')))

Subgoal 2 is:
 equiv_ch_arr' (arr' T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr' < case H7.
Subgoal 2:

Variables: T1 T2 M M' N
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H2 : equiv_ch (arr' T1 T2) (s N) M M'
H3 : {is_nat N}*
============================
 equiv_ch_arr' (arr' T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr' < case H2.
Subgoal 2:

Variables: T1 T2 N R' R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
============================
 equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')

equiv_ch_to_equiv_ch_arr' < apply IH to H3 H4.
Subgoal 2:

Variables: T1 T2 N R' R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H6 : equiv_ch_arr' (arr' T1 T2) N (abs' R) (abs' R')
============================
 equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')

equiv_ch_to_equiv_ch_arr' < case H6.
Subgoal 2:

Variables: T1 T2 N R' R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 equiv_ch_arr' (arr' T1 T2) (s N) (abs' R) (abs' R')

equiv_ch_to_equiv_ch_arr' < unfold.
Subgoal 2.1:

Variables: T1 T2 N R' R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 {tm' (abs' R)}

Subgoal 2.2 is:
 {tm' (abs' R')}

Subgoal 2.3 is:
 forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R V) (htm nil (hbase (R' V')))

equiv_ch_to_equiv_ch_arr' < search.
Subgoal 2.2:

Variables: T1 T2 N R' R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 {tm' (abs' R')}

Subgoal 2.3 is:
 forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R V) (htm nil (hbase (R' V')))

equiv_ch_to_equiv_ch_arr' < search.
Subgoal 2.3:

Variables: T1 T2 N R' R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 forall J V V', lt J (s N) -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R V) (htm nil (hbase (R' V')))

equiv_ch_to_equiv_ch_arr' < intros.
Subgoal 2.3:

Variables: T1 T2 N R' R J V V'
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H10 : lt J (s N)
H11 : equiv_ch T1 J V V'
============================
 sim_ch T2 J (R V) (htm nil (hbase (R' V')))

equiv_ch_to_equiv_ch_arr' < case H10.
Subgoal 2.3:

Variables: T1 T2 N R' R J V V' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H11 : equiv_ch T1 J V V'
H12 : {add J (s N1) (s N)}
============================
 sim_ch T2 J (R V) (htm nil (hbase (R' V')))

equiv_ch_to_equiv_ch_arr' < apply add_s_inv to H12.
Subgoal 2.3:

Variables: T1 T2 N R' R J V V' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H11 : equiv_ch T1 J V V'
H12 : {add J (s N1) (s N)}
H13 : {add J N1 N}
============================
 sim_ch T2 J (R V) (htm nil (hbase (R' V')))

equiv_ch_to_equiv_ch_arr' < assert le J N.
Subgoal 2.3:

Variables: T1 T2 N R' R J V V' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H11 : equiv_ch T1 J V V'
H12 : {add J (s N1) (s N)}
H13 : {add J N1 N}
H14 : le J N
============================
 sim_ch T2 J (R V) (htm nil (hbase (R' V')))

equiv_ch_to_equiv_ch_arr' < apply le_to_lt to _ H14.
Subgoal 2.3:

Variables: T1 T2 N R' R J V V' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H11 : equiv_ch T1 J V V'
H12 : {add J (s N1) (s N)}
H13 : {add J N1 N}
H14 : le J N
H15 : J = N \/ lt J N
============================
 sim_ch T2 J (R V) (htm nil (hbase (R' V')))

equiv_ch_to_equiv_ch_arr' < case H15.
Subgoal 2.3.1:

Variables: T1 T2 N R' R V V' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H11 : equiv_ch T1 N V V'
H12 : {add N (s N1) (s N)}
H13 : {add N N1 N}
H14 : le N N
============================
 sim_ch T2 N (R V) (htm nil (hbase (R' V')))

Subgoal 2.3.2 is:
 sim_ch T2 J (R V) (htm nil (hbase (R' V')))

equiv_ch_to_equiv_ch_arr' < backchain H5.
Subgoal 2.3.2:

Variables: T1 T2 N R' R J V V' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr' T1 T2) K M M' ->
       equiv_ch_arr' (arr' T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H5 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H7 : {tm' (abs' R)}
H8 : {tm' (abs' R')}
H9 : forall J V V', lt J N -> equiv_ch T1 J V V' ->
       sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H11 : equiv_ch T1 J V V'
H12 : {add J (s N1) (s N)}
H13 : {add J N1 N}
H14 : le J N
H16 : lt J N
============================
 sim_ch T2 J (R V) (htm nil (hbase (R' V')))

equiv_ch_to_equiv_ch_arr' < backchain H9.
Proof completed.
Abella < Theorem equiv_ch_arr'_cond : 
forall K T1 T2 R R', {is_nat K} ->
  equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
  (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
       sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))).


============================
 forall K T1 T2 R R', {is_nat K} ->
   equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
   (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
        sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))

equiv_ch_arr'_cond < induction on 1.

IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
============================
 forall K T1 T2 R R', {is_nat K}@ ->
   equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
   (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
        sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))

equiv_ch_arr'_cond < intros.

Variables: K T1 T2 R R' J V1 V1'
IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
H1 : {is_nat K}@
H2 : equiv_ch (arr' T1 T2) K (abs' R) (abs' R')
H3 : lt J K
H4 : equiv_ch T1 J V1 V1'
============================
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

equiv_ch_arr'_cond < case H1.
Subgoal 1:

Variables: T1 T2 R R' J V1 V1'
IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
H2 : equiv_ch (arr' T1 T2) z (abs' R) (abs' R')
H3 : lt J z
H4 : equiv_ch T1 J V1 V1'
============================
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

Subgoal 2 is:
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

equiv_ch_arr'_cond < apply lt_z_absurd to H3.
Subgoal 2:

Variables: T1 T2 R R' J V1 V1' N
IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
H2 : equiv_ch (arr' T1 T2) (s N) (abs' R) (abs' R')
H3 : lt J (s N)
H4 : equiv_ch T1 J V1 V1'
H5 : {is_nat N}*
============================
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

equiv_ch_arr'_cond < apply lt_pred_le to _ H3.
Subgoal 2:

Variables: T1 T2 R R' J V1 V1' N
IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
H2 : equiv_ch (arr' T1 T2) (s N) (abs' R) (abs' R')
H3 : lt J (s N)
H4 : equiv_ch T1 J V1 V1'
H5 : {is_nat N}*
H6 : le J N
============================
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

equiv_ch_arr'_cond < apply le_to_lt to _ H6.
Subgoal 2:

Variables: T1 T2 R R' J V1 V1' N
IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
H2 : equiv_ch (arr' T1 T2) (s N) (abs' R) (abs' R')
H3 : lt J (s N)
H4 : equiv_ch T1 J V1 V1'
H5 : {is_nat N}*
H6 : le J N
H7 : J = N \/ lt J N
============================
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

equiv_ch_arr'_cond < case H7.
Subgoal 2.1:

Variables: T1 T2 R R' V1 V1' N
IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
H2 : equiv_ch (arr' T1 T2) (s N) (abs' R) (abs' R')
H3 : lt N (s N)
H4 : equiv_ch T1 N V1 V1'
H5 : {is_nat N}*
H6 : le N N
============================
 sim_ch T2 N (R V1) (htm nil (hbase (R' V1')))

Subgoal 2.2 is:
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

equiv_ch_arr'_cond < case H2.
Subgoal 2.1:

Variables: T1 T2 R R' V1 V1' N
IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
H3 : lt N (s N)
H4 : equiv_ch T1 N V1 V1'
H5 : {is_nat N}*
H6 : le N N
H8 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H9 : forall V V', equiv_ch T1 N V V' ->
       sim_ch T2 N (R V) (htm nil (hbase (R' V')))
============================
 sim_ch T2 N (R V1) (htm nil (hbase (R' V1')))

Subgoal 2.2 is:
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

equiv_ch_arr'_cond < backchain H9.
Subgoal 2.2:

Variables: T1 T2 R R' J V1 V1' N
IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
H2 : equiv_ch (arr' T1 T2) (s N) (abs' R) (abs' R')
H3 : lt J (s N)
H4 : equiv_ch T1 J V1 V1'
H5 : {is_nat N}*
H6 : le J N
H8 : lt J N
============================
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

equiv_ch_arr'_cond < case H2.
Subgoal 2.2:

Variables: T1 T2 R R' J V1 V1' N
IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
H3 : lt J (s N)
H4 : equiv_ch T1 J V1 V1'
H5 : {is_nat N}*
H6 : le J N
H8 : lt J N
H9 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H10 : forall V V', equiv_ch T1 N V V' ->
        sim_ch T2 N (R V) (htm nil (hbase (R' V')))
============================
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

equiv_ch_arr'_cond < apply IH to H5 H9.
Subgoal 2.2:

Variables: T1 T2 R R' J V1 V1' N
IH : forall K T1 T2 R R', {is_nat K}* ->
       equiv_ch (arr' T1 T2) K (abs' R) (abs' R') ->
       (forall J V1 V1', lt J K -> equiv_ch T1 J V1 V1' ->
            sim_ch T2 J (R V1) (htm nil (hbase (R' V1'))))
H3 : lt J (s N)
H4 : equiv_ch T1 J V1 V1'
H5 : {is_nat N}*
H6 : le J N
H8 : lt J N
H9 : equiv_ch (arr' T1 T2) N (abs' R) (abs' R')
H10 : forall V V', equiv_ch T1 N V V' ->
        sim_ch T2 N (R V) (htm nil (hbase (R' V')))
H11 : forall J V1 V1', lt J N -> equiv_ch T1 J V1 V1' ->
        sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))
============================
 sim_ch T2 J (R V1) (htm nil (hbase (R' V1')))

equiv_ch_arr'_cond < backchain H11.
Proof completed.
Abella < Theorem app_equiv_ch_arr' : 
forall T1 T R R' N1 N2 V1 V1' K, {is_cty (arr' T1 T)} -> {is_nat N1} ->
  {is_nat N2} -> equiv_ch (arr' T1 T) N1 (abs' R) (abs' R') ->
  equiv_ch T1 N2 V1 V1' -> lt K N1 -> lt K N2 ->
  sim_ch T K (R V1) (htm nil (hbase (R' V1'))).


============================
 forall T1 T R R' N1 N2 V1 V1' K, {is_cty (arr' T1 T)} -> {is_nat N1} ->
   {is_nat N2} -> equiv_ch (arr' T1 T) N1 (abs' R) (abs' R') ->
   equiv_ch T1 N2 V1 V1' -> lt K N1 -> lt K N2 ->
   sim_ch T K (R V1) (htm nil (hbase (R' V1')))

app_equiv_ch_arr' < intros.

Variables: T1 T R R' N1 N2 V1 V1' K
H1 : {is_cty (arr' T1 T)}
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr' T1 T) N1 (abs' R) (abs' R')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
============================
 sim_ch T K (R V1) (htm nil (hbase (R' V1')))

app_equiv_ch_arr' < case H1.

Variables: T1 T R R' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr' T1 T) N1 (abs' R) (abs' R')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
============================
 sim_ch T K (R V1) (htm nil (hbase (R' V1')))

app_equiv_ch_arr' < apply equiv_ch_arr'_cond to _ H4.

Variables: T1 T R R' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr' T1 T) N1 (abs' R) (abs' R')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
H10 : forall J V1 V1', lt J N1 -> equiv_ch T1 J V1 V1' ->
        sim_ch T J (R V1) (htm nil (hbase (R' V1')))
============================
 sim_ch T K (R V1) (htm nil (hbase (R' V1')))

app_equiv_ch_arr' < backchain H10.

Variables: T1 T R R' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr' T1 T) N1 (abs' R) (abs' R')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
H10 : forall J V1 V1', lt J N1 -> equiv_ch T1 J V1 V1' ->
        sim_ch T J (R V1) (htm nil (hbase (R' V1')))
============================
 equiv_ch T1 K V1 V1'

app_equiv_ch_arr' < backchain equiv_ch_closed with K = N2.

Variables: T1 T R R' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr' T1 T) N1 (abs' R) (abs' R')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
H10 : forall J V1 V1', lt J N1 -> equiv_ch T1 J V1 V1' ->
        sim_ch T J (R V1) (htm nil (hbase (R' V1')))
============================
 le K N2

app_equiv_ch_arr' < backchain lt_to_le.
Proof completed.
Abella < Define equiv_ch_arr : ty -> nat -> tm' -> tm' -> prop by 
equiv_ch_arr (arr T1 T2) K (clos' (abs' R) VE) (clos' (abs' R') VE') := {tm' (clos' (abs' R) VE)} /\ {tm' (clos' (abs' R') VE')} /\ {val' VE} /\
  {val' VE'} /\
  (forall J V1 V1' V2 V2', lt J K -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))).

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


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

equiv_ch_arr_closed < intros.

Variables: J K T M M'
H1 : {is_nat K}
H2 : le J K
H3 : equiv_ch_arr T K M M'
============================
 equiv_ch_arr T J M M'

equiv_ch_arr_closed < case H3.

Variables: J K VE' R' VE R T2 T1
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (clos' (abs' R) VE)}
H5 : {tm' (clos' (abs' R') VE')}
H6 : {val' VE}
H7 : {val' VE'}
H8 : forall J V1 V1' V2 V2', lt J K -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 equiv_ch_arr (arr T1 T2) J (clos' (abs' R) VE) (clos' (abs' R') VE')

equiv_ch_arr_closed < unfold.
Subgoal 1:

Variables: J K VE' R' VE R T2 T1
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (clos' (abs' R) VE)}
H5 : {tm' (clos' (abs' R') VE')}
H6 : {val' VE}
H7 : {val' VE'}
H8 : forall J V1 V1' V2 V2', lt J K -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {tm' (clos' (abs' R) VE)}

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

Subgoal 3 is:
 {val' VE}

Subgoal 4 is:
 {val' VE'}

Subgoal 5 is:
 forall J1 V1 V1' V2 V2', lt J1 J -> equiv_ch T1 J1 V1 V1' ->
   equiv_ch (arr T1 T2) J1 V2 V2' ->
   sim_ch T2 J1 (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_closed < search.
Subgoal 2:

Variables: J K VE' R' VE R T2 T1
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (clos' (abs' R) VE)}
H5 : {tm' (clos' (abs' R') VE')}
H6 : {val' VE}
H7 : {val' VE'}
H8 : forall J V1 V1' V2 V2', lt J K -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {tm' (clos' (abs' R') VE')}

Subgoal 3 is:
 {val' VE}

Subgoal 4 is:
 {val' VE'}

Subgoal 5 is:
 forall J1 V1 V1' V2 V2', lt J1 J -> equiv_ch T1 J1 V1 V1' ->
   equiv_ch (arr T1 T2) J1 V2 V2' ->
   sim_ch T2 J1 (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_closed < search.
Subgoal 3:

Variables: J K VE' R' VE R T2 T1
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (clos' (abs' R) VE)}
H5 : {tm' (clos' (abs' R') VE')}
H6 : {val' VE}
H7 : {val' VE'}
H8 : forall J V1 V1' V2 V2', lt J K -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {val' VE}

Subgoal 4 is:
 {val' VE'}

Subgoal 5 is:
 forall J1 V1 V1' V2 V2', lt J1 J -> equiv_ch T1 J1 V1 V1' ->
   equiv_ch (arr T1 T2) J1 V2 V2' ->
   sim_ch T2 J1 (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_closed < search.
Subgoal 4:

Variables: J K VE' R' VE R T2 T1
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (clos' (abs' R) VE)}
H5 : {tm' (clos' (abs' R') VE')}
H6 : {val' VE}
H7 : {val' VE'}
H8 : forall J V1 V1' V2 V2', lt J K -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {val' VE'}

Subgoal 5 is:
 forall J1 V1 V1' V2 V2', lt J1 J -> equiv_ch T1 J1 V1 V1' ->
   equiv_ch (arr T1 T2) J1 V2 V2' ->
   sim_ch T2 J1 (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_closed < search.
Subgoal 5:

Variables: J K VE' R' VE R T2 T1
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (clos' (abs' R) VE)}
H5 : {tm' (clos' (abs' R') VE')}
H6 : {val' VE}
H7 : {val' VE'}
H8 : forall J V1 V1' V2 V2', lt J K -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 forall J1 V1 V1' V2 V2', lt J1 J -> equiv_ch T1 J1 V1 V1' ->
   equiv_ch (arr T1 T2) J1 V2 V2' ->
   sim_ch T2 J1 (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_closed < intros.
Subgoal 5:

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

equiv_ch_arr_closed < apply lt_le_compose to H9 H2.
Subgoal 5:

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

equiv_ch_arr_closed < apply H8 to H12 H10 H11.
Subgoal 5:

Variables: J K VE' R' VE R T2 T1 J1 V1 V1' V2 V2'
H1 : {is_nat K}
H2 : le J K
H4 : {tm' (clos' (abs' R) VE)}
H5 : {tm' (clos' (abs' R') VE')}
H6 : {val' VE}
H7 : {val' VE'}
H8 : forall J V1 V1' V2 V2', lt J K -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H9 : lt J1 J
H10 : equiv_ch T1 J1 V1 V1'
H11 : equiv_ch (arr T1 T2) J1 V2 V2'
H12 : lt J1 K
H13 : sim_ch T2 J1 (R (pair' V2 (pair' V1 VE)))
        (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 sim_ch T2 J1 (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_closed < search.
Proof completed.
Abella < Theorem equiv_ch_arr_to_equiv_ch : 
forall T K M M', {is_nat K} -> equiv_ch_arr T K M M' -> equiv_ch T K M M'.


============================
 forall T K M M', {is_nat K} -> equiv_ch_arr T K M M' -> equiv_ch T K M M'

equiv_ch_arr_to_equiv_ch < induction on 1.

IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
============================
 forall T K M M', {is_nat K}@ -> equiv_ch_arr T K M M' -> equiv_ch T K M M'

equiv_ch_arr_to_equiv_ch < intros.

Variables: T K M M'
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H1 : {is_nat K}@
H2 : equiv_ch_arr T K M M'
============================
 equiv_ch T K M M'

equiv_ch_arr_to_equiv_ch < case H2 (keep).

Variables: K VE' R' VE R T2 T1
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H1 : {is_nat K}@
H2 : equiv_ch_arr (arr T1 T2) K (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J K -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 equiv_ch (arr T1 T2) K (clos' (abs' R) VE) (clos' (abs' R') VE')

equiv_ch_arr_to_equiv_ch < case H1.
Subgoal 1:

Variables: VE' R' VE R T2 T1
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) z (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J z -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 equiv_ch (arr T1 T2) z (clos' (abs' R) VE) (clos' (abs' R') VE')

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

equiv_ch_arr_to_equiv_ch < search.
Subgoal 2:

Variables: VE' R' VE R T2 T1 N
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
============================
 equiv_ch (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')

equiv_ch_arr_to_equiv_ch < unfold.
Subgoal 2.1:

Variables: VE' R' VE R T2 T1 N
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
============================
 equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')

Subgoal 2.2 is:
 forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
   equiv_ch (arr T1 T2) N V2 V2' ->
   sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_to_equiv_ch < apply equiv_ch_arr_closed to _ _ H2 with J = N.
Subgoal 2.1.1:

Variables: VE' R' VE R T2 T1 N
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
============================
 le N (s N)

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

Subgoal 2.2 is:
 forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
   equiv_ch (arr T1 T2) N V2 V2' ->
   sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_to_equiv_ch < backchain le_succ.
Subgoal 2.1.1:

Variables: VE' R' VE R T2 T1 N
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
============================
 le N N

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

Subgoal 2.2 is:
 forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
   equiv_ch (arr T1 T2) N V2 V2' ->
   sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_to_equiv_ch < backchain le_refl.
Subgoal 2.1:

Variables: VE' R' VE R T2 T1 N
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
H9 : equiv_ch_arr (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
============================
 equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')

Subgoal 2.2 is:
 forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
   equiv_ch (arr T1 T2) N V2 V2' ->
   sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_to_equiv_ch < apply IH to H8 H9.
Subgoal 2.1:

Variables: VE' R' VE R T2 T1 N
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
H9 : equiv_ch_arr (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H10 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
============================
 equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')

Subgoal 2.2 is:
 forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
   equiv_ch (arr T1 T2) N V2 V2' ->
   sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_to_equiv_ch < search.
Subgoal 2.2:

Variables: VE' R' VE R T2 T1 N
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
============================
 forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
   equiv_ch (arr T1 T2) N V2 V2' ->
   sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_to_equiv_ch < intros.
Subgoal 2.2:

Variables: VE' R' VE R T2 T1 N V1 V1' V2 V2'
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
H9 : equiv_ch T1 N V1 V1'
H10 : equiv_ch (arr T1 T2) N V2 V2'
============================
 sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_arr_to_equiv_ch < backchain H7.
Subgoal 2.2:

Variables: VE' R' VE R T2 T1 N V1 V1' V2 V2'
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
H9 : equiv_ch T1 N V1 V1'
H10 : equiv_ch (arr T1 T2) N V2 V2'
============================
 lt N (s N)

equiv_ch_arr_to_equiv_ch < unfold.
Subgoal 2.2:

Variables: VE' R' VE R T2 T1 N V1 V1' V2 V2'
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
H9 : equiv_ch T1 N V1 V1'
H10 : equiv_ch (arr T1 T2) N V2 V2'
============================
 exists N1, {add N (s N1) (s N)}

equiv_ch_arr_to_equiv_ch < exists z.
Subgoal 2.2:

Variables: VE' R' VE R T2 T1 N V1 V1' V2 V2'
IH : forall T K M M', {is_nat K}* -> equiv_ch_arr T K M M' ->
       equiv_ch T K M M'
H2 : equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
       equiv_ch (arr T1 T2) J V2 V2' ->
       sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H8 : {is_nat N}*
H9 : equiv_ch T1 N V1 V1'
H10 : equiv_ch (arr T1 T2) N V2 V2'
============================
 {add N (s z) (s N)}

equiv_ch_arr_to_equiv_ch < backchain add_comm.
Proof completed.
Abella < Theorem equiv_ch_to_equiv_ch_arr : 
forall K T1 T2 M M', {is_nat K} -> equiv_ch (arr T1 T2) K M M' ->
  equiv_ch_arr (arr T1 T2) K M M'.


============================
 forall K T1 T2 M M', {is_nat K} -> equiv_ch (arr T1 T2) K M M' ->
   equiv_ch_arr (arr T1 T2) K M M'

equiv_ch_to_equiv_ch_arr < induction on 1.

IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
============================
 forall K T1 T2 M M', {is_nat K}@ -> equiv_ch (arr T1 T2) K M M' ->
   equiv_ch_arr (arr T1 T2) K M M'

equiv_ch_to_equiv_ch_arr < intros.

Variables: K T1 T2 M M'
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H1 : {is_nat K}@
H2 : equiv_ch (arr T1 T2) K M M'
============================
 equiv_ch_arr (arr T1 T2) K M M'

equiv_ch_to_equiv_ch_arr < case H1.
Subgoal 1:

Variables: T1 T2 M M'
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H2 : equiv_ch (arr T1 T2) z M M'
============================
 equiv_ch_arr (arr T1 T2) z M M'

Subgoal 2 is:
 equiv_ch_arr (arr T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr < case H2.
Subgoal 1:

Variables: T1 T2 VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
============================
 equiv_ch_arr (arr T1 T2) z (clos' (abs' R) VE) (clos' (abs' R') VE')

Subgoal 2 is:
 equiv_ch_arr (arr T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr < unfold.
Subgoal 1.1:

Variables: T1 T2 VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
============================
 {tm' (clos' (abs' R) VE)}

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

Subgoal 1.3 is:
 {val' VE}

Subgoal 1.4 is:
 {val' VE'}

Subgoal 1.5 is:
 forall J V1 V1' V2 V2', lt J z -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V2 V2' ->
   sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

Subgoal 2 is:
 equiv_ch_arr (arr T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr < search.
Subgoal 1.2:

Variables: T1 T2 VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
============================
 {tm' (clos' (abs' R') VE')}

Subgoal 1.3 is:
 {val' VE}

Subgoal 1.4 is:
 {val' VE'}

Subgoal 1.5 is:
 forall J V1 V1' V2 V2', lt J z -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V2 V2' ->
   sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

Subgoal 2 is:
 equiv_ch_arr (arr T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr < search.
Subgoal 1.3:

Variables: T1 T2 VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
============================
 {val' VE}

Subgoal 1.4 is:
 {val' VE'}

Subgoal 1.5 is:
 forall J V1 V1' V2 V2', lt J z -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V2 V2' ->
   sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

Subgoal 2 is:
 equiv_ch_arr (arr T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr < search.
Subgoal 1.4:

Variables: T1 T2 VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
============================
 {val' VE'}

Subgoal 1.5 is:
 forall J V1 V1' V2 V2', lt J z -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V2 V2' ->
   sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

Subgoal 2 is:
 equiv_ch_arr (arr T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr < search.
Subgoal 1.5:

Variables: T1 T2 VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
============================
 forall J V1 V1' V2 V2', lt J z -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V2 V2' ->
   sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

Subgoal 2 is:
 equiv_ch_arr (arr T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr < intros.
Subgoal 1.5:

Variables: T1 T2 VE' R' VE R J V1 V1' V2 V2'
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H7 : lt J z
H8 : equiv_ch T1 J V1 V1'
H9 : equiv_ch (arr T1 T2) J V2 V2'
============================
 sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

Subgoal 2 is:
 equiv_ch_arr (arr T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr < case H7.
Subgoal 1.5:

Variables: T1 T2 VE' R' VE R J V1 V1' V2 V2' N
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {tm' (clos' (abs' R) VE)}
H4 : {tm' (clos' (abs' R') VE')}
H5 : {val' VE}
H6 : {val' VE'}
H8 : equiv_ch T1 J V1 V1'
H9 : equiv_ch (arr T1 T2) J V2 V2'
H10 : {add J (s N) z}
============================
 sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

Subgoal 2 is:
 equiv_ch_arr (arr T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr < case H10.
Subgoal 2:

Variables: T1 T2 M M' N
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H2 : equiv_ch (arr T1 T2) (s N) M M'
H3 : {is_nat N}*
============================
 equiv_ch_arr (arr T1 T2) (s N) M M'

equiv_ch_to_equiv_ch_arr < case H2.
Subgoal 2:

Variables: T1 T2 N VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')

equiv_ch_to_equiv_ch_arr < apply IH to H3 H4.
Subgoal 2:

Variables: T1 T2 N VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H6 : equiv_ch_arr (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
============================
 equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')

equiv_ch_to_equiv_ch_arr < case H6.
Subgoal 2:

Variables: T1 T2 N VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 equiv_ch_arr (arr T1 T2) (s N) (clos' (abs' R) VE) (clos' (abs' R') VE')

equiv_ch_to_equiv_ch_arr < unfold.
Subgoal 2.1:

Variables: T1 T2 N VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {tm' (clos' (abs' R) VE)}

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

Subgoal 2.3 is:
 {val' VE}

Subgoal 2.4 is:
 {val' VE'}

Subgoal 2.5 is:
 forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V2 V2' ->
   sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < search.
Subgoal 2.2:

Variables: T1 T2 N VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {tm' (clos' (abs' R') VE')}

Subgoal 2.3 is:
 {val' VE}

Subgoal 2.4 is:
 {val' VE'}

Subgoal 2.5 is:
 forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V2 V2' ->
   sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < search.
Subgoal 2.3:

Variables: T1 T2 N VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {val' VE}

Subgoal 2.4 is:
 {val' VE'}

Subgoal 2.5 is:
 forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V2 V2' ->
   sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < search.
Subgoal 2.4:

Variables: T1 T2 N VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 {val' VE'}

Subgoal 2.5 is:
 forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V2 V2' ->
   sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < search.
Subgoal 2.5:

Variables: T1 T2 N VE' R' VE R
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
============================
 forall J V1 V1' V2 V2', lt J (s N) -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V2 V2' ->
   sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < intros.
Subgoal 2.5:

Variables: T1 T2 N VE' R' VE R J V1 V1' V2 V2'
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H12 : lt J (s N)
H13 : equiv_ch T1 J V1 V1'
H14 : equiv_ch (arr T1 T2) J V2 V2'
============================
 sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < case H12.
Subgoal 2.5:

Variables: T1 T2 N VE' R' VE R J V1 V1' V2 V2' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H13 : equiv_ch T1 J V1 V1'
H14 : equiv_ch (arr T1 T2) J V2 V2'
H15 : {add J (s N1) (s N)}
============================
 sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < apply add_s_inv to H15.
Subgoal 2.5:

Variables: T1 T2 N VE' R' VE R J V1 V1' V2 V2' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H13 : equiv_ch T1 J V1 V1'
H14 : equiv_ch (arr T1 T2) J V2 V2'
H15 : {add J (s N1) (s N)}
H16 : {add J N1 N}
============================
 sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < assert le J N.
Subgoal 2.5:

Variables: T1 T2 N VE' R' VE R J V1 V1' V2 V2' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H13 : equiv_ch T1 J V1 V1'
H14 : equiv_ch (arr T1 T2) J V2 V2'
H15 : {add J (s N1) (s N)}
H16 : {add J N1 N}
H17 : le J N
============================
 sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < apply le_to_lt to _ H17.
Subgoal 2.5:

Variables: T1 T2 N VE' R' VE R J V1 V1' V2 V2' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H13 : equiv_ch T1 J V1 V1'
H14 : equiv_ch (arr T1 T2) J V2 V2'
H15 : {add J (s N1) (s N)}
H16 : {add J N1 N}
H17 : le J N
H18 : J = N \/ lt J N
============================
 sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < case H18.
Subgoal 2.5.1:

Variables: T1 T2 N VE' R' VE R V1 V1' V2 V2' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H13 : equiv_ch T1 N V1 V1'
H14 : equiv_ch (arr T1 T2) N V2 V2'
H15 : {add N (s N1) (s N)}
H16 : {add N N1 N}
H17 : le N N
============================
 sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

Subgoal 2.5.2 is:
 sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < backchain H5.
Subgoal 2.5.2:

Variables: T1 T2 N VE' R' VE R J V1 V1' V2 V2' N1
IH : forall K T1 T2 M M', {is_nat K}* -> equiv_ch (arr T1 T2) K M M' ->
       equiv_ch_arr (arr T1 T2) K M M'
H3 : {is_nat N}*
H4 : equiv_ch (arr T1 T2) N (clos' (abs' R) VE) (clos' (abs' R') VE')
H5 : forall V1 V1' V2 V2', equiv_ch T1 N V1 V1' ->
       equiv_ch (arr T1 T2) N V2 V2' ->
       sim_ch T2 N (R (pair' V2 (pair' V1 VE)))
         (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H7 : {tm' (clos' (abs' R) VE)}
H8 : {tm' (clos' (abs' R') VE')}
H9 : {val' VE}
H10 : {val' VE'}
H11 : forall J V1 V1' V2 V2', lt J N -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T2) J V2 V2' ->
        sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
          (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))
H13 : equiv_ch T1 J V1 V1'
H14 : equiv_ch (arr T1 T2) J V2 V2'
H15 : {add J (s N1) (s N)}
H16 : {add J N1 N}
H17 : le J N
H19 : lt J N
============================
 sim_ch T2 J (R (pair' V2 (pair' V1 VE)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' VE')))))

equiv_ch_to_equiv_ch_arr < backchain H11.
Proof completed.
Abella < Theorem app_equiv_ch_arr : 
forall T1 T F E F' E' N1 N2 V1 V1' K, {is_cty (arr' T1 T)} -> {is_nat N1} ->
  {is_nat N2} ->
  equiv_ch (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E') ->
  equiv_ch T1 N2 V1 V1' -> lt K N1 -> lt K N2 ->
  sim_ch T K (F (pair' (clos' (abs' F) E) (pair' V1 E)))
    (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V1' E'))))).


============================
 forall T1 T F E F' E' N1 N2 V1 V1' K, {is_cty (arr' T1 T)} -> {is_nat N1} ->
   {is_nat N2} ->
   equiv_ch (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E') ->
   equiv_ch T1 N2 V1 V1' -> lt K N1 -> lt K N2 ->
   sim_ch T K (F (pair' (clos' (abs' F) E) (pair' V1 E)))
     (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V1' E')))))

app_equiv_ch_arr < intros.

Variables: T1 T F E F' E' N1 N2 V1 V1' K
H1 : {is_cty (arr' T1 T)}
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
============================
 sim_ch T K (F (pair' (clos' (abs' F) E) (pair' V1 E)))
   (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V1' E')))))

app_equiv_ch_arr < case H1.

Variables: T1 T F E F' E' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
============================
 sim_ch T K (F (pair' (clos' (abs' F) E) (pair' V1 E)))
   (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V1' E')))))

app_equiv_ch_arr < apply equiv_ch_to_equiv_ch_arr to _ H4.

Variables: T1 T F E F' E' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
H10 : equiv_ch_arr (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E')
============================
 sim_ch T K (F (pair' (clos' (abs' F) E) (pair' V1 E)))
   (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V1' E')))))

app_equiv_ch_arr < case H10.

Variables: T1 T F E F' E' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
H11 : {tm' (clos' (abs' F) E)}
H12 : {tm' (clos' (abs' F') E')}
H13 : {val' E}
H14 : {val' E'}
H15 : forall J V1 V1' V2 V2', lt J N1 -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T) J V2 V2' ->
        sim_ch T J (F (pair' V2 (pair' V1 E)))
          (htm nil (hbase (F' (pair' V2' (pair' V1' E')))))
============================
 sim_ch T K (F (pair' (clos' (abs' F) E) (pair' V1 E)))
   (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V1' E')))))

app_equiv_ch_arr < backchain H15.
Subgoal 1:

Variables: T1 T F E F' E' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
H11 : {tm' (clos' (abs' F) E)}
H12 : {tm' (clos' (abs' F') E')}
H13 : {val' E}
H14 : {val' E'}
H15 : forall J V1 V1' V2 V2', lt J N1 -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T) J V2 V2' ->
        sim_ch T J (F (pair' V2 (pair' V1 E)))
          (htm nil (hbase (F' (pair' V2' (pair' V1' E')))))
============================
 equiv_ch T1 K V1 V1'

Subgoal 2 is:
 equiv_ch (arr T1 T) K (clos' (abs' F) E) (clos' (abs' F') E')

app_equiv_ch_arr < backchain equiv_ch_closed with K = N2.
Subgoal 1:

Variables: T1 T F E F' E' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
H11 : {tm' (clos' (abs' F) E)}
H12 : {tm' (clos' (abs' F') E')}
H13 : {val' E}
H14 : {val' E'}
H15 : forall J V1 V1' V2 V2', lt J N1 -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T) J V2 V2' ->
        sim_ch T J (F (pair' V2 (pair' V1 E)))
          (htm nil (hbase (F' (pair' V2' (pair' V1' E')))))
============================
 le K N2

Subgoal 2 is:
 equiv_ch (arr T1 T) K (clos' (abs' F) E) (clos' (abs' F') E')

app_equiv_ch_arr < backchain lt_to_le.
Subgoal 2:

Variables: T1 T F E F' E' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
H11 : {tm' (clos' (abs' F) E)}
H12 : {tm' (clos' (abs' F') E')}
H13 : {val' E}
H14 : {val' E'}
H15 : forall J V1 V1' V2 V2', lt J N1 -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T) J V2 V2' ->
        sim_ch T J (F (pair' V2 (pair' V1 E)))
          (htm nil (hbase (F' (pair' V2' (pair' V1' E')))))
============================
 equiv_ch (arr T1 T) K (clos' (abs' F) E) (clos' (abs' F') E')

app_equiv_ch_arr < backchain equiv_ch_closed with K = N1.
Subgoal 2:

Variables: T1 T F E F' E' N1 N2 V1 V1' K
H2 : {is_nat N1}
H3 : {is_nat N2}
H4 : equiv_ch (arr T1 T) N1 (clos' (abs' F) E) (clos' (abs' F') E')
H5 : equiv_ch T1 N2 V1 V1'
H6 : lt K N1
H7 : lt K N2
H8 : {is_cty T1}
H9 : {is_cty T}
H11 : {tm' (clos' (abs' F) E)}
H12 : {tm' (clos' (abs' F') E')}
H13 : {val' E}
H14 : {val' E'}
H15 : forall J V1 V1' V2 V2', lt J N1 -> equiv_ch T1 J V1 V1' ->
        equiv_ch (arr T1 T) J V2 V2' ->
        sim_ch T J (F (pair' V2 (pair' V1 E)))
          (htm nil (hbase (F' (pair' V2' (pair' V1' E')))))
============================
 le K N1

app_equiv_ch_arr < backchain lt_to_le.
Proof completed.
Abella < Theorem sim_ch_eval''_closed : 
forall T K M M' M'', sim_ch T K M M' ->
  (forall V, {eval'' M' V} -> {eval'' M'' V}) -> sim_ch T K M M''.


============================
 forall T K M M' M'', sim_ch T K M M' ->
   (forall V, {eval'' M' V} -> {eval'' M'' V}) -> sim_ch T K M M''

sim_ch_eval''_closed < intros.

Variables: T K M M' M''
H1 : sim_ch T K M M'
H2 : forall V, {eval'' M' V} -> {eval'' M'' V}
============================
 sim_ch T K M M''

sim_ch_eval''_closed < case H1.

Variables: T K M M' M''
H2 : forall V, {eval'' M' V} -> {eval'' M'' V}
H3 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' M' V'} /\ {add J N K} /\ equiv_ch T N V V')
============================
 sim_ch T K M M''

sim_ch_eval''_closed < unfold.

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

sim_ch_eval''_closed < intros.

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

sim_ch_eval''_closed < apply H3 to _ H5 _.

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

sim_ch_eval''_closed < apply H2 to H7.

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

sim_ch_eval''_closed < search.
Proof completed.
Abella < Theorem sim_ch_nstep : 
forall T K M M' J I V, sim_ch T K M M' -> {nstep' J M V} -> {val' V} ->
  {add J I K} -> (exists V', {eval'' M' V'} /\ equiv_ch T I V V').


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

sim_ch_nstep < intros.

Variables: T K M M' J I V
H1 : sim_ch T K M M'
H2 : {nstep' J M V}
H3 : {val' V}
H4 : {add J I K}
============================
 exists V', {eval'' M' V'} /\ equiv_ch T I V V'

sim_ch_nstep < case H1.

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

sim_ch_nstep < apply H5 to _ H2 H3.

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

sim_ch_nstep < exists V'.

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

sim_ch_nstep < split.
Subgoal 1:

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

Subgoal 2 is:
 equiv_ch T I V V'

sim_ch_nstep < search.
Subgoal 2:

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

sim_ch_nstep < assert I = N.
Subgoal 2.1:

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

Subgoal 2 is:
 equiv_ch T I V V'

sim_ch_nstep < backchain add_arg2_det.
Subgoal 2:

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

sim_ch_nstep < case H9.
Subgoal 2:

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

sim_ch_nstep < search.
Proof completed.
Abella < Theorem sim_ch_nat' : 
forall K N, sim_ch tnat K (nat' N) (htm nil (hbase (nat' N))).


============================
 forall K N, sim_ch tnat K (nat' N) (htm nil (hbase (nat' N)))

sim_ch_nat' < intros.

Variables: K N
============================
 sim_ch tnat K (nat' N) (htm nil (hbase (nat' N)))

sim_ch_nat' < unfold.

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

sim_ch_nat' < intros.

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

sim_ch_nat' < apply nstep'_val'_inv to _ H2.

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

sim_ch_nat' < search.
Proof completed.
Abella < Theorem sim_ch_pred' : 
forall K M M' M'' FE, sim_ch tnat K M (htm FE M') ->
  {hconstr M' (x\pred' x) M''} -> sim_ch tnat K (pred' M) (htm FE M'').


============================
 forall K M M' M'' FE, sim_ch tnat K M (htm FE M') ->
   {hconstr M' (x\pred' x) M''} -> sim_ch tnat K (pred' M) (htm FE M'')

sim_ch_pred' < intros.

Variables: K M M' M'' FE
H1 : sim_ch tnat K M (htm FE M')
H2 : {hconstr M' (x\pred' x) M''}
============================
 sim_ch tnat K (pred' M) (htm FE M'')

sim_ch_pred' < case H1.

Variables: K M M' M'' FE
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
            equiv_ch tnat N V V')
============================
 sim_ch tnat K (pred' M) (htm FE M'')

sim_ch_pred' < unfold.

Variables: K M M' M'' FE
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
            equiv_ch tnat N V V')
============================
 forall J V, le J K -> {nstep' J (pred' M) V} -> {val' V} ->
   (exists V' N, {eval'' (htm FE M'') V'} /\ {add J N K} /\
        equiv_ch tnat N V V')

sim_ch_pred' < intros.

Variables: K M M' M'' FE J V
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
            equiv_ch tnat N V V')
H4 : le J K
H5 : {nstep' J (pred' M) V}
H6 : {val' V}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add J N K} /\ equiv_ch tnat N V V'

sim_ch_pred' < apply nstep'_pred_inv to H6 H5.

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

sim_ch_pred' < case H4.

Variables: K M M' M'' FE J1 N N' N1
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H9 : {add (s J1) N1 K}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s J1) N K} /\
   equiv_ch tnat N (nat' N') V'

sim_ch_pred' < case H9.

Variables: M M' M'' FE J1 N N' N1 N3
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H10 : {add J1 N1 N3}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s J1) N (s N3)} /\
   equiv_ch tnat N (nat' N') V'

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

Variables: M M' M'' FE J1 N N' N1 N3
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H10 : {add J1 N1 N3}
============================
 {add J1 (s N1) (s N3)}

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

sim_ch_pred' < backchain add_s.

Variables: M M' M'' FE J1 N N' N1 N3
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H10 : {add J1 N1 N3}
H11 : {add J1 (s N1) (s N3)}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s J1) N (s N3)} /\
   equiv_ch tnat N (nat' N') V'

sim_ch_pred' < apply H3 to _ H7 _ with J = J1.

Variables: M M' M'' FE J1 N N' N1 N3 V' N2
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H10 : {add J1 N1 N3}
H11 : {add J1 (s N1) (s N3)}
H12 : {eval'' (htm FE M') V'}
H13 : {add J1 N2 (s N3)}
H14 : equiv_ch tnat N2 (nat' N) V'
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s J1) N (s N3)} /\
   equiv_ch tnat N (nat' N') V'

sim_ch_pred' < case H14.

Variables: M M' M'' FE J1 N N' N1 N3 N2
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H10 : {add J1 N1 N3}
H11 : {add J1 (s N1) (s N3)}
H12 : {eval'' (htm FE M') (nat' N)}
H13 : {add J1 N2 (s N3)}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s J1) N (s N3)} /\
   equiv_ch tnat N (nat' N') V'

sim_ch_pred' < exists nat' N'.

Variables: M M' M'' FE J1 N N' N1 N3 N2
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H10 : {add J1 N1 N3}
H11 : {add J1 (s N1) (s N3)}
H12 : {eval'' (htm FE M') (nat' N)}
H13 : {add J1 N2 (s N3)}
============================
 exists N, {eval'' (htm FE M'') (nat' N')} /\ {add (s J1) N (s N3)} /\
   equiv_ch tnat N (nat' N') (nat' N')

sim_ch_pred' < exists N1.

Variables: M M' M'' FE J1 N N' N1 N3 N2
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H10 : {add J1 N1 N3}
H11 : {add J1 (s N1) (s N3)}
H12 : {eval'' (htm FE M') (nat' N)}
H13 : {add J1 N2 (s N3)}
============================
 {eval'' (htm FE M'') (nat' N')} /\ {add (s J1) N1 (s N3)} /\
   equiv_ch tnat N1 (nat' N') (nat' N')

sim_ch_pred' < split.
Subgoal 2:

Variables: M M' M'' FE J1 N N' N1 N3 N2
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H10 : {add J1 N1 N3}
H11 : {add J1 (s N1) (s N3)}
H12 : {eval'' (htm FE M') (nat' N)}
H13 : {add J1 N2 (s N3)}
============================
 {eval'' (htm FE M'') (nat' N')}

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

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

sim_ch_pred' < backchain eval''_pred_fwd.
Subgoal 3:

Variables: M M' M'' FE J1 N N' N1 N3 N2
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H10 : {add J1 N1 N3}
H11 : {add J1 (s N1) (s N3)}
H12 : {eval'' (htm FE M') (nat' N)}
H13 : {add J1 N2 (s N3)}
============================
 {add (s J1) N1 (s N3)}

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

sim_ch_pred' < search.
Subgoal 4:

Variables: M M' M'' FE J1 N N' N1 N3 N2
H2 : {hconstr M' (x\pred' x) M''}
H3 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
       (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
            equiv_ch tnat N V V')
H5 : {nstep' (s J1) (pred' M) (nat' N')}
H6 : {val' (nat' N')}
H7 : {nstep' J1 M (nat' N)}
H8 : {npred N N'}
H10 : {add J1 N1 N3}
H11 : {add J1 (s N1) (s N3)}
H12 : {eval'' (htm FE M') (nat' N)}
H13 : {add J1 N2 (s N3)}
============================
 equiv_ch tnat N1 (nat' N') (nat' N')

sim_ch_pred' < search.
Proof completed.
Abella < Theorem sim_ch_plus' : 
forall K M1 M2 M1' M2' FE1 FE2 FE P, {is_nat K} ->
  sim_ch tnat K M1 (htm FE1 M1') -> sim_ch tnat K M2 (htm FE2 M2') ->
  {appd FE1 FE2 FE} -> {hcombine M1' M2' (x\y\plus' x y) P} ->
  sim_ch tnat K (plus' M1 M2) (htm FE P).


============================
 forall K M1 M2 M1' M2' FE1 FE2 FE P, {is_nat K} ->
   sim_ch tnat K M1 (htm FE1 M1') -> sim_ch tnat K M2 (htm FE2 M2') ->
   {appd FE1 FE2 FE} -> {hcombine M1' M2' (x\y\plus' x y) P} ->
   sim_ch tnat K (plus' M1 M2) (htm FE P)

sim_ch_plus' < intros.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P
H1 : {is_nat K}
H2 : sim_ch tnat K M1 (htm FE1 M1')
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
============================
 sim_ch tnat K (plus' M1 M2) (htm FE P)

sim_ch_plus' < unfold.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P
H1 : {is_nat K}
H2 : sim_ch tnat K M1 (htm FE1 M1')
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
============================
 forall J V, le J K -> {nstep' J (plus' M1 M2) V} -> {val' V} ->
   (exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
        equiv_ch tnat N V V')

sim_ch_plus' < intros.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J V
H1 : {is_nat K}
H2 : sim_ch tnat K M1 (htm FE1 M1')
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le J K
H7 : {nstep' J (plus' M1 M2) V}
H8 : {val' V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch tnat N V V'

sim_ch_plus' < apply nstep'_plus_inv to H8 H7.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H2 : sim_ch tnat K M1 (htm FE1 M1')
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < assert le J1 K.
Subgoal 1:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H2 : sim_ch tnat K M1 (htm FE1 M1')
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
============================
 le J1 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < apply add_s to H9.
Subgoal 1:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H2 : sim_ch tnat K M1 (htm FE1 M1')
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : {add J1 (s J2) (s J12)}
============================
 le J1 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < apply le_trans to _ H6.
Subgoal 1:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H2 : sim_ch tnat K M1 (htm FE1 M1')
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : {add J1 (s J2) (s J12)}
H14 : le J1 K
============================
 le J1 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < search.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H2 : sim_ch tnat K M1 (htm FE1 M1')
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < case H2.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < apply H14 to H13 H10 _.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 V' N
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') V'}
H16 : {add J1 N K}
H17 : equiv_ch tnat N (nat' N1) V'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < case H17.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < assert le J2 K.
Subgoal 2:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
============================
 le J2 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < apply add_comm to _ H9.
Subgoal 2.1:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
============================
 {is_nat J12}

Subgoal 2 is:
 le J2 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < case H6.
Subgoal 2.1:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N N4
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : {add (s J12) N4 K}
============================
 {is_nat J12}

Subgoal 2 is:
 le J2 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < apply add_arg1_isnat to H18.
Subgoal 2.1:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N N4
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : {add (s J12) N4 K}
H19 : {is_nat (s J12)}
============================
 {is_nat J12}

Subgoal 2 is:
 le J2 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < case H19.
Subgoal 2.1:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N N4
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : {add (s J12) N4 K}
H20 : {is_nat J12}
============================
 {is_nat J12}

Subgoal 2 is:
 le J2 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < search.
Subgoal 2:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : {add J2 J1 J12}
============================
 le J2 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < apply add_s to H18.
Subgoal 2:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : {add J2 J1 J12}
H19 : {add J2 (s J1) (s J12)}
============================
 le J2 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < apply le_trans to _ H6.
Subgoal 2:

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : {add J2 J1 J12}
H19 : {add J2 (s J1) (s J12)}
H20 : le J2 K
============================
 le J2 K

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < search.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H3 : sim_ch tnat K M2 (htm FE2 M2')
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : le J2 K
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < case H3.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N
H1 : {is_nat K}
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : le J2 K
H19 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < apply H19 to H18 H11 _.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N V'1 N4
H1 : {is_nat K}
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : le J2 K
H19 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H20 : {eval'' (htm FE2 M2') V'1}
H21 : {add J2 N4 K}
H22 : equiv_ch tnat N4 (nat' N2) V'1
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < case H22.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N N4
H1 : {is_nat K}
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : le J2 K
H19 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H20 : {eval'' (htm FE2 M2') (nat' N2)}
H21 : {add J2 N4 K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < apply eval''_plus_fwd to _ H20 H12 H4 H5.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N N4
H1 : {is_nat K}
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H6 : le (s J12) K
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : le J2 K
H19 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H20 : {eval'' (htm FE2 M2') (nat' N2)}
H21 : {add J2 N4 K}
H23 : {eval'' (htm FE P) (nat' N3)}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < case H6.

Variables: K M1 M2 M1' M2' FE1 FE2 FE P J1 J2 J12 N1 N2 N3 N N4 N5
H1 : {is_nat K}
H4 : {appd FE1 FE2 FE}
H5 : {hcombine M1' M2' (x\y\plus' x y) P}
H7 : {nstep' (s J12) (plus' M1 M2) (nat' N3)}
H8 : {val' (nat' N3)}
H9 : {add J1 J2 J12}
H10 : {nstep' J1 M1 (nat' N1)}
H11 : {nstep' J2 M2 (nat' N2)}
H12 : {add N1 N2 N3}
H13 : le J1 K
H14 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H15 : {eval'' (htm FE1 M1') (nat' N1)}
H16 : {add J1 N K}
H18 : le J2 K
H19 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H20 : {eval'' (htm FE2 M2') (nat' N2)}
H21 : {add J2 N4 K}
H23 : {eval'' (htm FE P) (nat' N3)}
H24 : {add (s J12) N5 K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J12) N K} /\
   equiv_ch tnat N (nat' N3) V'

sim_ch_plus' < search.
Proof completed.
Abella < Theorem sim_ch_ifz' : 
forall K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P, {is_nat K} ->
  {is_cty T} -> {tm'' (htm FE2 M2')} -> {tm'' (htm FE3 M3')} ->
  sim_ch tnat K M1 (htm FE1 M1') -> sim_ch T K M2 (htm FE2 M2') ->
  sim_ch T K M3 (htm FE3 M3') -> {appd FE1 FE2 FE12} -> {appd FE12 FE3 FE} ->
  {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P} ->
  sim_ch T K (ifz' M1 M2 M3) (htm FE P).


============================
 forall K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P, {is_nat K} ->
   {is_cty T} -> {tm'' (htm FE2 M2')} -> {tm'' (htm FE3 M3')} ->
   sim_ch tnat K M1 (htm FE1 M1') -> sim_ch T K M2 (htm FE2 M2') ->
   sim_ch T K M3 (htm FE3 M3') -> {appd FE1 FE2 FE12} ->
   {appd FE12 FE3 FE} -> {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P} ->
   sim_ch T K (ifz' M1 M2 M3) (htm FE P)

sim_ch_ifz' < intros.

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H5 : sim_ch tnat K M1 (htm FE1 M1')
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
============================
 sim_ch T K (ifz' M1 M2 M3) (htm FE P)

sim_ch_ifz' < unfold.

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H5 : sim_ch tnat K M1 (htm FE1 M1')
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
============================
 forall J V, le J K -> {nstep' J (ifz' M1 M2 M3) V} -> {val' V} ->
   (exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V')

sim_ch_ifz' < intros.

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H5 : sim_ch tnat K M1 (htm FE1 M1')
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < apply nstep'_ifz_inv to _ _ H12.
Subgoal 1:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H5 : sim_ch tnat K M1 (htm FE1 M1')
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
============================
 {is_nat J}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < case H11.
Subgoal 1:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V N
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H5 : sim_ch tnat K M1 (htm FE1 M1')
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : {add J N K}
============================
 {is_nat J}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < backchain add_arg1_isnat.

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H5 : sim_ch tnat K M1 (htm FE1 M1')
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H16 : {nstep' J1 M1 (nat' z)} /\ {nstep' I M2 V} \/
        {nstep' J1 M1 (nat' (s N))} /\ {nstep' I M3 V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < case H16.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H5 : sim_ch tnat K M1 (htm FE1 M1')
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < apply le_trans to H14 H11.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H5 : sim_ch tnat K M1 (htm FE1 M1')
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < case H5.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < apply H20 to _ H17 _.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') V'}
H22 : {add J1 N1 K}
H23 : equiv_ch tnat N1 (nat' z) V'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < apply le_trans to H15 H11.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') V'}
H22 : {add J1 N1 K}
H23 : equiv_ch tnat N1 (nat' z) V'
H24 : le I K
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < case H6.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') V'}
H22 : {add J1 N1 K}
H23 : equiv_ch tnat N1 (nat' z) V'
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < apply H25 to _ H18 _.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N V' N1
           V'1 N2
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') V'}
H22 : {add J1 N1 K}
H23 : equiv_ch tnat N1 (nat' z) V'
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < case H23.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' z)}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < case H11.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' z)}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < exists V'1.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' z)}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 exists N, {eval'' (htm FE P) V'1} /\ {add J N K} /\ equiv_ch T N V V'1

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < exists N3.
Subgoal 2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' z)}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 {eval'' (htm FE P) V'1} /\ {add J N3 K} /\ equiv_ch T N3 V V'1

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < split.
Subgoal 2.1:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' z)}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 {eval'' (htm FE P) V'1}

Subgoal 2.2 is:
 {add J N3 K}

Subgoal 2.3 is:
 equiv_ch T N3 V V'1

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < backchain eval''_ifz_fwd1 with FE3 = FE3.
Subgoal 2.2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' z)}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 {add J N3 K}

Subgoal 2.3 is:
 equiv_ch T N3 V V'1

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < search.
Subgoal 2.3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' z)}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 equiv_ch T N3 V V'1

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < backchain equiv_ch_closed with K = N2.
Subgoal 2.3.1:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' z)}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 {is_nat N2}

Subgoal 2.3.2 is:
 le N3 N2

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < backchain add_arg2_isnat.
Subgoal 2.3.2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' z)}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 le N3 N2

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

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

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' z)}
H18 : {nstep' I M2 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' z)}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 {is_nat N2}

Subgoal 3 is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < backchain add_arg2_isnat.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H5 : sim_ch tnat K M1 (htm FE1 M1')
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < apply le_trans to H14 H11.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H5 : sim_ch tnat K M1 (htm FE1 M1')
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < case H5.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < apply H20 to _ H17 _.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') V'}
H22 : {add J1 N1 K}
H23 : equiv_ch tnat N1 (nat' (s N)) V'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < apply le_trans to H15 H11.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H7 : sim_ch T K M3 (htm FE3 M3')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') V'}
H22 : {add J1 N1 K}
H23 : equiv_ch tnat N1 (nat' (s N)) V'
H24 : le I K
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < case H7.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N V' N1
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') V'}
H22 : {add J1 N1 K}
H23 : equiv_ch tnat N1 (nat' (s N)) V'
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < apply H25 to _ H18 _.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N V' N1
           V'1 N2
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') V'}
H22 : {add J1 N1 K}
H23 : equiv_ch tnat N1 (nat' (s N)) V'
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < case H23.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H11 : le J K
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' (s N))}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < case H11.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' (s N))}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_ifz' < exists V'1.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' (s N))}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 exists N, {eval'' (htm FE P) V'1} /\ {add J N K} /\ equiv_ch T N V V'1

sim_ch_ifz' < exists N3.
Subgoal 3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' (s N))}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 {eval'' (htm FE P) V'1} /\ {add J N3 K} /\ equiv_ch T N3 V V'1

sim_ch_ifz' < split.
Subgoal 3.1:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' (s N))}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 {eval'' (htm FE P) V'1}

Subgoal 3.2 is:
 {add J N3 K}

Subgoal 3.3 is:
 equiv_ch T N3 V V'1

sim_ch_ifz' < backchain eval''_ifz_fwd2 with FE2 = FE2.
Subgoal 3.2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' (s N))}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 {add J N3 K}

Subgoal 3.3 is:
 equiv_ch T N3 V V'1

sim_ch_ifz' < search.
Subgoal 3.3:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' (s N))}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 equiv_ch T N3 V V'1

sim_ch_ifz' < backchain equiv_ch_closed with K = N2.
Subgoal 3.3.1:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' (s N))}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 {is_nat N2}

Subgoal 3.3.2 is:
 le N3 N2

sim_ch_ifz' < backchain add_arg2_isnat.
Subgoal 3.3.2:

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' (s N))}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 le N3 N2

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

Variables: K T M1 M2 M3 M1' M2' M3' FE1 FE2 FE12 FE3 FE P J V I J1 N N1 V'1
           N2 N3
H1 : {is_nat K}
H2 : {is_cty T}
H3 : {tm'' (htm FE2 M2')}
H4 : {tm'' (htm FE3 M3')}
H6 : sim_ch T K M2 (htm FE2 M2')
H8 : {appd FE1 FE2 FE12}
H9 : {appd FE12 FE3 FE}
H10 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) P}
H12 : {nstep' J (ifz' M1 M2 M3) V}
H13 : {val' V}
H14 : le J1 J
H15 : le I J
H17 : {nstep' J1 M1 (nat' (s N))}
H18 : {nstep' I M3 V}
H19 : le J1 K
H20 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch tnat N V V')
H21 : {eval'' (htm FE1 M1') (nat' (s N))}
H22 : {add J1 N1 K}
H24 : le I K
H25 : forall J V, le J K -> {nstep' J M3 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE3 M3') V'} /\ {add J N K} /\
             equiv_ch T N V V')
H26 : {eval'' (htm FE3 M3') V'1}
H27 : {add I N2 K}
H28 : equiv_ch T N2 V V'1
H29 : {add J N3 K}
============================
 {is_nat N2}

sim_ch_ifz' < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_ch_unit' : 
forall K, sim_ch tunit K unit' (htm nil (hbase unit')).


============================
 forall K, sim_ch tunit K unit' (htm nil (hbase unit'))

sim_ch_unit' < intros.

Variables: K
============================
 sim_ch tunit K unit' (htm nil (hbase unit'))

sim_ch_unit' < unfold.

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

sim_ch_unit' < intros.

Variables: K J V
H1 : le J K
H2 : {nstep' J unit' V}
H3 : {val' V}
============================
 exists V' N, {eval'' (htm nil (hbase unit')) V'} /\ {add J N K} /\
   equiv_ch tunit N V V'

sim_ch_unit' < apply nstep'_val'_inv to _ H2.

Variables: K
H1 : le z K
H2 : {nstep' z unit' unit'}
H3 : {val' unit'}
============================
 exists V' N, {eval'' (htm nil (hbase unit')) V'} /\ {add z N K} /\
   equiv_ch tunit N unit' V'

sim_ch_unit' < search.
Proof completed.
Abella < Theorem sim_ch_pair' : 
forall K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P, {is_nat K} -> {is_cty T1} ->
  {is_cty T2} -> sim_ch T1 K M1 (htm FE1 M1') ->
  sim_ch T2 K M2 (htm FE2 M2') -> {appd FE1 FE2 FE} ->
  {hcombine M1' M2' (x\y\pair' x y) P} ->
  sim_ch (prod T1 T2) K (pair' M1 M2) (htm FE P).


============================
 forall K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P, {is_nat K} -> {is_cty T1} ->
   {is_cty T2} -> sim_ch T1 K M1 (htm FE1 M1') ->
   sim_ch T2 K M2 (htm FE2 M2') -> {appd FE1 FE2 FE} ->
   {hcombine M1' M2' (x\y\pair' x y) P} ->
   sim_ch (prod T1 T2) K (pair' M1 M2) (htm FE P)

sim_ch_pair' < intros.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch T1 K M1 (htm FE1 M1')
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
============================
 sim_ch (prod T1 T2) K (pair' M1 M2) (htm FE P)

sim_ch_pair' < unfold.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch T1 K M1 (htm FE1 M1')
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
============================
 forall J V, le J K -> {nstep' J (pair' M1 M2) V} -> {val' V} ->
   (exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
        equiv_ch (prod T1 T2) N V V')

sim_ch_pair' < intros.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J V
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch T1 K M1 (htm FE1 M1')
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) V}
H10 : {val' V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N V V'

sim_ch_pair' < apply nstep'_pair_inv to _ H9.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch T1 K M1 (htm FE1 M1')
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H10 : {val' (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < case H10.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch T1 K M1 (htm FE1 M1')
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < case H8 (keep).

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch T1 K M1 (htm FE1 M1')
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < apply le_trans to _ H8.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch T1 K M1 (htm FE1 M1')
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < case H4.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < apply H18 to _ H12 _.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < apply add_arg1_isnat to H16.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < apply add_comm to _ H11.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < apply le_trans to _ H8 with N1 = J1.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H5 : sim_ch T2 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < case H5.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < apply H25 to _ H13 _.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) V'

sim_ch_pair' < exists pair' V' V'1.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 exists N, {eval'' (htm FE P) (pair' V' V'1)} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) (pair' V' V'1)

sim_ch_pair' < exists N.

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 {eval'' (htm FE P) (pair' V' V'1)} /\ {add J N K} /\
   equiv_ch (prod T1 T2) N (pair' V1 V2) (pair' V' V'1)

sim_ch_pair' < split.
Subgoal 1:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 {eval'' (htm FE P) (pair' V' V'1)}

Subgoal 2 is:
 {add J N K}

Subgoal 3 is:
 equiv_ch (prod T1 T2) N (pair' V1 V2) (pair' V' V'1)

sim_ch_pair' < backchain eval''_pair_fwd.
Subgoal 2:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 {add J N K}

Subgoal 3 is:
 equiv_ch (prod T1 T2) N (pair' V1 V2) (pair' V' V'1)

sim_ch_pair' < search.
Subgoal 3:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 equiv_ch (prod T1 T2) N (pair' V1 V2) (pair' V' V'1)

sim_ch_pair' < unfold.
Subgoal 3.1:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 equiv_ch T1 N V1 V'

Subgoal 3.2 is:
 equiv_ch T2 N V2 V'1

sim_ch_pair' < backchain equiv_ch_closed with K = N1.
Subgoal 3.1.1:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 {is_nat N1}

Subgoal 3.1.2 is:
 le N N1

Subgoal 3.2 is:
 equiv_ch T2 N V2 V'1

sim_ch_pair' < backchain add_arg2_isnat.
Subgoal 3.1.2:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 le N N1

Subgoal 3.2 is:
 equiv_ch T2 N V2 V'1

sim_ch_pair' < backchain add_le_complement with N = K, N1 = I, N1' = J.
Subgoal 3.1.2:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 {is_nat N1}

Subgoal 3.2 is:
 equiv_ch T2 N V2 V'1

sim_ch_pair' < backchain add_arg2_isnat.
Subgoal 3.2:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 equiv_ch T2 N V2 V'1

sim_ch_pair' < backchain equiv_ch_closed with K = N2.
Subgoal 3.2.1:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 {is_nat N2}

Subgoal 3.2.2 is:
 le N N2

sim_ch_pair' < backchain add_arg2_isnat.
Subgoal 3.2.2:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 le N N2

sim_ch_pair' < backchain add_le_complement with N = K, N1 = J1, N1' = J.
Subgoal 3.2.2:

Variables: K M1 M2 M1' M2' T1 T2 FE1 FE2 FE P J I J1 V1 V2 N V' N1 V'1 N2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\pair' x y) P}
H8 : le J K
H9 : {nstep' J (pair' M1 M2) (pair' V1 V2)}
H11 : {add I J1 J}
H12 : {nstep' I M1 V1}
H13 : {nstep' J1 M2 V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : le I K
H18 : forall J V, le J K -> {nstep' J M1 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE1 M1') V'} /\ {add J N K} /\
             equiv_ch T1 N V V')
H19 : {eval'' (htm FE1 M1') V'}
H20 : {add I N1 K}
H21 : equiv_ch T1 N1 V1 V'
H22 : {is_nat J}
H23 : {add J1 I J}
H24 : le J1 K
H25 : forall J V, le J K -> {nstep' J M2 V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE2 M2') V'} /\ {add J N K} /\
             equiv_ch T2 N V V')
H26 : {eval'' (htm FE2 M2') V'1}
H27 : {add J1 N2 K}
H28 : equiv_ch T2 N2 V2 V'1
============================
 {is_nat N2}

sim_ch_pair' < backchain add_arg2_isnat.
Proof completed.
Abella < Theorem sim_ch_fst' : 
forall T1 T2 K FE M M' M'', {is_nat K} -> {is_cty (prod T1 T2)} ->
  sim_ch (prod T1 T2) K M (htm FE M') -> {hconstr M' (x\fst' x) M''} ->
  sim_ch T1 K (fst' M) (htm FE M'').


============================
 forall T1 T2 K FE M M' M'', {is_nat K} -> {is_cty (prod T1 T2)} ->
   sim_ch (prod T1 T2) K M (htm FE M') -> {hconstr M' (x\fst' x) M''} ->
   sim_ch T1 K (fst' M) (htm FE M'')

sim_ch_fst' < intros.

Variables: T1 T2 K FE M M' M''
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H3 : sim_ch (prod T1 T2) K M (htm FE M')
H4 : {hconstr M' (x\fst' x) M''}
============================
 sim_ch T1 K (fst' M) (htm FE M'')

sim_ch_fst' < unfold.

Variables: T1 T2 K FE M M' M''
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H3 : sim_ch (prod T1 T2) K M (htm FE M')
H4 : {hconstr M' (x\fst' x) M''}
============================
 forall J V, le J K -> {nstep' J (fst' M) V} -> {val' V} ->
   (exists V' N, {eval'' (htm FE M'') V'} /\ {add J N K} /\
        equiv_ch T1 N V V')

sim_ch_fst' < intros.

Variables: T1 T2 K FE M M' M'' J V
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H3 : sim_ch (prod T1 T2) K M (htm FE M')
H4 : {hconstr M' (x\fst' x) M''}
H5 : le J K
H6 : {nstep' J (fst' M) V}
H7 : {val' V}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add J N K} /\ equiv_ch T1 N V V'

sim_ch_fst' < apply nstep'_fst_inv to _ H6.

Variables: T1 T2 K FE M M' M'' V K' V'
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H3 : sim_ch (prod T1 T2) K M (htm FE M')
H4 : {hconstr M' (x\fst' x) M''}
H5 : le (s K') K
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T1 N V V'

sim_ch_fst' < case H3.

Variables: T1 T2 K FE M M' M'' V K' V'
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\fst' x) M''}
H5 : le (s K') K
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T1 N V V'

sim_ch_fst' < apply H10 to _ H9 _.
Subgoal 1:

Variables: T1 T2 K FE M M' M'' V K' V'
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\fst' x) M''}
H5 : le (s K') K
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
============================
 le K' K

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

sim_ch_fst' < case H5.
Subgoal 1:

Variables: T1 T2 K FE M M' M'' V K' V' N
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {add (s K') N K}
============================
 le K' K

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

sim_ch_fst' < case H11.
Subgoal 1:

Variables: T1 T2 FE M M' M'' V K' V' N N3
H1 : {is_nat (s N3)}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
             equiv_ch (prod T1 T2) N V V')
H12 : {add K' N N3}
============================
 le K' (s N3)

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

sim_ch_fst' < apply add_s to H12.
Subgoal 1:

Variables: T1 T2 FE M M' M'' V K' V' N N3
H1 : {is_nat (s N3)}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
             equiv_ch (prod T1 T2) N V V')
H12 : {add K' N N3}
H13 : {add K' (s N) (s N3)}
============================
 le K' (s N3)

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

sim_ch_fst' < search.

Variables: T1 T2 K FE M M' M'' V K' V' V'1 N
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\fst' x) M''}
H5 : le (s K') K
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') V'1}
H12 : {add K' N K}
H13 : equiv_ch (prod T1 T2) N (pair' V V') V'1
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T1 N V V'

sim_ch_fst' < case H5.

Variables: T1 T2 K FE M M' M'' V K' V' V'1 N N1
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') V'1}
H12 : {add K' N K}
H13 : equiv_ch (prod T1 T2) N (pair' V V') V'1
H14 : {add (s K') N1 K}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T1 N V V'

sim_ch_fst' < case H13.

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T1 N V V'

sim_ch_fst' < case H2.

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T1 N V V'

sim_ch_fst' < apply add_arg2_isnat to _ H12.

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T1 N V V'

sim_ch_fst' < exists V1'.

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 exists N, {eval'' (htm FE M'') V1'} /\ {add (s K') N K} /\
   equiv_ch T1 N V V1'

sim_ch_fst' < exists N1.

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 {eval'' (htm FE M'') V1'} /\ {add (s K') N1 K} /\ equiv_ch T1 N1 V V1'

sim_ch_fst' < split.
Subgoal 2:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 {eval'' (htm FE M'') V1'}

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

Subgoal 4 is:
 equiv_ch T1 N1 V V1'

sim_ch_fst' < backchain eval''_fst_fwd.
Subgoal 3:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 {add (s K') N1 K}

Subgoal 4 is:
 equiv_ch T1 N1 V V1'

sim_ch_fst' < search.
Subgoal 4:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 equiv_ch T1 N1 V V1'

sim_ch_fst' < backchain equiv_ch_closed with K = N.
Subgoal 4:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 le N1 N

sim_ch_fst' < apply add_le_complement to _ _ H12 H14.
Subgoal 4.1:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 le K' (s K')

Subgoal 4 is:
 le N1 N

sim_ch_fst' < backchain le_succ.
Subgoal 4.1:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 le K' K'

Subgoal 4 is:
 le N1 N

sim_ch_fst' < backchain le_refl.
Subgoal 4.1:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 {is_nat K'}

Subgoal 4 is:
 le N1 N

sim_ch_fst' < backchain add_arg1_isnat.
Subgoal 4:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\fst' x) M''}
H6 : {nstep' (s K') (fst' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V V')}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V V1'
H16 : equiv_ch T2 N V' V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
H20 : le N1 N
============================
 le N1 N

sim_ch_fst' < search.
Proof completed.
Abella < Theorem sim_ch_snd' : 
forall T1 T2 K FE M M' M'', {is_nat K} -> {is_cty (prod T1 T2)} ->
  sim_ch (prod T1 T2) K M (htm FE M') -> {hconstr M' (x\snd' x) M''} ->
  sim_ch T2 K (snd' M) (htm FE M'').


============================
 forall T1 T2 K FE M M' M'', {is_nat K} -> {is_cty (prod T1 T2)} ->
   sim_ch (prod T1 T2) K M (htm FE M') -> {hconstr M' (x\snd' x) M''} ->
   sim_ch T2 K (snd' M) (htm FE M'')

sim_ch_snd' < intros.

Variables: T1 T2 K FE M M' M''
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H3 : sim_ch (prod T1 T2) K M (htm FE M')
H4 : {hconstr M' (x\snd' x) M''}
============================
 sim_ch T2 K (snd' M) (htm FE M'')

sim_ch_snd' < unfold.

Variables: T1 T2 K FE M M' M''
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H3 : sim_ch (prod T1 T2) K M (htm FE M')
H4 : {hconstr M' (x\snd' x) M''}
============================
 forall J V, le J K -> {nstep' J (snd' M) V} -> {val' V} ->
   (exists V' N, {eval'' (htm FE M'') V'} /\ {add J N K} /\
        equiv_ch T2 N V V')

sim_ch_snd' < intros.

Variables: T1 T2 K FE M M' M'' J V
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H3 : sim_ch (prod T1 T2) K M (htm FE M')
H4 : {hconstr M' (x\snd' x) M''}
H5 : le J K
H6 : {nstep' J (snd' M) V}
H7 : {val' V}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add J N K} /\ equiv_ch T2 N V V'

sim_ch_snd' < apply nstep'_snd_inv to _ H6.

Variables: T1 T2 K FE M M' M'' V K' V'
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H3 : sim_ch (prod T1 T2) K M (htm FE M')
H4 : {hconstr M' (x\snd' x) M''}
H5 : le (s K') K
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T2 N V V'

sim_ch_snd' < case H3.

Variables: T1 T2 K FE M M' M'' V K' V'
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\snd' x) M''}
H5 : le (s K') K
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T2 N V V'

sim_ch_snd' < apply H10 to _ H9 _.
Subgoal 1:

Variables: T1 T2 K FE M M' M'' V K' V'
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\snd' x) M''}
H5 : le (s K') K
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
============================
 le K' K

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

sim_ch_snd' < case H5.
Subgoal 1:

Variables: T1 T2 K FE M M' M'' V K' V' N
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {add (s K') N K}
============================
 le K' K

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

sim_ch_snd' < case H11.
Subgoal 1:

Variables: T1 T2 FE M M' M'' V K' V' N N3
H1 : {is_nat (s N3)}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
             equiv_ch (prod T1 T2) N V V')
H12 : {add K' N N3}
============================
 le K' (s N3)

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

sim_ch_snd' < apply add_s to H12.
Subgoal 1:

Variables: T1 T2 FE M M' M'' V K' V' N N3
H1 : {is_nat (s N3)}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J (s N3) -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N (s N3)} /\
             equiv_ch (prod T1 T2) N V V')
H12 : {add K' N N3}
H13 : {add K' (s N) (s N3)}
============================
 le K' (s N3)

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

sim_ch_snd' < search.

Variables: T1 T2 K FE M M' M'' V K' V' V'1 N
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\snd' x) M''}
H5 : le (s K') K
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') V'1}
H12 : {add K' N K}
H13 : equiv_ch (prod T1 T2) N (pair' V' V) V'1
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T2 N V V'

sim_ch_snd' < case H5.

Variables: T1 T2 K FE M M' M'' V K' V' V'1 N N1
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') V'1}
H12 : {add K' N K}
H13 : equiv_ch (prod T1 T2) N (pair' V' V) V'1
H14 : {add (s K') N1 K}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T2 N V V'

sim_ch_snd' < case H13.

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H2 : {is_cty (prod T1 T2)}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T2 N V V'

sim_ch_snd' < case H2.

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T2 N V V'

sim_ch_snd' < apply add_arg2_isnat to _ H12.

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 exists V' N, {eval'' (htm FE M'') V'} /\ {add (s K') N K} /\
   equiv_ch T2 N V V'

sim_ch_snd' < exists V2'.

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 exists N, {eval'' (htm FE M'') V2'} /\ {add (s K') N K} /\
   equiv_ch T2 N V V2'

sim_ch_snd' < exists N1.

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 {eval'' (htm FE M'') V2'} /\ {add (s K') N1 K} /\ equiv_ch T2 N1 V V2'

sim_ch_snd' < split.
Subgoal 2:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 {eval'' (htm FE M'') V2'}

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

Subgoal 4 is:
 equiv_ch T2 N1 V V2'

sim_ch_snd' < backchain eval''_snd_fwd.
Subgoal 3:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 {add (s K') N1 K}

Subgoal 4 is:
 equiv_ch T2 N1 V V2'

sim_ch_snd' < search.
Subgoal 4:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 equiv_ch T2 N1 V V2'

sim_ch_snd' < backchain equiv_ch_closed with K = N.
Subgoal 4:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 le N1 N

sim_ch_snd' < apply add_le_complement to _ _ H12 H14.
Subgoal 4.1:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 le K' (s K')

Subgoal 4 is:
 le N1 N

sim_ch_snd' < backchain le_succ.
Subgoal 4.1:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 le K' K'

Subgoal 4 is:
 le N1 N

sim_ch_snd' < backchain le_refl.
Subgoal 4.1:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
============================
 {is_nat K'}

Subgoal 4 is:
 le N1 N

sim_ch_snd' < backchain add_arg1_isnat.
Subgoal 4:

Variables: T1 T2 K FE M M' M'' V K' V' N N1 V2' V1'
H1 : {is_nat K}
H4 : {hconstr M' (x\snd' x) M''}
H6 : {nstep' (s K') (snd' M) V}
H7 : {val' V}
H8 : {val' V'}
H9 : {nstep' K' M (pair' V' V)}
H10 : forall J V, le J K -> {nstep' J M V} -> {val' V} ->
        (exists V' N, {eval'' (htm FE M') V'} /\ {add J N K} /\
             equiv_ch (prod T1 T2) N V V')
H11 : {eval'' (htm FE M') (pair' V1' V2')}
H12 : {add K' N K}
H14 : {add (s K') N1 K}
H15 : equiv_ch T1 N V' V1'
H16 : equiv_ch T2 N V V2'
H17 : {is_cty T1}
H18 : {is_cty T2}
H19 : {is_nat N}
H20 : le N1 N
============================
 le N1 N

sim_ch_snd' < search.
Proof completed.
Abella < Theorem sim_ch_app' : 
forall K M1 M2 M1' M2' T1 T FE1 FE2 FE P, {is_nat K} ->
  {is_cty (arr' T1 T)} -> sim_ch (arr' T1 T) K M1 (htm FE1 M1') ->
  sim_ch T1 K M2 (htm FE2 M2') -> {appd FE1 FE2 FE} ->
  {hcombine M1' M2' (x\y\app' x y) P} -> sim_ch T K (app' M1 M2) (htm FE P).


============================
 forall K M1 M2 M1' M2' T1 T FE1 FE2 FE P, {is_nat K} ->
   {is_cty (arr' T1 T)} -> sim_ch (arr' T1 T) K M1 (htm FE1 M1') ->
   sim_ch T1 K M2 (htm FE2 M2') -> {appd FE1 FE2 FE} ->
   {hcombine M1' M2' (x\y\app' x y) P} -> sim_ch T K (app' M1 M2) (htm FE P)

sim_ch_app' < intros.

Variables: K M1 M2 M1' M2' T1 T FE1 FE2 FE P
H1 : {is_nat K}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) K M1 (htm FE1 M1')
H4 : sim_ch T1 K M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
============================
 sim_ch T K (app' M1 M2) (htm FE P)

sim_ch_app' < unfold.

Variables: K M1 M2 M1' M2' T1 T FE1 FE2 FE P
H1 : {is_nat K}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) K M1 (htm FE1 M1')
H4 : sim_ch T1 K M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
============================
 forall J V, le J K -> {nstep' J (app' M1 M2) V} -> {val' V} ->
   (exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V')

sim_ch_app' < intros.

Variables: K M1 M2 M1' M2' T1 T FE1 FE2 FE P J V
H1 : {is_nat K}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) K M1 (htm FE1 M1')
H4 : sim_ch T1 K M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H7 : le J K
H8 : {nstep' J (app' M1 M2) V}
H9 : {val' V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T N V V'

sim_ch_app' < apply nstep'_app_inv to _ H8.

Variables: K M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R
H1 : {is_nat K}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) K M1 (htm FE1 M1')
H4 : sim_ch T1 K M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H7 : le (s J123) K
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N K} /\
   equiv_ch T N V V'

sim_ch_app' < case H7.

Variables: K M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N
H1 : {is_nat K}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) K M1 (htm FE1 M1')
H4 : sim_ch T1 K M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H16 : {add (s J123) N K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N K} /\
   equiv_ch T N V V'

sim_ch_app' < case H16.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < assert exists N1, {add J1 N1 N3}.
Subgoal 1:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
============================
 exists N1, {add J1 N1 N3}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain k_minus_n1.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H18 : exists N1, {add J1 N1 N3}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < case H18.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < assert exists N2, {add J2 N2 N3}.
Subgoal 2:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
============================
 exists N2, {add J2 N2 N3}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain k_minus_n2.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H20 : exists N2, {add J2 N2 N3}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < case H20.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < assert exists V1', {eval'' (htm FE1 M1') V1'} /\
  equiv_ch (arr' T1 T) (s N1) (abs' R) V1'.
Subgoal 3:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
============================
 exists V1', {eval'' (htm FE1 M1') V1'} /\
   equiv_ch (arr' T1 T) (s N1) (abs' R) V1'

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain sim_ch_nstep.
Subgoal 3:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
============================
 {add J1 (s N1) (s N3)}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain add_s.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H22 : exists V1', {eval'' (htm FE1 M1') V1'} /\
        equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < case H22.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < assert exists V2', {eval'' (htm FE2 M2') V2'} /\ equiv_ch T1 (s N2) V2 V2'.
Subgoal 4:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
============================
 exists V2', {eval'' (htm FE2 M2') V2'} /\ equiv_ch T1 (s N2) V2 V2'

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain sim_ch_nstep.
Subgoal 4:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
============================
 {add J2 (s N2) (s N3)}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain add_s.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H25 : exists V2', {eval'' (htm FE2 M2') V2'} /\ equiv_ch T1 (s N2) V2 V2'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < case H25.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

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

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch 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'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain k_minus_n12.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H28 : exists K' J12, {add J1 J2 J12} /\ {add J3 N K'} /\ {add J12 K' N3}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < case H28.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < assert lt K' (s N1).
Subgoal 6:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
============================
 lt K' (s N1)

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain sum_complement_to_lt1 with N1 = J1, N2 = J2, N = N3.
Subgoal 6:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
============================
 {is_nat N3}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < case H1.
Subgoal 6:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : {is_nat N3}
============================
 {is_nat N3}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < search.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < assert lt K' (s N2).
Subgoal 7:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
============================
 lt K' (s N2)

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain sum_complement_to_lt2 with N1 = J1, N2 = J2, N = N3.
Subgoal 7:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
============================
 {is_nat N3}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < case H1.
Subgoal 7:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : {is_nat N3}
============================
 {is_nat N3}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < search.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < assert {is_nat N1}.
Subgoal 8:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
============================
 {is_nat N1}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain add_arg2_isnat.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V1' V2' K' J12
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') V1'}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) V1'
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < apply equiv_ch_arr'_abs to _ H24.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < assert sim_ch T K' (R V2) (htm nil (hbase (R' V2'))).
Subgoal 9:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
============================
 sim_ch T K' (R V2) (htm nil (hbase (R' V2')))

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain app_equiv_ch_arr' with T1 = T1, N1 = s N1, N2 = s N2, R = R, R' = R'.
Subgoal 9:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
============================
 {is_nat (s N2)}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < assert {is_nat N2}.
Subgoal 9.1:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
============================
 {is_nat N2}

Subgoal 9 is:
 {is_nat (s N2)}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain add_arg2_isnat.
Subgoal 9:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : {is_nat N2}
============================
 {is_nat (s N2)}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < search.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : sim_ch T K' (R V2) (htm nil (hbase (R' V2')))
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < assert exists V', {eval'' (htm nil (hbase (R' V2'))) V'} /\ equiv_ch T N V V'.
Subgoal 10:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : sim_ch T K' (R V2) (htm nil (hbase (R' V2')))
============================
 exists V', {eval'' (htm nil (hbase (R' V2'))) V'} /\ equiv_ch T N V V'

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < backchain sim_ch_nstep.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : sim_ch T K' (R V2) (htm nil (hbase (R' V2')))
H36 : exists V', {eval'' (htm nil (hbase (R' V2'))) V'} /\ equiv_ch T N V V'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < case H36.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R' V'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : sim_ch T K' (R V2) (htm nil (hbase (R' V2')))
H37 : {eval'' (htm nil (hbase (R' V2'))) V'}
H38 : equiv_ch T N V V'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < case H37.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R' V'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : sim_ch T K' (R V2) (htm nil (hbase (R' V2')))
H38 : equiv_ch T N V V'
H39 : {eval' (R' V2') V'}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < exists V'.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R' V'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : sim_ch T K' (R V2) (htm nil (hbase (R' V2')))
H38 : equiv_ch T N V V'
H39 : {eval' (R' V2') V'}
============================
 exists N, {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\
   equiv_ch T N V V'

sim_ch_app' < exists N.

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R' V'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : sim_ch T K' (R V2) (htm nil (hbase (R' V2')))
H38 : equiv_ch T N V V'
H39 : {eval' (R' V2') V'}
============================
 {eval'' (htm FE P) V'} /\ {add (s J123) N (s N3)} /\ equiv_ch T N V V'

sim_ch_app' < split.
Subgoal 11:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R' V'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : sim_ch T K' (R V2) (htm nil (hbase (R' V2')))
H38 : equiv_ch T N V V'
H39 : {eval' (R' V2') V'}
============================
 {eval'' (htm FE P) V'}

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

Subgoal 13 is:
 equiv_ch T N V V'

sim_ch_app' < backchain eval''_app_fwd with M1 = M1', M2 = M2', R = R'.
Subgoal 12:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R' V'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : sim_ch T K' (R V2) (htm nil (hbase (R' V2')))
H38 : equiv_ch T N V V'
H39 : {eval' (R' V2') V'}
============================
 {add (s J123) N (s N3)}

Subgoal 13 is:
 equiv_ch T N V V'

sim_ch_app' < search.
Subgoal 13:

Variables: M1 M2 M1' M2' T1 T FE1 FE2 FE P V J1 J2 J3 J23 J123 V2 R N N3 N1
           N2 V2' K' J12 R' V'
H1 : {is_nat (s N3)}
H2 : {is_cty (arr' T1 T)}
H3 : sim_ch (arr' T1 T) (s N3) M1 (htm FE1 M1')
H4 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H5 : {appd FE1 FE2 FE}
H6 : {hcombine M1' M2' (x\y\app' x y) P}
H8 : {nstep' (s J123) (app' M1 M2) V}
H9 : {val' V}
H10 : {add J2 J3 J23}
H11 : {add J1 J23 J123}
H12 : {nstep' J1 M1 (abs' R)}
H13 : {nstep' J2 M2 V2}
H14 : {val' V2}
H15 : {nstep' J3 (R V2) V}
H17 : {add J123 N N3}
H19 : {add J1 N1 N3}
H21 : {add J2 N2 N3}
H23 : {eval'' (htm FE1 M1') (abs' R')}
H24 : equiv_ch (arr' T1 T) (s N1) (abs' R) (abs' R')
H26 : {eval'' (htm FE2 M2') V2'}
H27 : equiv_ch T1 (s N2) V2 V2'
H29 : {add J1 J2 J12}
H30 : {add J3 N K'}
H31 : {add J12 K' N3}
H32 : lt K' (s N1)
H33 : lt K' (s N2)
H34 : {is_nat N1}
H35 : sim_ch T K' (R V2) (htm nil (hbase (R' V2')))
H38 : equiv_ch T N V V'
H39 : {eval' (R' V2') V'}
============================
 equiv_ch T N V V'

sim_ch_app' < search.
Proof completed.
Abella < Theorem sim_ch_clos' : 
forall K T1 T2 TL F E F' E' FE1 FE2 FE P, {is_nat K} ->
  {is_cty (arr T1 T2)} -> {is_cty TL} ->
  sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F') ->
  sim_ch TL K E (htm FE2 E') -> {appd FE1 FE2 FE} ->
  {hcombine F' E' (x\y\clos' x y) P} ->
  sim_ch (arr T1 T2) K (clos' F E) (htm FE P).


============================
 forall K T1 T2 TL F E F' E' FE1 FE2 FE P, {is_nat K} ->
   {is_cty (arr T1 T2)} -> {is_cty TL} ->
   sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F') ->
   sim_ch TL K E (htm FE2 E') -> {appd FE1 FE2 FE} ->
   {hcombine F' E' (x\y\clos' x y) P} ->
   sim_ch (arr T1 T2) K (clos' F E) (htm FE P)

sim_ch_clos' < intros.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
============================
 sim_ch (arr T1 T2) K (clos' F E) (htm FE P)

sim_ch_clos' < unfold.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
============================
 forall J V, le J K -> {nstep' J (clos' F E) V} -> {val' V} ->
   (exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
        equiv_ch (arr T1 T2) N V V')

sim_ch_clos' < intros.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J V
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) V}
H10 : {val' V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N V V'

sim_ch_clos' < apply nstep'_clos_inv to _ H9.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H10 : {val' (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) V'

sim_ch_clos' < case H10.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) V'

sim_ch_clos' < case H8 (keep).

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) V'

sim_ch_clos' < apply add_assoc to H11 H16.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) V'

sim_ch_clos' < apply sim_ch_nstep to H4 H12 _ H18.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) V'

sim_ch_clos' < apply add_arg2_isnat to _ H16.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) V'

sim_ch_clos' < apply add_result_isnat to _ H17.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) V'

sim_ch_clos' < apply add_comm to _ H18.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) V'

sim_ch_clos' < apply add_assoc to H17 H23.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V' N1
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) V'

sim_ch_clos' < apply sim_ch_nstep to H5 H13 _ H25.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V' N1 V'1
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) V'

sim_ch_clos' < exists clos' V' V'1.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V' N1 V'1
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
============================
 exists N, {eval'' (htm FE P) (clos' V' V'1)} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < exists N.

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V' N1 V'1
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
============================
 {eval'' (htm FE P) (clos' V' V'1)} /\ {add J N K} /\
   equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < split.
Subgoal 1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V' N1 V'1
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
============================
 {eval'' (htm FE P) (clos' V' V'1)}

Subgoal 2 is:
 {add J N K}

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < backchain eval''_clos_fwd.
Subgoal 2:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V' N1 V'1
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
============================
 {add J N K}

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < search.
Subgoal 3:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V' N1 V'1
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
============================
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < assert equiv_ch_arr (arr T1 T2) N (clos' V1 V2) (clos' V' V'1).
Subgoal 3.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V' N1 V'1
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
============================
 equiv_ch_arr (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply equiv_ch_to_equiv_ch_arr' to _ H20.
Subgoal 3.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V' N1 V'1
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H28 : equiv_ch_arr' (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
============================
 equiv_ch_arr (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < case H28.
Subgoal 3.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
============================
 equiv_ch_arr (arr T1 T2) N (clos' (abs' R) V2) (clos' (abs' R') V'1)

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply add_arg2_isnat to _ H25.
Subgoal 3.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
============================
 equiv_ch_arr (arr T1 T2) N (clos' (abs' R) V2) (clos' (abs' R') V'1)

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply equiv_ch_val1 to _ _ H27.
Subgoal 3.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
============================
 equiv_ch_arr (arr T1 T2) N (clos' (abs' R) V2) (clos' (abs' R') V'1)

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply equiv_ch_val2 to _ _ H27.
Subgoal 3.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
============================
 equiv_ch_arr (arr T1 T2) N (clos' (abs' R) V2) (clos' (abs' R') V'1)

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply equiv_ch_tm1 to _ _ H27.
Subgoal 3.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
============================
 equiv_ch_arr (arr T1 T2) N (clos' (abs' R) V2) (clos' (abs' R') V'1)

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply equiv_ch_tm2 to _ _ H27.
Subgoal 3.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
============================
 equiv_ch_arr (arr T1 T2) N (clos' (abs' R) V2) (clos' (abs' R') V'1)

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < unfold.
Subgoal 3.1.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
============================
 {tm' (clos' (abs' R) V2)}

Subgoal 3.1.2 is:
 {tm' (clos' (abs' R') V'1)}

Subgoal 3.1.3 is:
 {val' V2}

Subgoal 3.1.4 is:
 {val' V'1}

Subgoal 3.1.5 is:
 forall J V1 V1' V3 V2', lt J N -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V3 V2' ->
   sim_ch T2 J (R (pair' V3 (pair' V1 V2)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < search.
Subgoal 3.1.2:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
============================
 {tm' (clos' (abs' R') V'1)}

Subgoal 3.1.3 is:
 {val' V2}

Subgoal 3.1.4 is:
 {val' V'1}

Subgoal 3.1.5 is:
 forall J V1 V1' V3 V2', lt J N -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V3 V2' ->
   sim_ch T2 J (R (pair' V3 (pair' V1 V2)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < search.
Subgoal 3.1.3:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
============================
 {val' V2}

Subgoal 3.1.4 is:
 {val' V'1}

Subgoal 3.1.5 is:
 forall J V1 V1' V3 V2', lt J N -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V3 V2' ->
   sim_ch T2 J (R (pair' V3 (pair' V1 V2)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < search.
Subgoal 3.1.4:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
============================
 {val' V'1}

Subgoal 3.1.5 is:
 forall J V1 V1' V3 V2', lt J N -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V3 V2' ->
   sim_ch T2 J (R (pair' V3 (pair' V1 V2)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < search.
Subgoal 3.1.5:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
============================
 forall J V1 V1' V3 V2', lt J N -> equiv_ch T1 J V1 V1' ->
   equiv_ch (arr T1 T2) J V3 V2' ->
   sim_ch T2 J (R (pair' V3 (pair' V1 V2)))
     (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < intros.
Subgoal 3.1.5:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R J1
           V3 V1' V4 V2'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
H37 : lt J1 N
H38 : equiv_ch T1 J1 V3 V1'
H39 : equiv_ch (arr T1 T2) J1 V4 V2'
============================
 sim_ch T2 J1 (R (pair' V4 (pair' V3 V2)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < assert le J1 N1.
Subgoal 3.1.5.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R J1
           V3 V1' V4 V2'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
H37 : lt J1 N
H38 : equiv_ch T1 J1 V3 V1'
H39 : equiv_ch (arr T1 T2) J1 V4 V2'
============================
 le J1 N1

Subgoal 3.1.5 is:
 sim_ch T2 J1 (R (pair' V4 (pair' V3 V2)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply lt_to_le to H37.
Subgoal 3.1.5.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R J1
           V3 V1' V4 V2'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
H37 : lt J1 N
H38 : equiv_ch T1 J1 V3 V1'
H39 : equiv_ch (arr T1 T2) J1 V4 V2'
H40 : le J1 N
============================
 le J1 N1

Subgoal 3.1.5 is:
 sim_ch T2 J1 (R (pair' V4 (pair' V3 V2)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply le_trans to H40 _ with N3 = N1.
Subgoal 3.1.5.1:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R J1
           V3 V1' V4 V2'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
H37 : lt J1 N
H38 : equiv_ch T1 J1 V3 V1'
H39 : equiv_ch (arr T1 T2) J1 V4 V2'
H40 : le J1 N
H41 : le J1 N1
============================
 le J1 N1

Subgoal 3.1.5 is:
 sim_ch T2 J1 (R (pair' V4 (pair' V3 V2)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < search.
Subgoal 3.1.5:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R J1
           V3 V1' V4 V2'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
H37 : lt J1 N
H38 : equiv_ch T1 J1 V3 V1'
H39 : equiv_ch (arr T1 T2) J1 V4 V2'
H40 : le J1 N1
============================
 sim_ch T2 J1 (R (pair' V4 (pair' V3 V2)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply equiv_ch_closed to _ _ H27 H40.
Subgoal 3.1.5:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R J1
           V3 V1' V4 V2'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
H37 : lt J1 N
H38 : equiv_ch T1 J1 V3 V1'
H39 : equiv_ch (arr T1 T2) J1 V4 V2'
H40 : le J1 N1
H41 : equiv_ch TL J1 V2 V'1
============================
 sim_ch T2 J1 (R (pair' V4 (pair' V3 V2)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < assert lt J1 N23.
Subgoal 3.1.5.2:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R J1
           V3 V1' V4 V2'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
H37 : lt J1 N
H38 : equiv_ch T1 J1 V3 V1'
H39 : equiv_ch (arr T1 T2) J1 V4 V2'
H40 : le J1 N1
H41 : equiv_ch TL J1 V2 V'1
============================
 lt J1 N23

Subgoal 3.1.5 is:
 sim_ch T2 J1 (R (pair' V4 (pair' V3 V2)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply add_comm to _ H17.
Subgoal 3.1.5.2:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R J1
           V3 V1' V4 V2'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
H37 : lt J1 N
H38 : equiv_ch T1 J1 V3 V1'
H39 : equiv_ch (arr T1 T2) J1 V4 V2'
H40 : le J1 N1
H41 : equiv_ch TL J1 V2 V'1
H42 : {add N K2 N23}
============================
 lt J1 N23

Subgoal 3.1.5 is:
 sim_ch T2 J1 (R (pair' V4 (pair' V3 V2)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < apply lt_le_compose to H37 _ with N3 = N23.
Subgoal 3.1.5.2:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R J1
           V3 V1' V4 V2'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
H37 : lt J1 N
H38 : equiv_ch T1 J1 V3 V1'
H39 : equiv_ch (arr T1 T2) J1 V4 V2'
H40 : le J1 N1
H41 : equiv_ch TL J1 V2 V'1
H42 : {add N K2 N23}
H43 : lt J1 N23
============================
 lt J1 N23

Subgoal 3.1.5 is:
 sim_ch T2 J1 (R (pair' V4 (pair' V3 V2)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < search.
Subgoal 3.1.5:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V2 N N23 N1 V'1 R' R J1
           V3 V1' V4 V2'
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' (abs' R) V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F (abs' R)}
H13 : {nstep' K2 E V2}
H14 : {val' (abs' R)}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') (abs' R')}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 (abs' R)
        (abs' R')
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H29 : {tm' (abs' R)}
H30 : {tm' (abs' R')}
H31 : forall J V V', lt J N23 ->
        equiv_ch (prod (arr T1 T2) (prod T1 TL)) J V V' ->
        sim_ch T2 J (R V) (htm nil (hbase (R' V')))
H32 : {is_nat N1}
H33 : {val' V2}
H34 : {val' V'1}
H35 : {tm' V2}
H36 : {tm' V'1}
H37 : lt J1 N
H38 : equiv_ch T1 J1 V3 V1'
H39 : equiv_ch (arr T1 T2) J1 V4 V2'
H40 : le J1 N1
H41 : equiv_ch TL J1 V2 V'1
H42 : lt J1 N23
============================
 sim_ch T2 J1 (R (pair' V4 (pair' V3 V2)))
   (htm nil (hbase (R' (pair' V2' (pair' V1' V'1)))))

Subgoal 3 is:
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < backchain H31 with V = pair' V4 (pair' V3 V2), V' = pair' V2' (pair' V1' V'1).
Subgoal 3:

Variables: K T1 T2 TL F E F' E' FE1 FE2 FE P J K1 K2 V1 V2 N N23 V' N1 V'1
H1 : {is_nat K}
H2 : {is_cty (arr T1 T2)}
H3 : {is_cty TL}
H4 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F (htm FE1 F')
H5 : sim_ch TL K E (htm FE2 E')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine F' E' (x\y\clos' x y) P}
H8 : le J K
H9 : {nstep' J (clos' F E) (clos' V1 V2)}
H11 : {add K1 K2 J}
H12 : {nstep' K1 F V1}
H13 : {nstep' K2 E V2}
H14 : {val' V1}
H15 : {val' V2}
H16 : {add J N K}
H17 : {add K2 N N23}
H18 : {add K1 N23 K}
H19 : {eval'' (htm FE1 F') V'}
H20 : equiv_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) N23 V1 V'
H21 : {is_nat N}
H22 : {is_nat N23}
H23 : {add N23 K1 K}
H24 : {add N K1 N1}
H25 : {add K2 N1 K}
H26 : {eval'' (htm FE2 E') V'1}
H27 : equiv_ch TL N1 V2 V'1
H28 : equiv_ch_arr (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)
============================
 equiv_ch (arr T1 T2) N (clos' V1 V2) (clos' V' V'1)

sim_ch_clos' < backchain equiv_ch_arr_to_equiv_ch.
Proof completed.
Abella < Theorem sim_ch_open' : 
forall K T1 T2 M1 M2 M1' M2' FE1 FE2 FE P, {is_nat K} -> {is_cty T1} ->
  {is_cty T2} -> sim_ch (arr T1 T2) K M1 (htm FE1 M1') ->
  sim_ch T1 K M2 (htm FE2 M2') -> {appd FE1 FE2 FE} ->
  {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P} ->
  sim_ch T2 K (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) (htm FE P).


============================
 forall K T1 T2 M1 M2 M1' M2' FE1 FE2 FE P, {is_nat K} -> {is_cty T1} ->
   {is_cty T2} -> sim_ch (arr T1 T2) K M1 (htm FE1 M1') ->
   sim_ch T1 K M2 (htm FE2 M2') -> {appd FE1 FE2 FE} ->
   {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P} ->
   sim_ch T2 K (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) (htm FE P)

sim_ch_open' < intros.

Variables: K T1 T2 M1 M2 M1' M2' FE1 FE2 FE P
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) K M1 (htm FE1 M1')
H5 : sim_ch T1 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
============================
 sim_ch T2 K (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) (htm FE P)

sim_ch_open' < unfold.

Variables: K T1 T2 M1 M2 M1' M2' FE1 FE2 FE P
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) K M1 (htm FE1 M1')
H5 : sim_ch T1 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
============================
 forall J V, le J K ->
   {nstep' J (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V} ->
   {val' V} ->
   (exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T2 N V V')

sim_ch_open' < intros.

Variables: K T1 T2 M1 M2 M1' M2' FE1 FE2 FE P J V
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) K M1 (htm FE1 M1')
H5 : sim_ch T1 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H8 : le J K
H9 : {nstep' J (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add J N K} /\ equiv_ch T2 N V V'

sim_ch_open' < apply nstep'_open_inv_sp to _ H9.

Variables: K T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E
           V2
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) K M1 (htm FE1 M1')
H5 : sim_ch T1 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H8 : le (s (s K1231)) K
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N K} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H8.

Variables: K T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E
           V2 N
H1 : {is_nat K}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) K M1 (htm FE1 M1')
H5 : sim_ch T1 K M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H19 : {add (s (s K1231)) N K}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N K} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H19.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N3
H1 : {is_nat (s N3)}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s N3) M1 (htm FE1 M1')
H5 : sim_ch T1 (s N3) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H20 : {add (s K1231) N N3}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s N3)} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H20.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1
H1 : {is_nat (s (s N1))}
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H1.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H22 : {is_nat (s N1)}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H22.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply nstep'_is_nat to H9.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H24 : {is_nat (s (s K1231))}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H24.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H25 : {is_nat (s K1231)}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H25.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < assert exists J1, {add K1 J1 N1} /\ {add K123 N J1}.
Subgoal 1:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
============================
 exists J1, {add K1 J1 N1} /\ {add K123 N J1}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_comm to _ H13.
Subgoal 1:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H27 : {add K1 K123 K1231}
============================
 exists J1, {add K1 J1 N1} /\ {add K123 N J1}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_assoc to H27 H21.
Subgoal 1:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 N23
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H27 : {add K1 K123 K1231}
H28 : {add K123 N N23}
H29 : {add K1 N23 N1}
============================
 exists J1, {add K1 J1 N1} /\ {add K123 N J1}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < search.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H27 : exists J1, {add K1 J1 N1} /\ {add K123 N J1}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H27.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < assert exists J2 K13 K131, {add K2 J2 N1} /\ {add K1 K3 K13} /\ {add K13 K1 K131} /\
  {add K131 N J2}.
Subgoal 2:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
============================
 exists J2 K13 K131, {add K2 J2 N1} /\ {add K1 K3 K13} /\
   {add K13 K1 K131} /\ {add K131 N J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_arg1_isnat to H12.
Subgoal 2:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H30 : {is_nat K12}
============================
 exists J2 K13 K131, {add K2 J2 N1} /\ {add K1 K3 K13} /\
   {add K13 K1 K131} /\ {add K131 N J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_comm to _ H11.
Subgoal 2:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H30 : {is_nat K12}
H31 : {add K2 K1 K12}
============================
 exists J2 K13 K131, {add K2 J2 N1} /\ {add K1 K3 K13} /\
   {add K13 K1 K131} /\ {add K131 N J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_assoc to H31 H12.
Subgoal 2:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 N23
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H30 : {is_nat K12}
H31 : {add K2 K1 K12}
H32 : {add K1 K3 N23}
H33 : {add K2 N23 K123}
============================
 exists J2 K13 K131, {add K2 J2 N1} /\ {add K1 K3 K13} /\
   {add K13 K1 K131} /\ {add K131 N J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_assoc to H33 H13.
Subgoal 2:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 N23 N2
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H30 : {is_nat K12}
H31 : {add K2 K1 K12}
H32 : {add K1 K3 N23}
H33 : {add K2 N23 K123}
H34 : {add N23 K1 N2}
H35 : {add K2 N2 K1231}
============================
 exists J2 K13 K131, {add K2 J2 N1} /\ {add K1 K3 K13} /\
   {add K13 K1 K131} /\ {add K131 N J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_assoc to H35 H21.
Subgoal 2:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 N23 N2 N4
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H30 : {is_nat K12}
H31 : {add K2 K1 K12}
H32 : {add K1 K3 N23}
H33 : {add K2 N23 K123}
H34 : {add N23 K1 N2}
H35 : {add K2 N2 K1231}
H36 : {add N2 N N4}
H37 : {add K2 N4 N1}
============================
 exists J2 K13 K131, {add K2 J2 N1} /\ {add K1 K3 K13} /\
   {add K13 K1 K131} /\ {add K131 N J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < search.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H30 : exists J2 K13 K131, {add K2 J2 N1} /\ {add K1 K3 K13} /\
        {add K13 K1 K131} /\ {add K131 N J2}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H30.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < assert exists V1', {eval'' (htm FE1 M1') V1'} /\
  equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'.
Subgoal 3:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
============================
 exists V1', {eval'' (htm FE1 M1') V1'} /\
   equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain sim_ch_nstep.
Subgoal 3:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
============================
 {add K1 (s (s J1)) (s (s N1))}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain add_s.
Subgoal 3:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
============================
 {add K1 (s J1) (s N1)}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain add_s.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H35 : exists V1', {eval'' (htm FE1 M1') V1'} /\
        equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H35.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < assert exists V2', {eval'' (htm FE2 M2') V2'} /\ equiv_ch T1 (s (s J2)) V2 V2'.
Subgoal 4:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
============================
 exists V2', {eval'' (htm FE2 M2') V2'} /\ equiv_ch T1 (s (s J2)) V2 V2'

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain sim_ch_nstep.
Subgoal 4:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
============================
 {add K2 (s (s J2)) (s (s N1))}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain add_s.
Subgoal 4:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
============================
 {add K2 (s J2) (s N1)}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain add_s.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H38 : exists V2', {eval'' (htm FE2 M2') V2'} /\ equiv_ch T1 (s (s J2)) V2 V2'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H38.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < assert exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
  {add K' DK1 J2}.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_arg1_isnat to H13.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_assoc to H12 H29.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N23
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N23}
H43 : {add K12 N23 J1}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_arg1_isnat to H34.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N23
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N23}
H43 : {add K12 N23 J1}
H44 : {is_nat K131}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_comm to _ H33.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N23
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N23}
H43 : {add K12 N23 J1}
H44 : {is_nat K131}
H45 : {add K1 K13 K131}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_assoc to H45 H34.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N23 N2
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N23}
H43 : {add K12 N23 J1}
H44 : {is_nat K131}
H45 : {add K1 K13 K131}
H46 : {add K13 N N2}
H47 : {add K1 N2 J2}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_assoc to H32 H46.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N23 N2 N4
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N23}
H43 : {add K12 N23 J1}
H44 : {is_nat K131}
H45 : {add K1 K13 K131}
H46 : {add K13 N N2}
H47 : {add K1 N2 J2}
H48 : {add K3 N N4}
H49 : {add K1 N4 N2}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_assoc' to H49 H47.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N23 N2 N4 N12
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N23}
H43 : {add K12 N23 J1}
H44 : {is_nat K131}
H45 : {add K1 K13 K131}
H46 : {add K13 N N2}
H47 : {add K1 N2 J2}
H48 : {add K3 N N4}
H49 : {add K1 N4 N2}
H50 : {add K1 K1 N12}
H51 : {add N12 N4 J2}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_det to H42 H48.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N2 N4 N12
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N4}
H43 : {add K12 N4 J1}
H44 : {is_nat K131}
H45 : {add K1 K13 K131}
H46 : {add K13 N N2}
H47 : {add K1 N2 J2}
H48 : {add K3 N N4}
H49 : {add K1 N4 N2}
H50 : {add K1 K1 N12}
H51 : {add N12 N4 J2}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_arg2_isnat to _ H28.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N2 N4 N12
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N4}
H43 : {add K12 N4 J1}
H44 : {is_nat K131}
H45 : {add K1 K13 K131}
H46 : {add K13 N N2}
H47 : {add K1 N2 J2}
H48 : {add K3 N N4}
H49 : {add K1 N4 N2}
H50 : {add K1 K1 N12}
H51 : {add N12 N4 J2}
H52 : {is_nat J1}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_arg2_isnat to _ H31.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N2 N4 N12
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N4}
H43 : {add K12 N4 J1}
H44 : {is_nat K131}
H45 : {add K1 K13 K131}
H46 : {add K13 N N2}
H47 : {add K1 N2 J2}
H48 : {add K3 N N4}
H49 : {add K1 N4 N2}
H50 : {add K1 K1 N12}
H51 : {add N12 N4 J2}
H52 : {is_nat J1}
H53 : {is_nat J2}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_comm to _ H43.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N2 N4 N12
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N4}
H43 : {add K12 N4 J1}
H44 : {is_nat K131}
H45 : {add K1 K13 K131}
H46 : {add K13 N N2}
H47 : {add K1 N2 J2}
H48 : {add K3 N N4}
H49 : {add K1 N4 N2}
H50 : {add K1 K1 N12}
H51 : {add N12 N4 J2}
H52 : {is_nat J1}
H53 : {is_nat J2}
H54 : {add N4 K12 J1}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_comm to _ H51.
Subgoal 5:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' N2 N4 N12
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : {is_nat K123}
H42 : {add K3 N N4}
H43 : {add K12 N4 J1}
H44 : {is_nat K131}
H45 : {add K1 K13 K131}
H46 : {add K13 N N2}
H47 : {add K1 N2 J2}
H48 : {add K3 N N4}
H49 : {add K1 N4 N2}
H50 : {add K1 K1 N12}
H51 : {add N12 N4 J2}
H52 : {is_nat J1}
H53 : {is_nat J2}
H54 : {add N4 K12 J1}
H55 : {add N4 N12 J2}
============================
 exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
   {add K' DK1 J2}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < search.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H41 : exists K' DK1, {add K3 N K'} /\ {add K' K12 J1} /\ {add K1 K1 DK1} /\
        {add K' DK1 J2}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H41.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < assert lt K' (s (s J1)).
Subgoal 6:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
============================
 lt K' (s (s J1))

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < unfold.
Subgoal 6:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
============================
 exists N, {add K' (s N) (s (s J1))}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < exists s K12.
Subgoal 6:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
============================
 {add K' (s (s K12)) (s (s J1))}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain add_s.
Subgoal 6:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
============================
 {add K' (s K12) (s J1)}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain add_s.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < assert lt K' (s (s J2)).
Subgoal 7:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
============================
 lt K' (s (s J2))

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < unfold.
Subgoal 7:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
============================
 exists N, {add K' (s N) (s (s J2))}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < exists s DK1.
Subgoal 7:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
============================
 {add K' (s (s DK1)) (s (s J2))}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain add_s.
Subgoal 7:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
============================
 {add K' (s DK1) (s J2)}

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain add_s.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_arg2_isnat to _ H28.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply add_arg2_isnat to _ H31.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V1' V2' K' DK1
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') V1'}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) V1'
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply equiv_ch_arr_clos to _ H37.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V2' K' DK1 F' E'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') (clos' (abs' F') E')}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) (clos' (abs' F') E')
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < assert sim_ch T2 K' (F (pair' (clos' (abs' F) E) (pair' V2 E)))
  (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E'))))).
Subgoal 8:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V2' K' DK1 F' E'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') (clos' (abs' F') E')}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) (clos' (abs' F') E')
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
============================
 sim_ch T2 K' (F (pair' (clos' (abs' F) E) (pair' V2 E)))
   (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E')))))

Subgoal is:
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < backchain app_equiv_ch_arr with T1 = T1, N1 = s (s J1), N2 = s (s J2), F = F, F' = F'.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V2' K' DK1 F' E'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') (clos' (abs' F') E')}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) (clos' (abs' F') E')
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
H50 : sim_ch T2 K' (F (pair' (clos' (abs' F) E) (pair' V2 E)))
        (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E')))))
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < apply sim_ch_nstep to H50 H18 _ _.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V2' K' DK1 F' E' V'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') (clos' (abs' F') E')}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) (clos' (abs' F') E')
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
H50 : sim_ch T2 K' (F (pair' (clos' (abs' F) E) (pair' V2 E)))
        (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E')))))
H51 : {eval''
         (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E')))))
         V'}
H52 : equiv_ch T2 N V V'
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < case H51.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V2' K' DK1 F' E' V'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') (clos' (abs' F') E')}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) (clos' (abs' F') E')
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
H50 : sim_ch T2 K' (F (pair' (clos' (abs' F) E) (pair' V2 E)))
        (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E')))))
H52 : equiv_ch T2 N V V'
H53 : {eval' (F' (pair' (clos' (abs' F') E') (pair' V2' E'))) V'}
============================
 exists V' N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < exists V'.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V2' K' DK1 F' E' V'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') (clos' (abs' F') E')}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) (clos' (abs' F') E')
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
H50 : sim_ch T2 K' (F (pair' (clos' (abs' F) E) (pair' V2 E)))
        (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E')))))
H52 : equiv_ch T2 N V V'
H53 : {eval' (F' (pair' (clos' (abs' F') E') (pair' V2' E'))) V'}
============================
 exists N, {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < exists N.

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V2' K' DK1 F' E' V'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') (clos' (abs' F') E')}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) (clos' (abs' F') E')
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
H50 : sim_ch T2 K' (F (pair' (clos' (abs' F) E) (pair' V2 E)))
        (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E')))))
H52 : equiv_ch T2 N V V'
H53 : {eval' (F' (pair' (clos' (abs' F') E') (pair' V2' E'))) V'}
============================
 {eval'' (htm FE P) V'} /\ {add (s (s K1231)) N (s (s N1))} /\
   equiv_ch T2 N V V'

sim_ch_open' < split.
Subgoal 9:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V2' K' DK1 F' E' V'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') (clos' (abs' F') E')}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) (clos' (abs' F') E')
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
H50 : sim_ch T2 K' (F (pair' (clos' (abs' F) E) (pair' V2 E)))
        (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E')))))
H52 : equiv_ch T2 N V V'
H53 : {eval' (F' (pair' (clos' (abs' F') E') (pair' V2' E'))) V'}
============================
 {eval'' (htm FE P) V'}

Subgoal 10 is:
 {add (s (s K1231)) N (s (s N1))}

Subgoal 11 is:
 equiv_ch T2 N V V'

sim_ch_open' < backchain eval''_open_fwd with M1 = M1', M2 = M2', F = F', E = E'.
Subgoal 10:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V2' K' DK1 F' E' V'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') (clos' (abs' F') E')}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) (clos' (abs' F') E')
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
H50 : sim_ch T2 K' (F (pair' (clos' (abs' F) E) (pair' V2 E)))
        (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E')))))
H52 : equiv_ch T2 N V V'
H53 : {eval' (F' (pair' (clos' (abs' F') E') (pair' V2' E'))) V'}
============================
 {add (s (s K1231)) N (s (s N1))}

Subgoal 11 is:
 equiv_ch T2 N V V'

sim_ch_open' < search.
Subgoal 11:

Variables: T1 T2 M1 M2 M1' M2' FE1 FE2 FE P V K1 K2 K3 K12 K123 K1231 F E V2
           N N1 J1 J2 K13 K131 V2' K' DK1 F' E' V'
H2 : {is_cty T1}
H3 : {is_cty T2}
H4 : sim_ch (arr T1 T2) (s (s N1)) M1 (htm FE1 M1')
H5 : sim_ch T1 (s (s N1)) M2 (htm FE2 M2')
H6 : {appd FE1 FE2 FE}
H7 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P}
H9 : {nstep' (s (s K1231)) (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) V}
H10 : {val' V}
H11 : {add K1 K2 K12}
H12 : {add K12 K3 K123}
H13 : {add K123 K1 K1231}
H14 : {nstep' K1 M1 (clos' (abs' F) E)}
H15 : {val' E}
H16 : {nstep' K2 M2 V2}
H17 : {val' V2}
H18 : {nstep' K3 (F (pair' (clos' (abs' F) E) (pair' V2 E))) V}
H21 : {add K1231 N N1}
H23 : {is_nat N1}
H26 : {is_nat K1231}
H28 : {add K1 J1 N1}
H29 : {add K123 N J1}
H31 : {add K2 J2 N1}
H32 : {add K1 K3 K13}
H33 : {add K13 K1 K131}
H34 : {add K131 N J2}
H36 : {eval'' (htm FE1 M1') (clos' (abs' F') E')}
H37 : equiv_ch (arr T1 T2) (s (s J1)) (clos' (abs' F) E) (clos' (abs' F') E')
H39 : {eval'' (htm FE2 M2') V2'}
H40 : equiv_ch T1 (s (s J2)) V2 V2'
H42 : {add K3 N K'}
H43 : {add K' K12 J1}
H44 : {add K1 K1 DK1}
H45 : {add K' DK1 J2}
H46 : lt K' (s (s J1))
H47 : lt K' (s (s J2))
H48 : {is_nat J1}
H49 : {is_nat J2}
H50 : sim_ch T2 K' (F (pair' (clos' (abs' F) E) (pair' V2 E)))
        (htm nil (hbase (F' (pair' (clos' (abs' F') E') (pair' V2' E')))))
H52 : equiv_ch T2 N V V'
H53 : {eval' (F' (pair' (clos' (abs' F') E') (pair' V2' E'))) V'}
============================
 equiv_ch T2 N V V'

sim_ch_open' < search.
Proof completed.
Abella < Define subst_equiv_ch : (list o) -> nat -> (list (map tm' tm')) -> (list (map tm' tm')) -> prop by 
subst_equiv_ch nil K nil nil;
nabla x, subst_equiv_ch (of' x T :: L) K (map x V :: ML) (map x V' :: ML') := equiv_ch T K V V' /\ subst_equiv_ch L K ML ML'.

Abella < Theorem subst_equiv_ch_mem : 
forall L ML ML' M T I, subst_equiv_ch L I ML ML' -> member (of' M T) L ->
  (exists V V', member (map M V) ML /\ member (map M V') ML' /\
       equiv_ch T I V V').


============================
 forall L ML ML' M T I, subst_equiv_ch L I ML ML' -> member (of' M T) L ->
   (exists V V', member (map M V) ML /\ member (map M V') ML' /\
        equiv_ch T I V V')

subst_equiv_ch_mem < induction on 2.

IH : forall L ML ML' M T I, subst_equiv_ch L I ML ML' ->
       member (of' M T) L * ->
       (exists V V', member (map M V) ML /\ member (map M V') ML' /\
            equiv_ch T I V V')
============================
 forall L ML ML' M T I, subst_equiv_ch L I ML ML' -> member (of' M T) L @ ->
   (exists V V', member (map M V) ML /\ member (map M V') ML' /\
        equiv_ch T I V V')

subst_equiv_ch_mem < intros.

Variables: L ML ML' M T I
IH : forall L ML ML' M T I, subst_equiv_ch L I ML ML' ->
       member (of' M T) L * ->
       (exists V V', member (map M V) ML /\ member (map M V') ML' /\
            equiv_ch T I V V')
H1 : subst_equiv_ch L I ML ML'
H2 : member (of' M T) L @
============================
 exists V V', member (map M V) ML /\ member (map M V') ML' /\
   equiv_ch T I V V'

subst_equiv_ch_mem < case H2.
Subgoal 1:

Variables: ML ML' M T I L1
IH : forall L ML ML' M T I, subst_equiv_ch L I ML ML' ->
       member (of' M T) L * ->
       (exists V V', member (map M V) ML /\ member (map M V') ML' /\
            equiv_ch T I V V')
H1 : subst_equiv_ch (of' M T :: L1) I ML ML'
============================
 exists V V', member (map M V) ML /\ member (map M V') ML' /\
   equiv_ch T I V V'

Subgoal 2 is:
 exists V V', member (map M V) ML /\ member (map M V') ML' /\
   equiv_ch T I V V'

subst_equiv_ch_mem < case H1.
Subgoal 1:

Variables: T I ML'1 V' ML1 V L2
IH : forall L ML ML' M T I, subst_equiv_ch L I ML ML' ->
       member (of' M T) L * ->
       (exists V V', member (map M V) ML /\ member (map M V') ML' /\
            equiv_ch T I V V')
H3 : equiv_ch T I V V'
H4 : subst_equiv_ch L2 I ML1 ML'1
============================
 exists V1 V'1, member (map n1 V1) (map n1 V :: ML1) /\
   member (map n1 V'1) (map n1 V' :: ML'1) /\ equiv_ch T I V1 V'1

Subgoal 2 is:
 exists V V', member (map M V) ML /\ member (map M V') ML' /\
   equiv_ch T I V V'

subst_equiv_ch_mem < search.
Subgoal 2:

Variables: ML ML' M T I L1 B
IH : forall L ML ML' M T I, subst_equiv_ch L I ML ML' ->
       member (of' M T) L * ->
       (exists V V', member (map M V) ML /\ member (map M V') ML' /\
            equiv_ch T I V V')
H1 : subst_equiv_ch (B :: L1) I ML ML'
H3 : member (of' M T) L1 *
============================
 exists V V', member (map M V) ML /\ member (map M V') ML' /\
   equiv_ch T I V V'

subst_equiv_ch_mem < case H1.
Subgoal 2:

Variables: M T I ML'1 V' ML1 V L2 T1
IH : forall L ML ML' M T I, subst_equiv_ch L I ML ML' ->
       member (of' M T) L * ->
       (exists V V', member (map M V) ML /\ member (map M V') ML' /\
            equiv_ch T I V V')
H3 : member (of' (M n1) T) L2 *
H4 : equiv_ch T1 I V V'
H5 : subst_equiv_ch L2 I ML1 ML'1
============================
 exists V1 V'1, member (map (M n1) V1) (map n1 V :: ML1) /\
   member (map (M n1) V'1) (map n1 V' :: ML'1) /\ equiv_ch T I V1 V'1

subst_equiv_ch_mem < apply IH to H5 H3.
Subgoal 2:

Variables: M T I ML'1 V' ML1 V L2 T1 V1 V'1
IH : forall L ML ML' M T I, subst_equiv_ch L I ML ML' ->
       member (of' M T) L * ->
       (exists V V', member (map M V) ML /\ member (map M V') ML' /\
            equiv_ch T I V V')
H3 : member (of' (M n1) T) L2 *
H4 : equiv_ch T1 I V V'
H5 : subst_equiv_ch L2 I ML1 ML'1
H6 : member (map (M n1) (V1 n1)) ML1
H7 : member (map (M n1) (V'1 n1)) ML'1
H8 : equiv_ch T I (V1 n1) (V'1 n1)
============================
 exists V1 V'1, member (map (M n1) V1) (map n1 V :: ML1) /\
   member (map (M n1) V'1) (map n1 V' :: ML'1) /\ equiv_ch T I V1 V'1

subst_equiv_ch_mem < search.
Proof completed.
Abella < Theorem subst_equiv_ch_closed : 
forall L K J ML ML', {is_nat K} -> ctx' L -> subst_equiv_ch L K ML ML' ->
  le J K -> subst_equiv_ch L J ML ML'.


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

subst_equiv_ch_closed < induction on 3.

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

subst_equiv_ch_closed < intros.

Variables: L K J ML ML'
IH : forall L K J ML ML', {is_nat K} -> ctx' L ->
       subst_equiv_ch L K ML ML' * -> le J K -> subst_equiv_ch L J ML ML'
H1 : {is_nat K}
H2 : ctx' L
H3 : subst_equiv_ch L K ML ML' @
H4 : le J K
============================
 subst_equiv_ch L J ML ML'

subst_equiv_ch_closed < case H3.
Subgoal 1:

Variables: K J
IH : forall L K J ML ML', {is_nat K} -> ctx' L ->
       subst_equiv_ch L K ML ML' * -> le J K -> subst_equiv_ch L J ML ML'
H1 : {is_nat K}
H2 : ctx' nil
H4 : le J K
============================
 subst_equiv_ch nil J nil nil

Subgoal 2 is:
 subst_equiv_ch (of' n1 T :: L1) J (map n1 V :: ML1) (map n1 V' :: ML'1)

subst_equiv_ch_closed < search.
Subgoal 2:

Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx' L ->
       subst_equiv_ch L K ML ML' * -> le J K -> subst_equiv_ch L J ML ML'
H1 : {is_nat K}
H2 : ctx' (of' n1 T :: L1)
H4 : le J K
H5 : equiv_ch T K V V'
H6 : subst_equiv_ch L1 K ML1 ML'1 *
============================
 subst_equiv_ch (of' n1 T :: L1) J (map n1 V :: ML1) (map n1 V' :: ML'1)

subst_equiv_ch_closed < unfold.
Subgoal 2.1:

Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx' L ->
       subst_equiv_ch L K ML ML' * -> le J K -> subst_equiv_ch L J ML ML'
H1 : {is_nat K}
H2 : ctx' (of' n1 T :: L1)
H4 : le J K
H5 : equiv_ch T K V V'
H6 : subst_equiv_ch L1 K ML1 ML'1 *
============================
 equiv_ch T J V V'

Subgoal 2.2 is:
 subst_equiv_ch L1 J ML1 ML'1

subst_equiv_ch_closed < backchain equiv_ch_closed.
Subgoal 2.1:

Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx' L ->
       subst_equiv_ch L K ML ML' * -> le J K -> subst_equiv_ch L J ML ML'
H1 : {is_nat K}
H2 : ctx' (of' n1 T :: L1)
H4 : le J K
H5 : equiv_ch T K V V'
H6 : subst_equiv_ch L1 K ML1 ML'1 *
============================
 {is_cty T}

Subgoal 2.2 is:
 subst_equiv_ch L1 J ML1 ML'1

subst_equiv_ch_closed < case H2.
Subgoal 2.1:

Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx' L ->
       subst_equiv_ch L K ML ML' * -> le J K -> subst_equiv_ch L J ML ML'
H1 : {is_nat K}
H4 : le J K
H5 : equiv_ch T K V V'
H6 : subst_equiv_ch L1 K ML1 ML'1 *
H7 : ctx' L1
H8 : {is_cty T}
============================
 {is_cty T}

Subgoal 2.2 is:
 subst_equiv_ch L1 J ML1 ML'1

subst_equiv_ch_closed < search.
Subgoal 2.2:

Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx' L ->
       subst_equiv_ch L K ML ML' * -> le J K -> subst_equiv_ch L J ML ML'
H1 : {is_nat K}
H2 : ctx' (of' n1 T :: L1)
H4 : le J K
H5 : equiv_ch T K V V'
H6 : subst_equiv_ch L1 K ML1 ML'1 *
============================
 subst_equiv_ch L1 J ML1 ML'1

subst_equiv_ch_closed < backchain IH.
Subgoal 2.2:

Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx' L ->
       subst_equiv_ch L K ML ML' * -> le J K -> subst_equiv_ch L J ML ML'
H1 : {is_nat K}
H2 : ctx' (of' n1 T :: L1)
H4 : le J K
H5 : equiv_ch T K V V'
H6 : subst_equiv_ch L1 K ML1 ML'1 *
============================
 ctx' L1

subst_equiv_ch_closed < case H2.
Subgoal 2.2:

Variables: K J ML'1 V' ML1 V L1 T
IH : forall L K J ML ML', {is_nat K} -> ctx' L ->
       subst_equiv_ch L K ML ML' * -> le J K -> subst_equiv_ch L J ML ML'
H1 : {is_nat K}
H4 : le J K
H5 : equiv_ch T K V V'
H6 : subst_equiv_ch L1 K ML1 ML'1 *
H7 : ctx' L1
H8 : {is_cty T}
============================
 ctx' L1

subst_equiv_ch_closed < search.
Proof completed.
Abella < Theorem subst_equiv_ch_extend : 
forall T L K ML ML' V V', nabla x, subst_equiv_ch L K ML ML' ->
  equiv_ch T K V V' ->
  subst_equiv_ch (of' x T :: L) K (map x V :: ML) (map x V' :: ML').


============================
 forall T L K ML ML' V V', nabla x, subst_equiv_ch L K ML ML' ->
   equiv_ch T K V V' ->
   subst_equiv_ch (of' x T :: L) K (map x V :: ML) (map x V' :: ML')

subst_equiv_ch_extend < intros.

Variables: T L K ML ML' V V'
H1 : subst_equiv_ch L K ML ML'
H2 : equiv_ch T K V V'
============================
 subst_equiv_ch (of' n1 T :: L) K (map n1 V :: ML) (map n1 V' :: ML')

subst_equiv_ch_extend < unfold.
Subgoal 1:

Variables: T L K ML ML' V V'
H1 : subst_equiv_ch L K ML ML'
H2 : equiv_ch T K V V'
============================
 equiv_ch T K V V'

Subgoal 2 is:
 subst_equiv_ch L K ML ML'

subst_equiv_ch_extend < search.
Subgoal 2:

Variables: T L K ML ML' V V'
H1 : subst_equiv_ch L K ML ML'
H2 : equiv_ch T K V V'
============================
 subst_equiv_ch L K ML ML'

subst_equiv_ch_extend < search.
Proof completed.
Abella < Theorem subst_equiv_ch_vars_of_subst' : 
forall L K Vs ML ML', subst_equiv_ch L K ML ML' -> vars_of_ctx' L Vs ->
  vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs.


============================
 forall L K Vs ML ML', subst_equiv_ch L K ML ML' -> vars_of_ctx' L Vs ->
   vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs

subst_equiv_ch_vars_of_subst' < induction on 1.

IH : forall L K Vs ML ML', subst_equiv_ch L K ML ML' * ->
       vars_of_ctx' L Vs -> vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs
============================
 forall L K Vs ML ML', subst_equiv_ch L K ML ML' @ -> vars_of_ctx' L Vs ->
   vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs

subst_equiv_ch_vars_of_subst' < intros.

Variables: L K Vs ML ML'
IH : forall L K Vs ML ML', subst_equiv_ch L K ML ML' * ->
       vars_of_ctx' L Vs -> vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs
H1 : subst_equiv_ch L K ML ML' @
H2 : vars_of_ctx' L Vs
============================
 vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs

subst_equiv_ch_vars_of_subst' < case H1.
Subgoal 1:

Variables: K Vs
IH : forall L K Vs ML ML', subst_equiv_ch L K ML ML' * ->
       vars_of_ctx' L Vs -> vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs
H2 : vars_of_ctx' nil Vs
============================
 vars_of_subst' nil Vs /\ vars_of_subst' nil Vs

Subgoal 2 is:
 vars_of_subst' (map n1 V :: ML1) (Vs n1) /\
   vars_of_subst' (map n1 V' :: ML'1) (Vs n1)

subst_equiv_ch_vars_of_subst' < case H2.
Subgoal 1:

Variables: K
IH : forall L K Vs ML ML', subst_equiv_ch L K ML ML' * ->
       vars_of_ctx' L Vs -> vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs
============================
 vars_of_subst' nil nil /\ vars_of_subst' nil nil

Subgoal 2 is:
 vars_of_subst' (map n1 V :: ML1) (Vs n1) /\
   vars_of_subst' (map n1 V' :: ML'1) (Vs n1)

subst_equiv_ch_vars_of_subst' < search.
Subgoal 2:

Variables: K Vs ML'1 V' ML1 V L1 T
IH : forall L K Vs ML ML', subst_equiv_ch L K ML ML' * ->
       vars_of_ctx' L Vs -> vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs
H2 : vars_of_ctx' (of' n1 T :: L1) (Vs n1)
H3 : equiv_ch T K V V'
H4 : subst_equiv_ch L1 K ML1 ML'1 *
============================
 vars_of_subst' (map n1 V :: ML1) (Vs n1) /\
   vars_of_subst' (map n1 V' :: ML'1) (Vs n1)

subst_equiv_ch_vars_of_subst' < case H2.
Subgoal 2:

Variables: K ML'1 V' ML1 V L1 T Vs1
IH : forall L K Vs ML ML', subst_equiv_ch L K ML ML' * ->
       vars_of_ctx' L Vs -> vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs
H3 : equiv_ch T K V V'
H4 : subst_equiv_ch L1 K ML1 ML'1 *
H5 : vars_of_ctx' L1 (Vs1 n1)
============================
 vars_of_subst' (map n1 V :: ML1) (n1 :: Vs1 n1) /\
   vars_of_subst' (map n1 V' :: ML'1) (n1 :: Vs1 n1)

subst_equiv_ch_vars_of_subst' < apply vars_of_ctx'_prune2 to H5.
Subgoal 2:

Variables: K ML'1 V' ML1 V L1 T Vs'
IH : forall L K Vs ML ML', subst_equiv_ch L K ML ML' * ->
       vars_of_ctx' L Vs -> vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs
H3 : equiv_ch T K V V'
H4 : subst_equiv_ch L1 K ML1 ML'1 *
H5 : vars_of_ctx' L1 Vs'
============================
 vars_of_subst' (map n1 V :: ML1) (n1 :: Vs') /\
   vars_of_subst' (map n1 V' :: ML'1) (n1 :: Vs')

subst_equiv_ch_vars_of_subst' < apply IH to H4 H5.
Subgoal 2:

Variables: K ML'1 V' ML1 V L1 T Vs'
IH : forall L K Vs ML ML', subst_equiv_ch L K ML ML' * ->
       vars_of_ctx' L Vs -> vars_of_subst' ML Vs /\ vars_of_subst' ML' Vs
H3 : equiv_ch T K V V'
H4 : subst_equiv_ch L1 K ML1 ML'1 *
H5 : vars_of_ctx' L1 Vs'
H6 : vars_of_subst' ML1 Vs'
H7 : vars_of_subst' ML'1 Vs'
============================
 vars_of_subst' (map n1 V :: ML1) (n1 :: Vs') /\
   vars_of_subst' (map n1 V' :: ML'1) (n1 :: Vs')

subst_equiv_ch_vars_of_subst' < search.
Proof completed.
Abella < Theorem subst'_hconstr_permute_aux : 
forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'} ->
  (exists P R', nabla x, app_subst ML M P /\ app_subst ML (R x) (R' x) /\
       {hconstr P R' P'}).


============================
 forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'} ->
   (exists P R', nabla x, app_subst ML M P /\ app_subst ML (R x) (R' x) /\
        {hconstr P R' P'})

subst'_hconstr_permute_aux < induction on 2.

IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
============================
 forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}@ ->
   (exists P R', nabla x, app_subst ML M P /\ app_subst ML (R x) (R' x) /\
        {hconstr P R' P'})

subst'_hconstr_permute_aux < intros.

Variables: ML M M' P' R
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML M' P'
H2 : {hconstr M R M'}@
============================
 exists P R', nabla x, app_subst ML M P /\ app_subst ML (R x) (R' x) /\
   {hconstr P R' P'}

subst'_hconstr_permute_aux < case H2.
Subgoal 1:

Variables: ML P' R M1
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (hbase (R M1)) P'
============================
 exists P R', nabla x, app_subst ML (hbase M1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

Subgoal 2 is:
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

subst'_hconstr_permute_aux < apply app_subst'_hbase_comm to H1.
Subgoal 1:

Variables: ML R M1 M'1
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (hbase (R M1)) (hbase M'1)
H3 : app_subst ML (R M1) M'1
============================
 exists P R', nabla x, app_subst ML (hbase M1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' (hbase M'1)}

Subgoal 2 is:
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

subst'_hconstr_permute_aux < apply app_subst'_meta_app_comm to H3 with R = R, M = M1.
Subgoal 1:

Variables: ML R M1 R' M'2
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (hbase (R M1)) (hbase (R' M'2))
H3 : app_subst ML (R M1) (R' M'2)
H4 : app_subst ML (R n1) (R' n1)
H5 : app_subst ML M1 M'2
============================
 exists P R'1, nabla x, app_subst ML (hbase M1) P /\
   app_subst ML (R x) (R'1 x) /\ {hconstr P R'1 (hbase (R' M'2))}

Subgoal 2 is:
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

subst'_hconstr_permute_aux < exists hbase M'2.
Subgoal 1:

Variables: ML R M1 R' M'2
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (hbase (R M1)) (hbase (R' M'2))
H3 : app_subst ML (R M1) (R' M'2)
H4 : app_subst ML (R n1) (R' n1)
H5 : app_subst ML M1 M'2
============================
 exists R'1, nabla x, app_subst ML (hbase M1) (hbase M'2) /\
   app_subst ML (R x) (R'1 x) /\ {hconstr (hbase M'2) R'1 (hbase (R' M'2))}

Subgoal 2 is:
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

subst'_hconstr_permute_aux < exists R'.
Subgoal 1:

Variables: ML R M1 R' M'2
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (hbase (R M1)) (hbase (R' M'2))
H3 : app_subst ML (R M1) (R' M'2)
H4 : app_subst ML (R n1) (R' n1)
H5 : app_subst ML M1 M'2
============================
 nabla x, app_subst ML (hbase M1) (hbase M'2) /\ app_subst ML (R x) (R' x) /\
   {hconstr (hbase M'2) R' (hbase (R' M'2))}

Subgoal 2 is:
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

subst'_hconstr_permute_aux < intros.
Subgoal 1:

Variables: ML R M1 R' M'2
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (hbase (R M1)) (hbase (R' M'2))
H3 : app_subst ML (R M1) (R' M'2)
H4 : app_subst ML (R n1) (R' n1)
H5 : app_subst ML M1 M'2
============================
 app_subst ML (hbase M1) (hbase M'2) /\ app_subst ML (R n1) (R' n1) /\
   {hconstr (hbase M'2) R' (hbase (R' M'2))}

Subgoal 2 is:
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

subst'_hconstr_permute_aux < split.
Subgoal 1.1:

Variables: ML R M1 R' M'2
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (hbase (R M1)) (hbase (R' M'2))
H3 : app_subst ML (R M1) (R' M'2)
H4 : app_subst ML (R n1) (R' n1)
H5 : app_subst ML M1 M'2
============================
 app_subst ML (hbase M1) (hbase M'2)

Subgoal 1.2 is:
 app_subst ML (R n1) (R' n1)

Subgoal 1.3 is:
 {hconstr (hbase M'2) R' (hbase (R' M'2))}

Subgoal 2 is:
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

subst'_hconstr_permute_aux < backchain app_subst'_hbase_compose.
Subgoal 1.2:

Variables: ML R M1 R' M'2
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (hbase (R M1)) (hbase (R' M'2))
H3 : app_subst ML (R M1) (R' M'2)
H4 : app_subst ML (R n1) (R' n1)
H5 : app_subst ML M1 M'2
============================
 app_subst ML (R n1) (R' n1)

Subgoal 1.3 is:
 {hconstr (hbase M'2) R' (hbase (R' M'2))}

Subgoal 2 is:
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

subst'_hconstr_permute_aux < search.
Subgoal 1.3:

Variables: ML R M1 R' M'2
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (hbase (R M1)) (hbase (R' M'2))
H3 : app_subst ML (R M1) (R' M'2)
H4 : app_subst ML (R n1) (R' n1)
H5 : app_subst ML M1 M'2
============================
 {hconstr (hbase M'2) R' (hbase (R' M'2))}

Subgoal 2 is:
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

subst'_hconstr_permute_aux < search.
Subgoal 2:

Variables: ML P' R R' R1
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') P'
H3 : {hconstr (R1 n1) R (R' n1)}*
============================
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' P'}

subst'_hconstr_permute_aux < apply app_subst'_habs_comm to H1.
Subgoal 2:

Variables: ML R R' R1 R'1
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hconstr (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
============================
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' (habs R'1)}

subst'_hconstr_permute_aux < apply IH to H4 H3.
Subgoal 2:

Variables: ML R R' R1 R'1 P R'2
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hconstr (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (P n1)
H6 : app_subst ML (R n2) (R'2 n1 n2)
H7 : {hconstr (P n1) (R'2 n1) (R'1 n1)}
============================
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' (habs R'1)}

subst'_hconstr_permute_aux < apply app_subst_prune to H6.
Subgoal 2:

Variables: ML R R' R1 R'1 P M''
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hconstr (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (P n1)
H6 : app_subst ML (R n2) (M'' n2)
H7 : {hconstr (P n1) (z2\M'' z2) (R'1 n1)}
============================
 exists P R', nabla x, app_subst ML (habs R1) P /\
   app_subst ML (R x) (R' x) /\ {hconstr P R' (habs R'1)}

subst'_hconstr_permute_aux < exists habs P.
Subgoal 2:

Variables: ML R R' R1 R'1 P M''
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hconstr (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (P n1)
H6 : app_subst ML (R n2) (M'' n2)
H7 : {hconstr (P n1) (z2\M'' z2) (R'1 n1)}
============================
 exists R', nabla x, app_subst ML (habs R1) (habs P) /\
   app_subst ML (R x) (R' x) /\ {hconstr (habs P) R' (habs R'1)}

subst'_hconstr_permute_aux < exists M''.
Subgoal 2:

Variables: ML R R' R1 R'1 P M''
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hconstr (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (P n1)
H6 : app_subst ML (R n2) (M'' n2)
H7 : {hconstr (P n1) (z2\M'' z2) (R'1 n1)}
============================
 nabla x, app_subst ML (habs R1) (habs P) /\ app_subst ML (R x) (M'' x) /\
   {hconstr (habs P) M'' (habs R'1)}

subst'_hconstr_permute_aux < intros.
Subgoal 2:

Variables: ML R R' R1 R'1 P M''
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hconstr (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (P n1)
H6 : app_subst ML (R n2) (M'' n2)
H7 : {hconstr (P n1) (z2\M'' z2) (R'1 n1)}
============================
 app_subst ML (habs R1) (habs P) /\ app_subst ML (R n1) (M'' n1) /\
   {hconstr (habs P) M'' (habs R'1)}

subst'_hconstr_permute_aux < split.
Subgoal 2.1:

Variables: ML R R' R1 R'1 P M''
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hconstr (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (P n1)
H6 : app_subst ML (R n2) (M'' n2)
H7 : {hconstr (P n1) (z2\M'' z2) (R'1 n1)}
============================
 app_subst ML (habs R1) (habs P)

Subgoal 2.2 is:
 app_subst ML (R n1) (M'' n1)

Subgoal 2.3 is:
 {hconstr (habs P) M'' (habs R'1)}

subst'_hconstr_permute_aux < apply app_subst'_habs_compose to H5.
Subgoal 2.1:

Variables: ML R R' R1 R'1 P M''
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hconstr (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (P n1)
H6 : app_subst ML (R n2) (M'' n2)
H7 : {hconstr (P n1) (z2\M'' z2) (R'1 n1)}
H8 : app_subst ML (habs (z2\R1 z2)) (habs (z2\P z2))
============================
 app_subst ML (habs R1) (habs P)

Subgoal 2.2 is:
 app_subst ML (R n1) (M'' n1)

Subgoal 2.3 is:
 {hconstr (habs P) M'' (habs R'1)}

subst'_hconstr_permute_aux < search.
Subgoal 2.2:

Variables: ML R R' R1 R'1 P M''
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hconstr (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (P n1)
H6 : app_subst ML (R n2) (M'' n2)
H7 : {hconstr (P n1) (z2\M'' z2) (R'1 n1)}
============================
 app_subst ML (R n1) (M'' n1)

Subgoal 2.3 is:
 {hconstr (habs P) M'' (habs R'1)}

subst'_hconstr_permute_aux < search.
Subgoal 2.3:

Variables: ML R R' R1 R'1 P M''
IH : forall ML M M' P' R, app_subst ML M' P' -> {hconstr M R M'}* ->
       (exists P R', nabla x, app_subst ML M P /\
            app_subst ML (R x) (R' x) /\ {hconstr P R' P'})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hconstr (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (P n1)
H6 : app_subst ML (R n2) (M'' n2)
H7 : {hconstr (P n1) (z2\M'' z2) (R'1 n1)}
============================
 {hconstr (habs P) M'' (habs R'1)}

subst'_hconstr_permute_aux < search.
Proof completed.
Abella < Theorem subst'_hconstr_permute : 
forall ML M M' P' FE FE' R, nabla x, {tm' x |- tm' (R x)} ->
  app_subst ML (htm FE M') (htm FE' P') -> {hconstr M R M'} ->
  (exists P, app_subst ML (htm FE M) (htm FE' P) /\ {hconstr P R P'}).


============================
 forall ML M M' P' FE FE' R, nabla x, {tm' x |- tm' (R x)} ->
   app_subst ML (htm FE M') (htm FE' P') -> {hconstr M R M'} ->
   (exists P, app_subst ML (htm FE M) (htm FE' P) /\ {hconstr P R P'})

subst'_hconstr_permute < intros.

Variables: ML M M' P' FE FE' R
H1 : {tm' n1 |- tm' (R n1)}
H2 : app_subst ML (htm FE M') (htm FE' P')
H3 : {hconstr M R M'}
============================
 exists P, app_subst ML (htm FE M) (htm FE' P) /\ {hconstr P R P'}

subst'_hconstr_permute < apply app_subst'_htm_comm to H2.

Variables: ML M M' P' FE FE' R
H1 : {tm' n1 |- tm' (R n1)}
H2 : app_subst ML (htm FE M') (htm FE' P')
H3 : {hconstr M R M'}
H4 : app_subst_list ML FE FE'
H5 : app_subst ML M' P'
============================
 exists P, app_subst ML (htm FE M) (htm FE' P) /\ {hconstr P R P'}

subst'_hconstr_permute < apply subst'_hconstr_permute_aux to H5 H3.

Variables: ML M M' P' FE FE' R P R'
H1 : {tm' n1 |- tm' (R n1)}
H2 : app_subst ML (htm FE M') (htm FE' P')
H3 : {hconstr M R M'}
H4 : app_subst_list ML FE FE'
H5 : app_subst ML M' P'
H6 : app_subst ML M P
H7 : app_subst ML (R n1) (R' n1)
H8 : {hconstr P R' P'}
============================
 exists P, app_subst ML (htm FE M) (htm FE' P) /\ {hconstr P R P'}

subst'_hconstr_permute < apply app_subst'_abs_compose to H7.

Variables: ML M M' P' FE FE' R P R'
H1 : {tm' n1 |- tm' (R n1)}
H2 : app_subst ML (htm FE M') (htm FE' P')
H3 : {hconstr M R M'}
H4 : app_subst_list ML FE FE'
H5 : app_subst ML M' P'
H6 : app_subst ML M P
H7 : app_subst ML (R n1) (R' n1)
H8 : {hconstr P R' P'}
H9 : app_subst ML (abs' (z2\R z2)) (abs' (z2\R' z2))
============================
 exists P, app_subst ML (htm FE M) (htm FE' P) /\ {hconstr P R P'}

subst'_hconstr_permute < apply subst'_closed_tm_eq to _ H9.

Variables: ML M M' P' FE FE' P R'
H1 : {tm' n1 |- tm' (R' n1)}
H2 : app_subst ML (htm FE M') (htm FE' P')
H3 : {hconstr M (z1\R' z1) M'}
H4 : app_subst_list ML FE FE'
H5 : app_subst ML M' P'
H6 : app_subst ML M P
H7 : app_subst ML (R' n1) (R' n1)
H8 : {hconstr P R' P'}
H9 : app_subst ML (abs' (z2\R' z2)) (abs' (z2\R' z2))
============================
 exists P, app_subst ML (htm FE M) (htm FE' P) /\ {hconstr P (z1\R' z1) P'}

subst'_hconstr_permute < apply app_subst'_htm_compose to H4 H6.

Variables: ML M M' P' FE FE' P R'
H1 : {tm' n1 |- tm' (R' n1)}
H2 : app_subst ML (htm FE M') (htm FE' P')
H3 : {hconstr M (z1\R' z1) M'}
H4 : app_subst_list ML FE FE'
H5 : app_subst ML M' P'
H6 : app_subst ML M P
H7 : app_subst ML (R' n1) (R' n1)
H8 : {hconstr P R' P'}
H9 : app_subst ML (abs' (z2\R' z2)) (abs' (z2\R' z2))
H10 : app_subst ML (htm FE M) (htm FE' P)
============================
 exists P, app_subst ML (htm FE M) (htm FE' P) /\ {hconstr P (z1\R' z1) P'}

subst'_hconstr_permute < search.
Proof completed.
Abella < Theorem subst'_hcombine_permute_aux : 
forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M} ->
  (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
       app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
       {hcombine M1' M2' R' P}).


============================
 forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M} ->
   (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
        app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
        {hcombine M1' M2' R' P})

subst'_hcombine_permute_aux < induction on 2.

IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
============================
 forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}@ ->
   (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
        app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
        {hcombine M1' M2' R' P})

subst'_hcombine_permute_aux < intros.

Variables: ML M M1 M2 P R
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML M P
H2 : {hcombine M1 M2 R M}@
============================
 exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   app_subst ML (R x y) (R' x y) /\ {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < case H2.
Subgoal 1:

Variables: ML P R M3 M4
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) P
============================
 exists M1' M2' R', nabla x y, app_subst ML (hbase M4) M1' /\
   app_subst ML (hbase M3) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < apply app_subst'_hbase_comm to H1.
Subgoal 1:

Variables: ML R M3 M4 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase M')
H3 : app_subst ML (R M4 M3) M'
============================
 exists M1' M2' R', nabla x y, app_subst ML (hbase M4) M1' /\
   app_subst ML (hbase M3) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' (hbase M')}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < apply app_subst'_meta_app_comm to H3 with R = x\R x M3, M = M4.
Subgoal 1:

Variables: ML R M3 M4 R' M'1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R' M'1))
H3 : app_subst ML (R M4 M3) (R' M'1)
H4 : app_subst ML (R n1 M3) (R' n1)
H5 : app_subst ML M4 M'1
============================
 exists M1' M2' R'1, nabla x y, app_subst ML (hbase M4) M1' /\
   app_subst ML (hbase M3) M2' /\ app_subst ML (R x y) (R'1 x y) /\
   {hcombine M1' M2' R'1 (hbase (R' M'1))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < apply app_subst'_meta_app_comm to H4 with R = x\R n1 x, M = M3.
Subgoal 1:

Variables: ML R M3 M4 M'1 R'1 M'2
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R'1 M'1 (M'2 M'1)))
H3 : app_subst ML (R M4 M3) (R'1 M'1 (M'2 M'1))
H4 : app_subst ML (R n1 M3) (R'1 n1 (M'2 n1))
H5 : app_subst ML M4 M'1
H6 : app_subst ML (R n1 n2) (R'1 n1 n2)
H7 : app_subst ML M3 (M'2 n1)
============================
 exists M1' M2' R'2, nabla x y, app_subst ML (hbase M4) M1' /\
   app_subst ML (hbase M3) M2' /\ app_subst ML (R x y) (R'2 x y) /\
   {hcombine M1' M2' R'2 (hbase (R'1 M'1 (M'2 M'1)))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < apply app_subst_prune to H7.
Subgoal 1:

Variables: ML R M3 M4 M'1 R'1 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R'1 M'1 M''))
H3 : app_subst ML (R M4 M3) (R'1 M'1 M'')
H4 : app_subst ML (R n1 M3) (R'1 n1 M'')
H5 : app_subst ML M4 M'1
H6 : app_subst ML (R n1 n2) (R'1 n1 n2)
H7 : app_subst ML M3 M''
============================
 exists M1' M2' R'2, nabla x y, app_subst ML (hbase M4) M1' /\
   app_subst ML (hbase M3) M2' /\ app_subst ML (R x y) (R'2 x y) /\
   {hcombine M1' M2' R'2 (hbase (R'1 M'1 M''))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < exists hbase M'1.
Subgoal 1:

Variables: ML R M3 M4 M'1 R'1 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R'1 M'1 M''))
H3 : app_subst ML (R M4 M3) (R'1 M'1 M'')
H4 : app_subst ML (R n1 M3) (R'1 n1 M'')
H5 : app_subst ML M4 M'1
H6 : app_subst ML (R n1 n2) (R'1 n1 n2)
H7 : app_subst ML M3 M''
============================
 exists M2' R'2, nabla x y, app_subst ML (hbase M4) (hbase M'1) /\
   app_subst ML (hbase M3) M2' /\ app_subst ML (R x y) (R'2 x y) /\
   {hcombine (hbase M'1) M2' R'2 (hbase (R'1 M'1 M''))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < exists hbase M''.
Subgoal 1:

Variables: ML R M3 M4 M'1 R'1 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R'1 M'1 M''))
H3 : app_subst ML (R M4 M3) (R'1 M'1 M'')
H4 : app_subst ML (R n1 M3) (R'1 n1 M'')
H5 : app_subst ML M4 M'1
H6 : app_subst ML (R n1 n2) (R'1 n1 n2)
H7 : app_subst ML M3 M''
============================
 exists R'2, nabla x y, app_subst ML (hbase M4) (hbase M'1) /\
   app_subst ML (hbase M3) (hbase M'') /\ app_subst ML (R x y) (R'2 x y) /\
   {hcombine (hbase M'1) (hbase M'') R'2 (hbase (R'1 M'1 M''))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < exists R'1.
Subgoal 1:

Variables: ML R M3 M4 M'1 R'1 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R'1 M'1 M''))
H3 : app_subst ML (R M4 M3) (R'1 M'1 M'')
H4 : app_subst ML (R n1 M3) (R'1 n1 M'')
H5 : app_subst ML M4 M'1
H6 : app_subst ML (R n1 n2) (R'1 n1 n2)
H7 : app_subst ML M3 M''
============================
 nabla x y, app_subst ML (hbase M4) (hbase M'1) /\
   app_subst ML (hbase M3) (hbase M'') /\ app_subst ML (R x y) (R'1 x y) /\
   {hcombine (hbase M'1) (hbase M'') R'1 (hbase (R'1 M'1 M''))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < intros.
Subgoal 1:

Variables: ML R M3 M4 M'1 R'1 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R'1 M'1 M''))
H3 : app_subst ML (R M4 M3) (R'1 M'1 M'')
H4 : app_subst ML (R n1 M3) (R'1 n1 M'')
H5 : app_subst ML M4 M'1
H6 : app_subst ML (R n1 n2) (R'1 n1 n2)
H7 : app_subst ML M3 M''
============================
 app_subst ML (hbase M4) (hbase M'1) /\
   app_subst ML (hbase M3) (hbase M'') /\
   app_subst ML (R n1 n2) (R'1 n1 n2) /\
   {hcombine (hbase M'1) (hbase M'') R'1 (hbase (R'1 M'1 M''))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < split.
Subgoal 1.1:

Variables: ML R M3 M4 M'1 R'1 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R'1 M'1 M''))
H3 : app_subst ML (R M4 M3) (R'1 M'1 M'')
H4 : app_subst ML (R n1 M3) (R'1 n1 M'')
H5 : app_subst ML M4 M'1
H6 : app_subst ML (R n1 n2) (R'1 n1 n2)
H7 : app_subst ML M3 M''
============================
 app_subst ML (hbase M4) (hbase M'1)

Subgoal 1.2 is:
 app_subst ML (hbase M3) (hbase M'')

Subgoal 1.3 is:
 app_subst ML (R n1 n2) (R'1 n1 n2)

Subgoal 1.4 is:
 {hcombine (hbase M'1) (hbase M'') R'1 (hbase (R'1 M'1 M''))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < backchain app_subst'_hbase_compose.
Subgoal 1.2:

Variables: ML R M3 M4 M'1 R'1 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R'1 M'1 M''))
H3 : app_subst ML (R M4 M3) (R'1 M'1 M'')
H4 : app_subst ML (R n1 M3) (R'1 n1 M'')
H5 : app_subst ML M4 M'1
H6 : app_subst ML (R n1 n2) (R'1 n1 n2)
H7 : app_subst ML M3 M''
============================
 app_subst ML (hbase M3) (hbase M'')

Subgoal 1.3 is:
 app_subst ML (R n1 n2) (R'1 n1 n2)

Subgoal 1.4 is:
 {hcombine (hbase M'1) (hbase M'') R'1 (hbase (R'1 M'1 M''))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < backchain app_subst'_hbase_compose.
Subgoal 1.3:

Variables: ML R M3 M4 M'1 R'1 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R'1 M'1 M''))
H3 : app_subst ML (R M4 M3) (R'1 M'1 M'')
H4 : app_subst ML (R n1 M3) (R'1 n1 M'')
H5 : app_subst ML M4 M'1
H6 : app_subst ML (R n1 n2) (R'1 n1 n2)
H7 : app_subst ML M3 M''
============================
 app_subst ML (R n1 n2) (R'1 n1 n2)

Subgoal 1.4 is:
 {hcombine (hbase M'1) (hbase M'') R'1 (hbase (R'1 M'1 M''))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < search.
Subgoal 1.4:

Variables: ML R M3 M4 M'1 R'1 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (hbase (R M4 M3)) (hbase (R'1 M'1 M''))
H3 : app_subst ML (R M4 M3) (R'1 M'1 M'')
H4 : app_subst ML (R n1 M3) (R'1 n1 M'')
H5 : app_subst ML M4 M'1
H6 : app_subst ML (R n1 n2) (R'1 n1 n2)
H7 : app_subst ML M3 M''
============================
 {hcombine (hbase M'1) (hbase M'') R'1 (hbase (R'1 M'1 M''))}

Subgoal 2 is:
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < search.
Subgoal 2:

Variables: ML M2 P R R' R1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') P
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
============================
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < apply app_subst'_habs_comm to H1.
Subgoal 2:

Variables: ML M2 R R' R1 R'1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
============================
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < apply IH to H4 H3.
Subgoal 2:

Variables: ML M2 R R' R1 R'1 M1' M2' R'2
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 (M2' n1)
H7 : app_subst ML (R n2 n3) (R'2 n1 n2 n3)
H8 : {hcombine (M1' n1) (M2' n1) (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < apply app_subst_prune to H6.
Subgoal 2:

Variables: ML M2 R R' R1 R'1 M1' R'2 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (R'2 n1 n2 n3)
H8 : {hcombine (M1' n1) M'' (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < apply app_subst_prune to H7.
Subgoal 2:

Variables: ML M2 R R' R1 R'1 M1' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (M1' n1) M'' (z2\z3\M''1 z3 z2) (R'1 n1)}
============================
 exists M1' M2' R', nabla x y, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < exists habs M1'.
Subgoal 2:

Variables: ML M2 R R' R1 R'1 M1' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (M1' n1) M'' (z2\z3\M''1 z3 z2) (R'1 n1)}
============================
 exists M2' R', nabla x y, app_subst ML (habs R1) (habs M1') /\
   app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine (habs M1') M2' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < exists M''.
Subgoal 2:

Variables: ML M2 R R' R1 R'1 M1' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (M1' n1) M'' (z2\z3\M''1 z3 z2) (R'1 n1)}
============================
 exists R', nabla x y, app_subst ML (habs R1) (habs M1') /\
   app_subst ML M2 M'' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine (habs M1') M'' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < exists x\y\M''1 y x.
Subgoal 2:

Variables: ML M2 R R' R1 R'1 M1' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (M1' n1) M'' (z2\z3\M''1 z3 z2) (R'1 n1)}
============================
 nabla x y, app_subst ML (habs R1) (habs M1') /\ app_subst ML M2 M'' /\
   app_subst ML (R x y) (M''1 y x) /\
   {hcombine (habs M1') M'' (x\y\M''1 y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < intros.
Subgoal 2:

Variables: ML M2 R R' R1 R'1 M1' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (M1' n1) M'' (z2\z3\M''1 z3 z2) (R'1 n1)}
============================
 app_subst ML (habs R1) (habs M1') /\ app_subst ML M2 M'' /\
   app_subst ML (R n1 n2) (M''1 n2 n1) /\
   {hcombine (habs M1') M'' (x\y\M''1 y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < split.
Subgoal 2.1:

Variables: ML M2 R R' R1 R'1 M1' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (M1' n1) M'' (z2\z3\M''1 z3 z2) (R'1 n1)}
============================
 app_subst ML (habs R1) (habs M1')

Subgoal 2.2 is:
 app_subst ML M2 M''

Subgoal 2.3 is:
 app_subst ML (R n1 n2) (M''1 n2 n1)

Subgoal 2.4 is:
 {hcombine (habs M1') M'' (x\y\M''1 y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < apply app_subst'_habs_compose to H5.
Subgoal 2.1:

Variables: ML M2 R R' R1 R'1 M1' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (M1' n1) M'' (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML (habs (z2\R1 z2)) (habs (z2\M1' z2))
============================
 app_subst ML (habs R1) (habs M1')

Subgoal 2.2 is:
 app_subst ML M2 M''

Subgoal 2.3 is:
 app_subst ML (R n1 n2) (M''1 n2 n1)

Subgoal 2.4 is:
 {hcombine (habs M1') M'' (x\y\M''1 y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < search.
Subgoal 2.2:

Variables: ML M2 R R' R1 R'1 M1' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (M1' n1) M'' (z2\z3\M''1 z3 z2) (R'1 n1)}
============================
 app_subst ML M2 M''

Subgoal 2.3 is:
 app_subst ML (R n1 n2) (M''1 n2 n1)

Subgoal 2.4 is:
 {hcombine (habs M1') M'' (x\y\M''1 y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < search.
Subgoal 2.3:

Variables: ML M2 R R' R1 R'1 M1' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (M1' n1) M'' (z2\z3\M''1 z3 z2) (R'1 n1)}
============================
 app_subst ML (R n1 n2) (M''1 n2 n1)

Subgoal 2.4 is:
 {hcombine (habs M1') M'' (x\y\M''1 y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < search.
Subgoal 2.4:

Variables: ML M2 R R' R1 R'1 M1' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (R1 n1) M2 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (M1' n1) M'' (z2\z3\M''1 z3 z2) (R'1 n1)}
============================
 {hcombine (habs M1') M'' (x\y\M''1 y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < search.
Subgoal 3:

Variables: ML P R R' R1 M3
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') P
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
============================
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' P}

subst'_hcombine_permute_aux < apply app_subst'_habs_comm to H1.
Subgoal 3:

Variables: ML R R' R1 M3 R'1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
============================
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' (habs R'1)}

subst'_hcombine_permute_aux < apply IH to H4 H3.
Subgoal 3:

Variables: ML R R' R1 M3 R'1 M1' M2' R'2
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (M1' n1)
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (R'2 n1 n2 n3)
H8 : {hcombine (M1' n1) (M2' n1) (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' (habs R'1)}

subst'_hcombine_permute_aux < apply app_subst_prune to H5.
Subgoal 3:

Variables: ML R R' R1 M3 R'1 M2' R'2 M''
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) M''
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (R'2 n1 n2 n3)
H8 : {hcombine M'' (M2' n1) (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' (habs R'1)}

subst'_hcombine_permute_aux < apply app_subst_prune to H7.
Subgoal 3:

Variables: ML R R' R1 M3 R'1 M2' M'' M''1
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) M''
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine M'' (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
============================
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' (habs R'1)}

subst'_hcombine_permute_aux < apply app_subst'_hbase_comm to H5.
Subgoal 3:

Variables: ML R R' R1 M3 R'1 M2' M''1 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (hbase M') (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML M3 M'
============================
 exists M1' M2' R', nabla x y, app_subst ML (hbase M3) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine M1' M2' R' (habs R'1)}

subst'_hcombine_permute_aux < exists hbase M'.
Subgoal 3:

Variables: ML R R' R1 M3 R'1 M2' M''1 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (hbase M') (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML M3 M'
============================
 exists M2' R', nabla x y, app_subst ML (hbase M3) (hbase M') /\
   app_subst ML (habs R1) M2' /\ app_subst ML (R x y) (R' x y) /\
   {hcombine (hbase M') M2' R' (habs R'1)}

subst'_hcombine_permute_aux < exists habs M2'.
Subgoal 3:

Variables: ML R R' R1 M3 R'1 M2' M''1 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (hbase M') (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML M3 M'
============================
 exists R', nabla x y, app_subst ML (hbase M3) (hbase M') /\
   app_subst ML (habs R1) (habs M2') /\ app_subst ML (R x y) (R' x y) /\
   {hcombine (hbase M') (habs M2') R' (habs R'1)}

subst'_hcombine_permute_aux < exists x\y\M''1 y x.
Subgoal 3:

Variables: ML R R' R1 M3 R'1 M2' M''1 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (hbase M') (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML M3 M'
============================
 nabla x y, app_subst ML (hbase M3) (hbase M') /\
   app_subst ML (habs R1) (habs M2') /\ app_subst ML (R x y) (M''1 y x) /\
   {hcombine (hbase M') (habs M2') (x\y\M''1 y x) (habs R'1)}

subst'_hcombine_permute_aux < intros.
Subgoal 3:

Variables: ML R R' R1 M3 R'1 M2' M''1 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (hbase M') (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML M3 M'
============================
 app_subst ML (hbase M3) (hbase M') /\ app_subst ML (habs R1) (habs M2') /\
   app_subst ML (R n1 n2) (M''1 n2 n1) /\
   {hcombine (hbase M') (habs M2') (x\y\M''1 y x) (habs R'1)}

subst'_hcombine_permute_aux < split.
Subgoal 3.1:

Variables: ML R R' R1 M3 R'1 M2' M''1 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (hbase M') (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML M3 M'
============================
 app_subst ML (hbase M3) (hbase M')

Subgoal 3.2 is:
 app_subst ML (habs R1) (habs M2')

Subgoal 3.3 is:
 app_subst ML (R n1 n2) (M''1 n2 n1)

Subgoal 3.4 is:
 {hcombine (hbase M') (habs M2') (x\y\M''1 y x) (habs R'1)}

subst'_hcombine_permute_aux < search.
Subgoal 3.2:

Variables: ML R R' R1 M3 R'1 M2' M''1 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (hbase M') (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML M3 M'
============================
 app_subst ML (habs R1) (habs M2')

Subgoal 3.3 is:
 app_subst ML (R n1 n2) (M''1 n2 n1)

Subgoal 3.4 is:
 {hcombine (hbase M') (habs M2') (x\y\M''1 y x) (habs R'1)}

subst'_hcombine_permute_aux < apply app_subst'_habs_compose to H6.
Subgoal 3.2:

Variables: ML R R' R1 M3 R'1 M2' M''1 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (hbase M') (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML M3 M'
H10 : app_subst ML (habs (z2\R1 z2)) (habs (z2\M2' z2))
============================
 app_subst ML (habs R1) (habs M2')

Subgoal 3.3 is:
 app_subst ML (R n1 n2) (M''1 n2 n1)

Subgoal 3.4 is:
 {hcombine (hbase M') (habs M2') (x\y\M''1 y x) (habs R'1)}

subst'_hcombine_permute_aux < search.
Subgoal 3.3:

Variables: ML R R' R1 M3 R'1 M2' M''1 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (hbase M') (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML M3 M'
============================
 app_subst ML (R n1 n2) (M''1 n2 n1)

Subgoal 3.4 is:
 {hcombine (hbase M') (habs M2') (x\y\M''1 y x) (habs R'1)}

subst'_hcombine_permute_aux < search.
Subgoal 3.4:

Variables: ML R R' R1 M3 R'1 M2' M''1 M'
IH : forall ML M M1 M2 P R, app_subst ML M P -> {hcombine M1 M2 R M}* ->
       (exists M1' M2' R', nabla x y, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML (R x y) (R' x y) /\
            {hcombine M1' M2' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine (hbase M3) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML (R n2 n3) (M''1 n3 n2)
H8 : {hcombine (hbase M') (M2' n1) (z2\z3\M''1 z3 z2) (R'1 n1)}
H9 : app_subst ML M3 M'
============================
 {hcombine (hbase M') (habs M2') (x\y\M''1 y x) (habs R'1)}

subst'_hcombine_permute_aux < search.
Proof completed.
Abella < Theorem subst'_hcombine_permute : 
forall ML M M1 M2 P R, nabla x y, {tm' x, tm' y |- tm' (R x y)} ->
  app_subst ML M P -> {hcombine M1 M2 R M} ->
  (exists M1' M2', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
       {hcombine M1' M2' R P}).


============================
 forall ML M M1 M2 P R, nabla x y, {tm' x, tm' y |- tm' (R x y)} ->
   app_subst ML M P -> {hcombine M1 M2 R M} ->
   (exists M1' M2', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
        {hcombine M1' M2' R P})

subst'_hcombine_permute < intros.

Variables: ML M M1 M2 P R
H1 : {tm' n1, tm' n2 |- tm' (R n1 n2)}
H2 : app_subst ML M P
H3 : {hcombine M1 M2 R M}
============================
 exists M1' M2', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   {hcombine M1' M2' R P}

subst'_hcombine_permute < apply subst'_hcombine_permute_aux to H2 H3.

Variables: ML M M1 M2 P R M1' M2' R'
H1 : {tm' n1, tm' n2 |- tm' (R n1 n2)}
H2 : app_subst ML M P
H3 : {hcombine M1 M2 R M}
H4 : app_subst ML M1 M1'
H5 : app_subst ML M2 M2'
H6 : app_subst ML (R n1 n2) (R' n1 n2)
H7 : {hcombine M1' M2' R' P}
============================
 exists M1' M2', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   {hcombine M1' M2' R P}

subst'_hcombine_permute < apply app_subst'_abs_compose to H6.

Variables: ML M M1 M2 P R M1' M2' R'
H1 : {tm' n1, tm' n2 |- tm' (R n1 n2)}
H2 : app_subst ML M P
H3 : {hcombine M1 M2 R M}
H4 : app_subst ML M1 M1'
H5 : app_subst ML M2 M2'
H6 : app_subst ML (R n1 n2) (R' n1 n2)
H7 : {hcombine M1' M2' R' P}
H8 : app_subst ML (abs' (z3\R z3 n2)) (abs' (z3\R' z3 n2))
============================
 exists M1' M2', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   {hcombine M1' M2' R P}

subst'_hcombine_permute < apply app_subst'_abs_compose to H8.

Variables: ML M M1 M2 P R M1' M2' R'
H1 : {tm' n1, tm' n2 |- tm' (R n1 n2)}
H2 : app_subst ML M P
H3 : {hcombine M1 M2 R M}
H4 : app_subst ML M1 M1'
H5 : app_subst ML M2 M2'
H6 : app_subst ML (R n1 n2) (R' n1 n2)
H7 : {hcombine M1' M2' R' P}
H8 : app_subst ML (abs' (z3\R z3 n2)) (abs' (z3\R' z3 n2))
H9 : app_subst ML (abs' (z2\abs' (z3\R z3 z2)))
       (abs' (z2\abs' (z3\R' z3 z2)))
============================
 exists M1' M2', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   {hcombine M1' M2' R P}

subst'_hcombine_permute < apply subst'_closed_tm_eq to _ H9.

Variables: ML M M1 M2 P M1' M2' R'
H1 : {tm' n1, tm' n2 |- tm' (R' n1 n2)}
H2 : app_subst ML M P
H3 : {hcombine M1 M2 (z1\z2\R' z1 z2) M}
H4 : app_subst ML M1 M1'
H5 : app_subst ML M2 M2'
H6 : app_subst ML (R' n1 n2) (R' n1 n2)
H7 : {hcombine M1' M2' R' P}
H8 : app_subst ML (abs' (z3\R' z3 n2)) (abs' (z3\R' z3 n2))
H9 : app_subst ML (abs' (z2\abs' (z3\R' z3 z2)))
       (abs' (z2\abs' (z3\R' z3 z2)))
============================
 exists M1' M2', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   {hcombine M1' M2' (z1\z2\R' z1 z2) P}

subst'_hcombine_permute < search.
Proof completed.
Abella < Theorem subst'_hcombine3_permute_aux : 
forall ML M M1 M2 M3 P R, app_subst ML M P -> {hcombine3 M1 M2 M3 R M} ->
  (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
       app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
       app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}).


============================
 forall ML M M1 M2 M3 P R, app_subst ML M P -> {hcombine3 M1 M2 M3 R M} ->
   (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
        app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
        app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P})

subst'_hcombine3_permute_aux < induction on 2.

IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
============================
 forall ML M M1 M2 M3 P R, app_subst ML M P -> {hcombine3 M1 M2 M3 R M}@ ->
   (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
        app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
        app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P})

subst'_hcombine3_permute_aux < intros.

Variables: ML M M1 M2 M3 P R
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML M P
H2 : {hcombine3 M1 M2 M3 R M}@
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < case H2.
Subgoal 1:

Variables: ML P R M4 M5 M6
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) P
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M6) M1' /\
   app_subst ML (hbase M5) M2' /\ app_subst ML (hbase M4) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst'_hbase_comm to H1.
Subgoal 1:

Variables: ML R M4 M5 M6 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase M')
H3 : app_subst ML (R M6 M5 M4) M'
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M6) M1' /\
   app_subst ML (hbase M5) M2' /\ app_subst ML (hbase M4) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (hbase M')}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst'_meta_app_comm to H3 with R = x\R x M5 M4, M = M6.
Subgoal 1:

Variables: ML R M4 M5 M6 R' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R' M'1))
H3 : app_subst ML (R M6 M5 M4) (R' M'1)
H4 : app_subst ML (R n1 M5 M4) (R' n1)
H5 : app_subst ML M6 M'1
============================
 exists M1' M2' M3' R'1, nabla x y z, app_subst ML (hbase M6) M1' /\
   app_subst ML (hbase M5) M2' /\ app_subst ML (hbase M4) M3' /\
   app_subst ML (R x y z) (R'1 x y z) /\
   {hcombine3 M1' M2' M3' R'1 (hbase (R' M'1))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst'_meta_app_comm to H4 with R = x\R n1 x M4, M = M5.
Subgoal 1:

Variables: ML R M4 M5 M6 M'1 R'1 M'2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'1 M'1 (M'2 M'1)))
H3 : app_subst ML (R M6 M5 M4) (R'1 M'1 (M'2 M'1))
H4 : app_subst ML (R n1 M5 M4) (R'1 n1 (M'2 n1))
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'1 n1 n2)
H7 : app_subst ML M5 (M'2 n1)
============================
 exists M1' M2' M3' R'2, nabla x y z, app_subst ML (hbase M6) M1' /\
   app_subst ML (hbase M5) M2' /\ app_subst ML (hbase M4) M3' /\
   app_subst ML (R x y z) (R'2 x y z) /\
   {hcombine3 M1' M2' M3' R'2 (hbase (R'1 M'1 (M'2 M'1)))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst_prune to H7.
Subgoal 1:

Variables: ML R M4 M5 M6 M'1 R'1 M''
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'1 M'1 M''))
H3 : app_subst ML (R M6 M5 M4) (R'1 M'1 M'')
H4 : app_subst ML (R n1 M5 M4) (R'1 n1 M'')
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'1 n1 n2)
H7 : app_subst ML M5 M''
============================
 exists M1' M2' M3' R'2, nabla x y z, app_subst ML (hbase M6) M1' /\
   app_subst ML (hbase M5) M2' /\ app_subst ML (hbase M4) M3' /\
   app_subst ML (R x y z) (R'2 x y z) /\
   {hcombine3 M1' M2' M3' R'2 (hbase (R'1 M'1 M''))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst'_meta_app_comm to H6 with R = x\R n1 n2 x, M = M4.
Subgoal 1:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M'3
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 (M'3 M'' M'1)))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 (M'3 M'' M'1))
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 (M'3 M'' n1))
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 (M'3 n2 n1))
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 (M'3 n2 n1)
============================
 exists M1' M2' M3' R'1, nabla x y z, app_subst ML (hbase M6) M1' /\
   app_subst ML (hbase M5) M2' /\ app_subst ML (hbase M4) M3' /\
   app_subst ML (R x y z) (R'1 x y z) /\
   {hcombine3 M1' M2' M3' R'1 (hbase (R'2 M'' M'1 (M'3 M'' M'1)))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst_prune to H9.
Subgoal 1:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 (M''1 M'1)))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 (M''1 M'1))
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 (M''1 n1))
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 (M''1 n1))
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 (M''1 n1)
============================
 exists M1' M2' M3' R'1, nabla x y z, app_subst ML (hbase M6) M1' /\
   app_subst ML (hbase M5) M2' /\ app_subst ML (hbase M4) M3' /\
   app_subst ML (R x y z) (R'1 x y z) /\
   {hcombine3 M1' M2' M3' R'1 (hbase (R'2 M'' M'1 (M''1 M'1)))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst_prune to H9.
Subgoal 1:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 exists M1' M2' M3' R'1, nabla x y z, app_subst ML (hbase M6) M1' /\
   app_subst ML (hbase M5) M2' /\ app_subst ML (hbase M4) M3' /\
   app_subst ML (R x y z) (R'1 x y z) /\
   {hcombine3 M1' M2' M3' R'1 (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists hbase M'1.
Subgoal 1:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 exists M2' M3' R'1, nabla x y z, app_subst ML (hbase M6) (hbase M'1) /\
   app_subst ML (hbase M5) M2' /\ app_subst ML (hbase M4) M3' /\
   app_subst ML (R x y z) (R'1 x y z) /\
   {hcombine3 (hbase M'1) M2' M3' R'1 (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists hbase M''.
Subgoal 1:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 exists M3' R'1, nabla x y z, app_subst ML (hbase M6) (hbase M'1) /\
   app_subst ML (hbase M5) (hbase M'') /\ app_subst ML (hbase M4) M3' /\
   app_subst ML (R x y z) (R'1 x y z) /\
   {hcombine3 (hbase M'1) (hbase M'') M3' R'1 (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists hbase M''2.
Subgoal 1:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 exists R'1, nabla x y z, app_subst ML (hbase M6) (hbase M'1) /\
   app_subst ML (hbase M5) (hbase M'') /\
   app_subst ML (hbase M4) (hbase M''2) /\
   app_subst ML (R x y z) (R'1 x y z) /\
   {hcombine3 (hbase M'1) (hbase M'') (hbase M''2) R'1
      (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists x\y\z\R'2 y x z.
Subgoal 1:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 nabla x y z, app_subst ML (hbase M6) (hbase M'1) /\
   app_subst ML (hbase M5) (hbase M'') /\
   app_subst ML (hbase M4) (hbase M''2) /\
   app_subst ML (R x y z) (R'2 y x z) /\
   {hcombine3 (hbase M'1) (hbase M'') (hbase M''2) (x\y\z\R'2 y x z)
      (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < intros.
Subgoal 1:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 app_subst ML (hbase M6) (hbase M'1) /\
   app_subst ML (hbase M5) (hbase M'') /\
   app_subst ML (hbase M4) (hbase M''2) /\
   app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3) /\
   {hcombine3 (hbase M'1) (hbase M'') (hbase M''2) (x\y\z\R'2 y x z)
      (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < split.
Subgoal 1.1:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 app_subst ML (hbase M6) (hbase M'1)

Subgoal 1.2 is:
 app_subst ML (hbase M5) (hbase M'')

Subgoal 1.3 is:
 app_subst ML (hbase M4) (hbase M''2)

Subgoal 1.4 is:
 app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)

Subgoal 1.5 is:
 {hcombine3 (hbase M'1) (hbase M'') (hbase M''2) (x\y\z\R'2 y x z)
    (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < backchain app_subst'_hbase_compose.
Subgoal 1.2:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 app_subst ML (hbase M5) (hbase M'')

Subgoal 1.3 is:
 app_subst ML (hbase M4) (hbase M''2)

Subgoal 1.4 is:
 app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)

Subgoal 1.5 is:
 {hcombine3 (hbase M'1) (hbase M'') (hbase M''2) (x\y\z\R'2 y x z)
    (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < backchain app_subst'_hbase_compose.
Subgoal 1.3:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 app_subst ML (hbase M4) (hbase M''2)

Subgoal 1.4 is:
 app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)

Subgoal 1.5 is:
 {hcombine3 (hbase M'1) (hbase M'') (hbase M''2) (x\y\z\R'2 y x z)
    (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < backchain app_subst'_hbase_compose.
Subgoal 1.4:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)

Subgoal 1.5 is:
 {hcombine3 (hbase M'1) (hbase M'') (hbase M''2) (x\y\z\R'2 y x z)
    (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 1.5:

Variables: ML R M4 M5 M6 M'1 M'' R'2 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (hbase (R M6 M5 M4)) (hbase (R'2 M'' M'1 M''2))
H3 : app_subst ML (R M6 M5 M4) (R'2 M'' M'1 M''2)
H4 : app_subst ML (R n1 M5 M4) (R'2 M'' n1 M''2)
H5 : app_subst ML M6 M'1
H6 : app_subst ML (R n1 n2 M4) (R'2 n2 n1 M''2)
H7 : app_subst ML M5 M''
H8 : app_subst ML (R n1 n2 n3) (R'2 n2 n1 n3)
H9 : app_subst ML M4 M''2
============================
 {hcombine3 (hbase M'1) (hbase M'') (hbase M''2) (x\y\z\R'2 y x z)
    (hbase (R'2 M'' M'1 M''2))}

Subgoal 2 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 2:

Variables: ML M2 M3 P R R' R1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') P
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst'_habs_comm to H1.
Subgoal 2:

Variables: ML M2 M3 R R' R1 R'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply IH to H4 H3.
Subgoal 2:

Variables: ML M2 M3 R R' R1 R'1 M1' M2' M3' R'2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 (M2' n1)
H7 : app_subst ML M3 (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (R'2 n1 n2 n3 n4)
H9 : {hcombine3 (M1' n1) (M2' n1) (M3' n1) (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst_prune to H6.
Subgoal 2:

Variables: ML M2 M3 R R' R1 R'1 M1' M3' R'2 M''
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (R'2 n1 n2 n3 n4)
H9 : {hcombine3 (M1' n1) M'' (M3' n1) (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst_prune to H7.
Subgoal 2:

Variables: ML M2 M3 R R' R1 R'1 M1' R'2 M'' M''1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (R'2 n1 n2 n3 n4)
H9 : {hcombine3 (M1' n1) M'' M''1 (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst_prune to H8.
Subgoal 2:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (habs R1) M1' /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists habs M1'.
Subgoal 2:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 exists M2' M3' R', nabla x y z, app_subst ML (habs R1) (habs M1') /\
   app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\
   {hcombine3 (habs M1') M2' M3' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists M''.
Subgoal 2:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 exists M3' R', nabla x y z, app_subst ML (habs R1) (habs M1') /\
   app_subst ML M2 M'' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\
   {hcombine3 (habs M1') M'' M3' R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists M''1.
Subgoal 2:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 exists R', nabla x y z, app_subst ML (habs R1) (habs M1') /\
   app_subst ML M2 M'' /\ app_subst ML M3 M''1 /\
   app_subst ML (R x y z) (R' x y z) /\
   {hcombine3 (habs M1') M'' M''1 R' (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists x\y\z\M''2 z y x.
Subgoal 2:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 nabla x y z, app_subst ML (habs R1) (habs M1') /\ app_subst ML M2 M'' /\
   app_subst ML M3 M''1 /\ app_subst ML (R x y z) (M''2 z y x) /\
   {hcombine3 (habs M1') M'' M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < intros.
Subgoal 2:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 app_subst ML (habs R1) (habs M1') /\ app_subst ML M2 M'' /\
   app_subst ML M3 M''1 /\ app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1) /\
   {hcombine3 (habs M1') M'' M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < split.
Subgoal 2.1:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 app_subst ML (habs R1) (habs M1')

Subgoal 2.2 is:
 app_subst ML M2 M''

Subgoal 2.3 is:
 app_subst ML M3 M''1

Subgoal 2.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 2.5 is:
 {hcombine3 (habs M1') M'' M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst'_habs_compose to H5.
Subgoal 2.1:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML (habs (z2\R1 z2)) (habs (z2\M1' z2))
============================
 app_subst ML (habs R1) (habs M1')

Subgoal 2.2 is:
 app_subst ML M2 M''

Subgoal 2.3 is:
 app_subst ML M3 M''1

Subgoal 2.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 2.5 is:
 {hcombine3 (habs M1') M'' M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 2.2:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 app_subst ML M2 M''

Subgoal 2.3 is:
 app_subst ML M3 M''1

Subgoal 2.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 2.5 is:
 {hcombine3 (habs M1') M'' M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 2.3:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 app_subst ML M3 M''1

Subgoal 2.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 2.5 is:
 {hcombine3 (habs M1') M'' M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 2.4:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 2.5 is:
 {hcombine3 (habs M1') M'' M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 2.5:

Variables: ML M2 M3 R R' R1 R'1 M1' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (R1 n1) M2 M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R1 n1) (M1' n1)
H6 : app_subst ML M2 M''
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (M1' n1) M'' M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 {hcombine3 (habs M1') M'' M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 3 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 3:

Variables: ML M3 P R R' R1 M5
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') P
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst'_habs_comm to H1.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply IH to H4 H3.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1 M1' M2' M3' R'2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (M1' n1)
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (R'2 n1 n2 n3 n4)
H9 : {hcombine3 (M1' n1) (M2' n1) (M3' n1) (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst_prune to H5.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1 M2' M3' R'2 M''
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) M''
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (R'2 n1 n2 n3 n4)
H9 : {hcombine3 M'' (M2' n1) (M3' n1) (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst_prune to H7.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1 M2' R'2 M'' M''1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) M''
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (R'2 n1 n2 n3 n4)
H9 : {hcombine3 M'' (M2' n1) M''1 (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst_prune to H8.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1 M2' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) M''
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 M'' (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst'_hbase_comm to H5.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists hbase M'.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 exists M2' M3' R', nabla x y z, app_subst ML (hbase M5) (hbase M') /\
   app_subst ML (habs R1) M2' /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\
   {hcombine3 (hbase M') M2' M3' R' (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists habs M2'.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 exists M3' R', nabla x y z, app_subst ML (hbase M5) (hbase M') /\
   app_subst ML (habs R1) (habs M2') /\ app_subst ML M3 M3' /\
   app_subst ML (R x y z) (R' x y z) /\
   {hcombine3 (hbase M') (habs M2') M3' R' (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists M''1.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 exists R', nabla x y z, app_subst ML (hbase M5) (hbase M') /\
   app_subst ML (habs R1) (habs M2') /\ app_subst ML M3 M''1 /\
   app_subst ML (R x y z) (R' x y z) /\
   {hcombine3 (hbase M') (habs M2') M''1 R' (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < exists x\y\z\M''2 z y x.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 nabla x y z, app_subst ML (hbase M5) (hbase M') /\
   app_subst ML (habs R1) (habs M2') /\ app_subst ML M3 M''1 /\
   app_subst ML (R x y z) (M''2 z y x) /\
   {hcombine3 (hbase M') (habs M2') M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < intros.
Subgoal 3:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 app_subst ML (hbase M5) (hbase M') /\ app_subst ML (habs R1) (habs M2') /\
   app_subst ML M3 M''1 /\ app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1) /\
   {hcombine3 (hbase M') (habs M2') M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < split.
Subgoal 3.1:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 app_subst ML (hbase M5) (hbase M')

Subgoal 3.2 is:
 app_subst ML (habs R1) (habs M2')

Subgoal 3.3 is:
 app_subst ML M3 M''1

Subgoal 3.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 3.5 is:
 {hcombine3 (hbase M') (habs M2') M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 3.2:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 app_subst ML (habs R1) (habs M2')

Subgoal 3.3 is:
 app_subst ML M3 M''1

Subgoal 3.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 3.5 is:
 {hcombine3 (hbase M') (habs M2') M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst'_habs_compose to H6.
Subgoal 3.2:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML (habs (z2\R1 z2)) (habs (z2\M2' z2))
============================
 app_subst ML (habs R1) (habs M2')

Subgoal 3.3 is:
 app_subst ML M3 M''1

Subgoal 3.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 3.5 is:
 {hcombine3 (hbase M') (habs M2') M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 3.3:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 app_subst ML M3 M''1

Subgoal 3.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 3.5 is:
 {hcombine3 (hbase M') (habs M2') M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 3.4:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 3.5 is:
 {hcombine3 (hbase M') (habs M2') M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 3.5:

Variables: ML M3 R R' R1 M5 R'1 M2' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (R1 n1) M3 R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (R1 n1) (M2' n1)
H7 : app_subst ML M3 M''1
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (M2' n1) M''1 (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 {hcombine3 (hbase M') (habs M2') M''1 (x\y\z\M''2 z y x) (habs R'1)}

Subgoal 4 is:
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < search.
Subgoal 4:

Variables: ML P R R' R1 M4 M5
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') P
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' P}

subst'_hcombine3_permute_aux < apply app_subst'_habs_comm to H1.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

subst'_hcombine3_permute_aux < apply IH to H4 H3.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M1' M2' M3' R'2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (M1' n1)
H6 : app_subst ML (hbase M4) (M2' n1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (R'2 n1 n2 n3 n4)
H9 : {hcombine3 (M1' n1) (M2' n1) (M3' n1) (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

subst'_hcombine3_permute_aux < apply app_subst_prune to H5.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M2' M3' R'2 M''
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) M''
H6 : app_subst ML (hbase M4) (M2' n1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (R'2 n1 n2 n3 n4)
H9 : {hcombine3 M'' (M2' n1) (M3' n1) (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

subst'_hcombine3_permute_aux < apply app_subst_prune to H6.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M3' R'2 M'' M''1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) M''
H6 : app_subst ML (hbase M4) M''1
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (R'2 n1 n2 n3 n4)
H9 : {hcombine3 M'' M''1 (M3' n1) (R'2 n1) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

subst'_hcombine3_permute_aux < apply app_subst_prune to H8.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M3' M'' M''1 M''2
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) M''
H6 : app_subst ML (hbase M4) M''1
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 M'' M''1 (M3' n1) (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

subst'_hcombine3_permute_aux < apply app_subst'_hbase_comm to H5.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M3' M''1 M''2 M'
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) M''1
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') M''1 (M3' n1) (z2\z3\z4\M''2 z4 z3 z2) (R'1 n1)}
H10 : app_subst ML M5 M'
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

subst'_hcombine3_permute_aux < apply app_subst'_hbase_comm to H6.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 exists M1' M2' M3' R', nabla x y z, app_subst ML (hbase M5) M1' /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\ {hcombine3 M1' M2' M3' R' (habs R'1)}

subst'_hcombine3_permute_aux < exists hbase M'.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 exists M2' M3' R', nabla x y z, app_subst ML (hbase M5) (hbase M') /\
   app_subst ML (hbase M4) M2' /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\
   {hcombine3 (hbase M') M2' M3' R' (habs R'1)}

subst'_hcombine3_permute_aux < exists hbase M'1.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 exists M3' R', nabla x y z, app_subst ML (hbase M5) (hbase M') /\
   app_subst ML (hbase M4) (hbase M'1) /\ app_subst ML (habs R1) M3' /\
   app_subst ML (R x y z) (R' x y z) /\
   {hcombine3 (hbase M') (hbase M'1) M3' R' (habs R'1)}

subst'_hcombine3_permute_aux < exists habs M3'.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 exists R', nabla x y z, app_subst ML (hbase M5) (hbase M') /\
   app_subst ML (hbase M4) (hbase M'1) /\
   app_subst ML (habs R1) (habs M3') /\ app_subst ML (R x y z) (R' x y z) /\
   {hcombine3 (hbase M') (hbase M'1) (habs M3') R' (habs R'1)}

subst'_hcombine3_permute_aux < exists x\y\z\M''2 z y x.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 nabla x y z, app_subst ML (hbase M5) (hbase M') /\
   app_subst ML (hbase M4) (hbase M'1) /\
   app_subst ML (habs R1) (habs M3') /\
   app_subst ML (R x y z) (M''2 z y x) /\
   {hcombine3 (hbase M') (hbase M'1) (habs M3') (x\y\z\M''2 z y x) (habs R'1)}

subst'_hcombine3_permute_aux < intros.
Subgoal 4:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 app_subst ML (hbase M5) (hbase M') /\ app_subst ML (hbase M4) (hbase M'1) /\
   app_subst ML (habs R1) (habs M3') /\
   app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1) /\
   {hcombine3 (hbase M') (hbase M'1) (habs M3') (x\y\z\M''2 z y x) (habs R'1)}

subst'_hcombine3_permute_aux < split.
Subgoal 4.1:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 app_subst ML (hbase M5) (hbase M')

Subgoal 4.2 is:
 app_subst ML (hbase M4) (hbase M'1)

Subgoal 4.3 is:
 app_subst ML (habs R1) (habs M3')

Subgoal 4.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 4.5 is:
 {hcombine3 (hbase M') (hbase M'1) (habs M3') (x\y\z\M''2 z y x) (habs R'1)}

subst'_hcombine3_permute_aux < backchain app_subst'_hbase_compose.
Subgoal 4.2:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 app_subst ML (hbase M4) (hbase M'1)

Subgoal 4.3 is:
 app_subst ML (habs R1) (habs M3')

Subgoal 4.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 4.5 is:
 {hcombine3 (hbase M') (hbase M'1) (habs M3') (x\y\z\M''2 z y x) (habs R'1)}

subst'_hcombine3_permute_aux < backchain app_subst'_hbase_compose.
Subgoal 4.3:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 app_subst ML (habs R1) (habs M3')

Subgoal 4.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 4.5 is:
 {hcombine3 (hbase M') (hbase M'1) (habs M3') (x\y\z\M''2 z y x) (habs R'1)}

subst'_hcombine3_permute_aux < apply app_subst'_habs_compose to H7.
Subgoal 4.3:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
H12 : app_subst ML (habs (z2\R1 z2)) (habs (z2\M3' z2))
============================
 app_subst ML (habs R1) (habs M3')

Subgoal 4.4 is:
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 4.5 is:
 {hcombine3 (hbase M') (hbase M'1) (habs M3') (x\y\z\M''2 z y x) (habs R'1)}

subst'_hcombine3_permute_aux < search.
Subgoal 4.4:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 app_subst ML (R n1 n2 n3) (M''2 n3 n2 n1)

Subgoal 4.5 is:
 {hcombine3 (hbase M') (hbase M'1) (habs M3') (x\y\z\M''2 z y x) (habs R'1)}

subst'_hcombine3_permute_aux < search.
Subgoal 4.5:

Variables: ML R R' R1 M4 M5 R'1 M3' M''2 M' M'1
IH : forall ML M M1 M2 M3 P R, app_subst ML M P ->
       {hcombine3 M1 M2 M3 R M}* ->
       (exists M1' M2' M3' R', nabla x y z, app_subst ML M1 M1' /\
            app_subst ML M2 M2' /\ app_subst ML M3 M3' /\
            app_subst ML (R x y z) (R' x y z) /\
            {hcombine3 M1' M2' M3' R' P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine3 (hbase M5) (hbase M4) (R1 n1) R (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M5) (hbase M')
H6 : app_subst ML (hbase M4) (hbase M'1)
H7 : app_subst ML (R1 n1) (M3' n1)
H8 : app_subst ML (R n2 n3 n4) (M''2 n4 n3 n2)
H9 : {hcombine3 (hbase M') (hbase M'1) (M3' n1) (z2\z3\z4\M''2 z4 z3 z2)
        (R'1 n1)}
H10 : app_subst ML M5 M'
H11 : app_subst ML M4 M'1
============================
 {hcombine3 (hbase M') (hbase M'1) (habs M3') (x\y\z\M''2 z y x) (habs R'1)}

subst'_hcombine3_permute_aux < search.
Proof completed.
Abella < Theorem subst'_hcombine3_permute : 
forall ML M M1 M2 M3 R P, nabla x y z, {tm' x, tm' y, tm' z |- tm' (R x y z)} ->
  app_subst ML M P -> {hcombine3 M1 M2 M3 R M} ->
  (exists M1' M2' M3', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
       app_subst ML M3 M3' /\ {hcombine3 M1' M2' M3' R P}).


============================
 forall ML M M1 M2 M3 R P, nabla x y z, {tm' x, tm' y, tm' z |-
                                           tm' (R x y z)} ->
   app_subst ML M P -> {hcombine3 M1 M2 M3 R M} ->
   (exists M1' M2' M3', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
        app_subst ML M3 M3' /\ {hcombine3 M1' M2' M3' R P})

subst'_hcombine3_permute < intros.

Variables: ML M M1 M2 M3 R P
H1 : {tm' n1, tm' n2, tm' n3 |- tm' (R n1 n2 n3)}
H2 : app_subst ML M P
H3 : {hcombine3 M1 M2 M3 R M}
============================
 exists M1' M2' M3', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   app_subst ML M3 M3' /\ {hcombine3 M1' M2' M3' R P}

subst'_hcombine3_permute < apply subst'_hcombine3_permute_aux to H2 H3.

Variables: ML M M1 M2 M3 R P M1' M2' M3' R'
H1 : {tm' n1, tm' n2, tm' n3 |- tm' (R n1 n2 n3)}
H2 : app_subst ML M P
H3 : {hcombine3 M1 M2 M3 R M}
H4 : app_subst ML M1 M1'
H5 : app_subst ML M2 M2'
H6 : app_subst ML M3 M3'
H7 : app_subst ML (R n1 n2 n3) (R' n1 n2 n3)
H8 : {hcombine3 M1' M2' M3' R' P}
============================
 exists M1' M2' M3', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   app_subst ML M3 M3' /\ {hcombine3 M1' M2' M3' R P}

subst'_hcombine3_permute < apply app_subst'_abs_compose to H7.

Variables: ML M M1 M2 M3 R P M1' M2' M3' R'
H1 : {tm' n1, tm' n2, tm' n3 |- tm' (R n1 n2 n3)}
H2 : app_subst ML M P
H3 : {hcombine3 M1 M2 M3 R M}
H4 : app_subst ML M1 M1'
H5 : app_subst ML M2 M2'
H6 : app_subst ML M3 M3'
H7 : app_subst ML (R n1 n2 n3) (R' n1 n2 n3)
H8 : {hcombine3 M1' M2' M3' R' P}
H9 : app_subst ML (abs' (z4\R z4 n2 n3)) (abs' (z4\R' z4 n2 n3))
============================
 exists M1' M2' M3', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   app_subst ML M3 M3' /\ {hcombine3 M1' M2' M3' R P}

subst'_hcombine3_permute < apply app_subst'_abs_compose to H9.

Variables: ML M M1 M2 M3 R P M1' M2' M3' R'
H1 : {tm' n1, tm' n2, tm' n3 |- tm' (R n1 n2 n3)}
H2 : app_subst ML M P
H3 : {hcombine3 M1 M2 M3 R M}
H4 : app_subst ML M1 M1'
H5 : app_subst ML M2 M2'
H6 : app_subst ML M3 M3'
H7 : app_subst ML (R n1 n2 n3) (R' n1 n2 n3)
H8 : {hcombine3 M1' M2' M3' R' P}
H9 : app_subst ML (abs' (z4\R z4 n2 n3)) (abs' (z4\R' z4 n2 n3))
H10 : app_subst ML (abs' (z3\abs' (z4\R z4 z3 n3)))
        (abs' (z3\abs' (z4\R' z4 z3 n3)))
============================
 exists M1' M2' M3', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   app_subst ML M3 M3' /\ {hcombine3 M1' M2' M3' R P}

subst'_hcombine3_permute < apply app_subst'_abs_compose to H10.

Variables: ML M M1 M2 M3 R P M1' M2' M3' R'
H1 : {tm' n1, tm' n2, tm' n3 |- tm' (R n1 n2 n3)}
H2 : app_subst ML M P
H3 : {hcombine3 M1 M2 M3 R M}
H4 : app_subst ML M1 M1'
H5 : app_subst ML M2 M2'
H6 : app_subst ML M3 M3'
H7 : app_subst ML (R n1 n2 n3) (R' n1 n2 n3)
H8 : {hcombine3 M1' M2' M3' R' P}
H9 : app_subst ML (abs' (z4\R z4 n2 n3)) (abs' (z4\R' z4 n2 n3))
H10 : app_subst ML (abs' (z3\abs' (z4\R z4 z3 n3)))
        (abs' (z3\abs' (z4\R' z4 z3 n3)))
H11 : app_subst ML (abs' (z2\abs' (z3\abs' (z4\R z4 z3 z2))))
        (abs' (z2\abs' (z3\abs' (z4\R' z4 z3 z2))))
============================
 exists M1' M2' M3', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   app_subst ML M3 M3' /\ {hcombine3 M1' M2' M3' R P}

subst'_hcombine3_permute < apply subst'_closed_tm_eq to _ H11.

Variables: ML M M1 M2 M3 P M1' M2' M3' R'
H1 : {tm' n1, tm' n2, tm' n3 |- tm' (R' n1 n2 n3)}
H2 : app_subst ML M P
H3 : {hcombine3 M1 M2 M3 (z1\z2\z3\R' z1 z2 z3) M}
H4 : app_subst ML M1 M1'
H5 : app_subst ML M2 M2'
H6 : app_subst ML M3 M3'
H7 : app_subst ML (R' n1 n2 n3) (R' n1 n2 n3)
H8 : {hcombine3 M1' M2' M3' R' P}
H9 : app_subst ML (abs' (z4\R' z4 n2 n3)) (abs' (z4\R' z4 n2 n3))
H10 : app_subst ML (abs' (z3\abs' (z4\R' z4 z3 n3)))
        (abs' (z3\abs' (z4\R' z4 z3 n3)))
H11 : app_subst ML (abs' (z2\abs' (z3\abs' (z4\R' z4 z3 z2))))
        (abs' (z2\abs' (z3\abs' (z4\R' z4 z3 z2))))
============================
 exists M1' M2' M3', app_subst ML M1 M1' /\ app_subst ML M2 M2' /\
   app_subst ML M3 M3' /\ {hcombine3 M1' M2' M3' (z1\z2\z3\R' z1 z2 z3) P}

subst'_hcombine3_permute < search.
Proof completed.
Abella < Theorem subst'_hcombine_abs_let_permute : 
forall ML M M1 M2 P, app_subst ML M P ->
  {hcombine_abs M1 M2 (x\y\let' x y) M} ->
  (exists M1' M2', app_subst ML M1 M1' /\
       (nabla x, app_subst ML (M2 x) (M2' x)) /\
       {hcombine_abs M1' M2' (x\y\let' x y) P}).


============================
 forall ML M M1 M2 P, app_subst ML M P ->
   {hcombine_abs M1 M2 (x\y\let' x y) M} ->
   (exists M1' M2', app_subst ML M1 M1' /\
        (nabla x, app_subst ML (M2 x) (M2' x)) /\
        {hcombine_abs M1' M2' (x\y\let' x y) P})

subst'_hcombine_abs_let_permute < induction on 2.

IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
============================
 forall ML M M1 M2 P, app_subst ML M P ->
   {hcombine_abs M1 M2 (x\y\let' x y) M}@ ->
   (exists M1' M2', app_subst ML M1 M1' /\
        (nabla x, app_subst ML (M2 x) (M2' x)) /\
        {hcombine_abs M1' M2' (x\y\let' x y) P})

subst'_hcombine_abs_let_permute < intros.

Variables: ML M M1 M2 P
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML M P
H2 : {hcombine_abs M1 M2 (x\y\let' x y) M}@
============================
 exists M1' M2', app_subst ML M1 M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < case H2.
Subgoal 1:

Variables: ML P M3 M4
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (hbase (let' M4 M3)) P
============================
 exists M1' M2', app_subst ML (hbase M4) M1' /\
   (nabla x, app_subst ML (hbase (M3 x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 2 is:
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < apply app_subst'_hbase_comm to H1.
Subgoal 1:

Variables: ML M3 M4 M'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (hbase (let' M4 M3)) (hbase M')
H3 : app_subst ML (let' M4 M3) M'
============================
 exists M1' M2', app_subst ML (hbase M4) M1' /\
   (nabla x, app_subst ML (hbase (M3 x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) (hbase M')}

Subgoal 2 is:
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < apply app_subst'_let_comm to H3.
Subgoal 1:

Variables: ML M3 M4 M5 R1
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (hbase (let' M4 M3)) (hbase (let' M5 R1))
H3 : app_subst ML (let' M4 M3) (let' M5 R1)
H4 : app_subst ML M4 M5
H5 : app_subst ML (M3 n1) (R1 n1)
============================
 exists M1' M2', app_subst ML (hbase M4) M1' /\
   (nabla x, app_subst ML (hbase (M3 x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) (hbase (let' M5 R1))}

Subgoal 2 is:
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < exists hbase M5.
Subgoal 1:

Variables: ML M3 M4 M5 R1
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (hbase (let' M4 M3)) (hbase (let' M5 R1))
H3 : app_subst ML (let' M4 M3) (let' M5 R1)
H4 : app_subst ML M4 M5
H5 : app_subst ML (M3 n1) (R1 n1)
============================
 exists M2', app_subst ML (hbase M4) (hbase M5) /\
   (nabla x, app_subst ML (hbase (M3 x)) (M2' x)) /\
   {hcombine_abs (hbase M5) M2' (x\y\let' x y) (hbase (let' M5 R1))}

Subgoal 2 is:
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < exists x\hbase (R1 x).
Subgoal 1:

Variables: ML M3 M4 M5 R1
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (hbase (let' M4 M3)) (hbase (let' M5 R1))
H3 : app_subst ML (let' M4 M3) (let' M5 R1)
H4 : app_subst ML M4 M5
H5 : app_subst ML (M3 n1) (R1 n1)
============================
 app_subst ML (hbase M4) (hbase M5) /\
   (nabla x, app_subst ML (hbase (M3 x)) (hbase (R1 x))) /\
   {hcombine_abs (hbase M5) (x\hbase (R1 x)) (x\y\let' x y)
      (hbase (let' M5 R1))}

Subgoal 2 is:
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < split.
Subgoal 1.1:

Variables: ML M3 M4 M5 R1
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (hbase (let' M4 M3)) (hbase (let' M5 R1))
H3 : app_subst ML (let' M4 M3) (let' M5 R1)
H4 : app_subst ML M4 M5
H5 : app_subst ML (M3 n1) (R1 n1)
============================
 app_subst ML (hbase M4) (hbase M5)

Subgoal 1.2 is:
 nabla x, app_subst ML (hbase (M3 x)) (hbase (R1 x))

Subgoal 1.3 is:
 {hcombine_abs (hbase M5) (x\hbase (R1 x)) (x\y\let' x y)
    (hbase (let' M5 R1))}

Subgoal 2 is:
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < backchain app_subst'_hbase_compose.
Subgoal 1.2:

Variables: ML M3 M4 M5 R1
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (hbase (let' M4 M3)) (hbase (let' M5 R1))
H3 : app_subst ML (let' M4 M3) (let' M5 R1)
H4 : app_subst ML M4 M5
H5 : app_subst ML (M3 n1) (R1 n1)
============================
 nabla x, app_subst ML (hbase (M3 x)) (hbase (R1 x))

Subgoal 1.3 is:
 {hcombine_abs (hbase M5) (x\hbase (R1 x)) (x\y\let' x y)
    (hbase (let' M5 R1))}

Subgoal 2 is:
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < intros.
Subgoal 1.2:

Variables: ML M3 M4 M5 R1
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (hbase (let' M4 M3)) (hbase (let' M5 R1))
H3 : app_subst ML (let' M4 M3) (let' M5 R1)
H4 : app_subst ML M4 M5
H5 : app_subst ML (M3 n1) (R1 n1)
============================
 app_subst ML (hbase (M3 n1)) (hbase (R1 n1))

Subgoal 1.3 is:
 {hcombine_abs (hbase M5) (x\hbase (R1 x)) (x\y\let' x y)
    (hbase (let' M5 R1))}

Subgoal 2 is:
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < backchain app_subst'_hbase_compose.
Subgoal 1.3:

Variables: ML M3 M4 M5 R1
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (hbase (let' M4 M3)) (hbase (let' M5 R1))
H3 : app_subst ML (let' M4 M3) (let' M5 R1)
H4 : app_subst ML M4 M5
H5 : app_subst ML (M3 n1) (R1 n1)
============================
 {hcombine_abs (hbase M5) (x\hbase (R1 x)) (x\y\let' x y)
    (hbase (let' M5 R1))}

Subgoal 2 is:
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < search.
Subgoal 2:

Variables: ML M2 P R' R
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') P
H3 : {hcombine_abs (R n1) M2 (x\y\let' x y) (R' n1)}*
============================
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < apply app_subst'_habs_comm to H1.
Subgoal 2:

Variables: ML M2 R' R R'1
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (R n1) M2 (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
============================
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) (habs R'1)}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < apply IH to H4 H3.
Subgoal 2:

Variables: ML M2 R' R R'1 M1' M2'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (R n1) M2 (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R n1) (M1' n1)
H6 : app_subst ML (M2 n2) (M2' n1 n2)
H7 : {hcombine_abs (M1' n1) (M2' n1) (x\y\let' x y) (R'1 n1)}
============================
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) (habs R'1)}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < apply app_subst_prune to H6.
Subgoal 2:

Variables: ML M2 R' R R'1 M1' M''
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (R n1) M2 (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R n1) (M1' n1)
H6 : app_subst ML (M2 n2) (M'' n2)
H7 : {hcombine_abs (M1' n1) (z2\M'' z2) (x\y\let' x y) (R'1 n1)}
============================
 exists M1' M2', app_subst ML (habs R) M1' /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) (habs R'1)}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < exists habs M1'.
Subgoal 2:

Variables: ML M2 R' R R'1 M1' M''
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (R n1) M2 (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R n1) (M1' n1)
H6 : app_subst ML (M2 n2) (M'' n2)
H7 : {hcombine_abs (M1' n1) (z2\M'' z2) (x\y\let' x y) (R'1 n1)}
============================
 exists M2', app_subst ML (habs R) (habs M1') /\
   (nabla x, app_subst ML (M2 x) (M2' x)) /\
   {hcombine_abs (habs M1') M2' (x\y\let' x y) (habs R'1)}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < exists M''.
Subgoal 2:

Variables: ML M2 R' R R'1 M1' M''
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (R n1) M2 (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R n1) (M1' n1)
H6 : app_subst ML (M2 n2) (M'' n2)
H7 : {hcombine_abs (M1' n1) (z2\M'' z2) (x\y\let' x y) (R'1 n1)}
============================
 app_subst ML (habs R) (habs M1') /\
   (nabla x, app_subst ML (M2 x) (M'' x)) /\
   {hcombine_abs (habs M1') M'' (x\y\let' x y) (habs R'1)}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < split.
Subgoal 2.1:

Variables: ML M2 R' R R'1 M1' M''
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (R n1) M2 (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R n1) (M1' n1)
H6 : app_subst ML (M2 n2) (M'' n2)
H7 : {hcombine_abs (M1' n1) (z2\M'' z2) (x\y\let' x y) (R'1 n1)}
============================
 app_subst ML (habs R) (habs M1')

Subgoal 2.2 is:
 nabla x, app_subst ML (M2 x) (M'' x)

Subgoal 2.3 is:
 {hcombine_abs (habs M1') M'' (x\y\let' x y) (habs R'1)}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < apply app_subst'_habs_compose to H5.
Subgoal 2.1:

Variables: ML M2 R' R R'1 M1' M''
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (R n1) M2 (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R n1) (M1' n1)
H6 : app_subst ML (M2 n2) (M'' n2)
H7 : {hcombine_abs (M1' n1) (z2\M'' z2) (x\y\let' x y) (R'1 n1)}
H8 : app_subst ML (habs (z2\R z2)) (habs (z2\M1' z2))
============================
 app_subst ML (habs R) (habs M1')

Subgoal 2.2 is:
 nabla x, app_subst ML (M2 x) (M'' x)

Subgoal 2.3 is:
 {hcombine_abs (habs M1') M'' (x\y\let' x y) (habs R'1)}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < search.
Subgoal 2.2:

Variables: ML M2 R' R R'1 M1' M''
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (R n1) M2 (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R n1) (M1' n1)
H6 : app_subst ML (M2 n2) (M'' n2)
H7 : {hcombine_abs (M1' n1) (z2\M'' z2) (x\y\let' x y) (R'1 n1)}
============================
 nabla x, app_subst ML (M2 x) (M'' x)

Subgoal 2.3 is:
 {hcombine_abs (habs M1') M'' (x\y\let' x y) (habs R'1)}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < search.
Subgoal 2.3:

Variables: ML M2 R' R R'1 M1' M''
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (R n1) M2 (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (R n1) (M1' n1)
H6 : app_subst ML (M2 n2) (M'' n2)
H7 : {hcombine_abs (M1' n1) (z2\M'' z2) (x\y\let' x y) (R'1 n1)}
============================
 {hcombine_abs (habs M1') M'' (x\y\let' x y) (habs R'1)}

Subgoal 3 is:
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < search.
Subgoal 3:

Variables: ML P R' R M3
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') P
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
============================
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) P}

subst'_hcombine_abs_let_permute < apply app_subst'_habs_comm to H1.
Subgoal 3:

Variables: ML R' R M3 R'1
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
============================
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < apply IH to H4 H3.
Subgoal 3:

Variables: ML R' R M3 R'1 M1' M2'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (M1' n1)
H6 : app_subst ML (R n2 n1) (M2' n1 n2)
H7 : {hcombine_abs (M1' n1) (M2' n1) (x\y\let' x y) (R'1 n1)}
============================
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < apply app_subst_prune to H5.
Subgoal 3:

Variables: ML R' R M3 R'1 M2' M''
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) M''
H6 : app_subst ML (R n2 n1) (M2' n1 n2)
H7 : {hcombine_abs M'' (M2' n1) (x\y\let' x y) (R'1 n1)}
============================
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < apply app_subst'_hbase_comm to H5.
Subgoal 3:

Variables: ML R' R M3 R'1 M2' M'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R n2 n1) (M2' n1 n2)
H7 : {hcombine_abs (hbase M') (M2' n1) (x\y\let' x y) (R'1 n1)}
H8 : app_subst ML M3 M'
============================
 exists M1' M2', app_subst ML (hbase M3) M1' /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs M1' M2' (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < exists hbase M'.
Subgoal 3:

Variables: ML R' R M3 R'1 M2' M'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R n2 n1) (M2' n1 n2)
H7 : {hcombine_abs (hbase M') (M2' n1) (x\y\let' x y) (R'1 n1)}
H8 : app_subst ML M3 M'
============================
 exists M2', app_subst ML (hbase M3) (hbase M') /\
   (nabla x, app_subst ML (habs (R x)) (M2' x)) /\
   {hcombine_abs (hbase M') M2' (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < exists x\habs (y\M2' y x).
Subgoal 3:

Variables: ML R' R M3 R'1 M2' M'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R n2 n1) (M2' n1 n2)
H7 : {hcombine_abs (hbase M') (M2' n1) (x\y\let' x y) (R'1 n1)}
H8 : app_subst ML M3 M'
============================
 app_subst ML (hbase M3) (hbase M') /\
   (nabla x, app_subst ML (habs (R x)) (habs (y\M2' y x))) /\
   {hcombine_abs (hbase M') (x\habs (y\M2' y x)) (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < split.
Subgoal 3.1:

Variables: ML R' R M3 R'1 M2' M'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R n2 n1) (M2' n1 n2)
H7 : {hcombine_abs (hbase M') (M2' n1) (x\y\let' x y) (R'1 n1)}
H8 : app_subst ML M3 M'
============================
 app_subst ML (hbase M3) (hbase M')

Subgoal 3.2 is:
 nabla x, app_subst ML (habs (R x)) (habs (y\M2' y x))

Subgoal 3.3 is:
 {hcombine_abs (hbase M') (x\habs (y\M2' y x)) (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < search.
Subgoal 3.2:

Variables: ML R' R M3 R'1 M2' M'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R n2 n1) (M2' n1 n2)
H7 : {hcombine_abs (hbase M') (M2' n1) (x\y\let' x y) (R'1 n1)}
H8 : app_subst ML M3 M'
============================
 nabla x, app_subst ML (habs (R x)) (habs (y\M2' y x))

Subgoal 3.3 is:
 {hcombine_abs (hbase M') (x\habs (y\M2' y x)) (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < intros.
Subgoal 3.2:

Variables: ML R' R M3 R'1 M2' M'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R n2 n1) (M2' n1 n2)
H7 : {hcombine_abs (hbase M') (M2' n1) (x\y\let' x y) (R'1 n1)}
H8 : app_subst ML M3 M'
============================
 app_subst ML (habs (R n1)) (habs (y\M2' y n1))

Subgoal 3.3 is:
 {hcombine_abs (hbase M') (x\habs (y\M2' y x)) (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < apply app_subst'_habs_compose to H6.
Subgoal 3.2:

Variables: ML R' R M3 R'1 M2' M'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R n2 n1) (M2' n1 n2)
H7 : {hcombine_abs (hbase M') (M2' n1) (x\y\let' x y) (R'1 n1)}
H8 : app_subst ML M3 M'
H9 : app_subst ML (habs (z3\R n2 z3)) (habs (z3\M2' z3 n2))
============================
 app_subst ML (habs (R n1)) (habs (y\M2' y n1))

Subgoal 3.3 is:
 {hcombine_abs (hbase M') (x\habs (y\M2' y x)) (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < search.
Subgoal 3.3:

Variables: ML R' R M3 R'1 M2' M'
IH : forall ML M M1 M2 P, app_subst ML M P ->
       {hcombine_abs M1 M2 (x\y\let' x y) M}* ->
       (exists M1' M2', app_subst ML M1 M1' /\
            (nabla x, app_subst ML (M2 x) (M2' x)) /\
            {hcombine_abs M1' M2' (x\y\let' x y) P})
H1 : app_subst ML (habs R') (habs R'1)
H3 : {hcombine_abs (hbase M3) (x\R x n1) (x\y\let' x y) (R' n1)}*
H4 : app_subst ML (R' n1) (R'1 n1)
H5 : app_subst ML (hbase M3) (hbase M')
H6 : app_subst ML (R n2 n1) (M2' n1 n2)
H7 : {hcombine_abs (hbase M') (M2' n1) (x\y\let' x y) (R'1 n1)}
H8 : app_subst ML M3 M'
============================
 {hcombine_abs (hbase M') (x\habs (y\M2' y x)) (x\y\let' x y) (habs R'1)}

subst'_hcombine_abs_let_permute < search.
Proof completed.
Abella < Theorem tm'_list_to_tuple_permute1 : 
forall ML FE FE' E', is_list FE -> subst' ML -> app_subst_list ML FE FE' ->
  {tm'_list_to_tuple FE' E'} ->
  (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E').


============================
 forall ML FE FE' E', is_list FE -> subst' ML -> app_subst_list ML FE FE' ->
   {tm'_list_to_tuple FE' E'} ->
   (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')

tm'_list_to_tuple_permute1 < induction on 4.

IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
============================
 forall ML FE FE' E', is_list FE -> subst' ML -> app_subst_list ML FE FE' ->
   {tm'_list_to_tuple FE' E'}@ ->
   (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')

tm'_list_to_tuple_permute1 < intros.

Variables: ML FE FE' E'
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H1 : is_list FE
H2 : subst' ML
H3 : app_subst_list ML FE FE'
H4 : {tm'_list_to_tuple FE' E'}@
============================
 exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E'

tm'_list_to_tuple_permute1 < case H4.
Subgoal 1:

Variables: ML FE
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H1 : is_list FE
H2 : subst' ML
H3 : app_subst_list ML FE nil
============================
 exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E unit'

Subgoal 2 is:
 exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E (pair' M ML')

tm'_list_to_tuple_permute1 < apply app_subst'_list_nil2 to _ H3.
Subgoal 1:

Variables: ML
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H1 : is_list nil
H2 : subst' ML
H3 : app_subst_list ML nil nil
============================
 exists E, {tm'_list_to_tuple nil E} /\ app_subst ML E unit'

Subgoal 2 is:
 exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E (pair' M ML')

tm'_list_to_tuple_permute1 < exists unit'.
Subgoal 1:

Variables: ML
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H1 : is_list nil
H2 : subst' ML
H3 : app_subst_list ML nil nil
============================
 {tm'_list_to_tuple nil unit'} /\ app_subst ML unit' unit'

Subgoal 2 is:
 exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E (pair' M ML')

tm'_list_to_tuple_permute1 < split.
Subgoal 1.1:

Variables: ML
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H1 : is_list nil
H2 : subst' ML
H3 : app_subst_list ML nil nil
============================
 {tm'_list_to_tuple nil unit'}

Subgoal 1.2 is:
 app_subst ML unit' unit'

Subgoal 2 is:
 exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E (pair' M ML')

tm'_list_to_tuple_permute1 < search.
Subgoal 1.2:

Variables: ML
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H1 : is_list nil
H2 : subst' ML
H3 : app_subst_list ML nil nil
============================
 app_subst ML unit' unit'

Subgoal 2 is:
 exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E (pair' M ML')

tm'_list_to_tuple_permute1 < backchain subst'_closed_tm.
Subgoal 2:

Variables: ML FE ML' ML1 M
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H1 : is_list FE
H2 : subst' ML
H3 : app_subst_list ML FE (M :: ML1)
H5 : {tm'_list_to_tuple ML1 ML'}*
============================
 exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E (pair' M ML')

tm'_list_to_tuple_permute1 < apply app_subst_list_comm2 to H1 H3.
Subgoal 2:

Variables: ML ML' ML1 M X' L'
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H1 : is_list (X' :: L')
H2 : subst' ML
H3 : app_subst_list ML (X' :: L') (M :: ML1)
H5 : {tm'_list_to_tuple ML1 ML'}*
H6 : app_subst ML X' M
H7 : app_subst_list ML L' ML1
============================
 exists E, {tm'_list_to_tuple (X' :: L') E} /\ app_subst ML E (pair' M ML')

tm'_list_to_tuple_permute1 < case H1.
Subgoal 2:

Variables: ML ML' ML1 M X' L'
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H2 : subst' ML
H3 : app_subst_list ML (X' :: L') (M :: ML1)
H5 : {tm'_list_to_tuple ML1 ML'}*
H6 : app_subst ML X' M
H7 : app_subst_list ML L' ML1
H8 : is_list L'
============================
 exists E, {tm'_list_to_tuple (X' :: L') E} /\ app_subst ML E (pair' M ML')

tm'_list_to_tuple_permute1 < apply IH to _ _ H7 H5.
Subgoal 2:

Variables: ML ML' ML1 M X' L' E
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H2 : subst' ML
H3 : app_subst_list ML (X' :: L') (M :: ML1)
H5 : {tm'_list_to_tuple ML1 ML'}*
H6 : app_subst ML X' M
H7 : app_subst_list ML L' ML1
H8 : is_list L'
H9 : {tm'_list_to_tuple L' E}
H10 : app_subst ML E ML'
============================
 exists E, {tm'_list_to_tuple (X' :: L') E} /\ app_subst ML E (pair' M ML')

tm'_list_to_tuple_permute1 < exists pair' X' E.
Subgoal 2:

Variables: ML ML' ML1 M X' L' E
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H2 : subst' ML
H3 : app_subst_list ML (X' :: L') (M :: ML1)
H5 : {tm'_list_to_tuple ML1 ML'}*
H6 : app_subst ML X' M
H7 : app_subst_list ML L' ML1
H8 : is_list L'
H9 : {tm'_list_to_tuple L' E}
H10 : app_subst ML E ML'
============================
 {tm'_list_to_tuple (X' :: L') (pair' X' E)} /\
   app_subst ML (pair' X' E) (pair' M ML')

tm'_list_to_tuple_permute1 < split.
Subgoal 2.1:

Variables: ML ML' ML1 M X' L' E
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H2 : subst' ML
H3 : app_subst_list ML (X' :: L') (M :: ML1)
H5 : {tm'_list_to_tuple ML1 ML'}*
H6 : app_subst ML X' M
H7 : app_subst_list ML L' ML1
H8 : is_list L'
H9 : {tm'_list_to_tuple L' E}
H10 : app_subst ML E ML'
============================
 {tm'_list_to_tuple (X' :: L') (pair' X' E)}

Subgoal 2.2 is:
 app_subst ML (pair' X' E) (pair' M ML')

tm'_list_to_tuple_permute1 < search.
Subgoal 2.2:

Variables: ML ML' ML1 M X' L' E
IH : forall ML FE FE' E', is_list FE -> subst' ML ->
       app_subst_list ML FE FE' -> {tm'_list_to_tuple FE' E'}* ->
       (exists E, {tm'_list_to_tuple FE E} /\ app_subst ML E E')
H2 : subst' ML
H3 : app_subst_list ML (X' :: L') (M :: ML1)
H5 : {tm'_list_to_tuple ML1 ML'}*
H6 : app_subst ML X' M
H7 : app_subst_list ML L' ML1
H8 : is_list L'
H9 : {tm'_list_to_tuple L' E}
H10 : app_subst ML E ML'
============================
 app_subst ML (pair' X' E) (pair' M ML')

tm'_list_to_tuple_permute1 < backchain app_subst'_pair_compose.
Proof completed.
Abella < Theorem tm'_list_to_tuple_permute2 : 
forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E} ->
  app_subst ML E E' ->
  (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'}).


============================
 forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E} ->
   app_subst ML E E' ->
   (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})

tm'_list_to_tuple_permute2 < induction on 2.

IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
============================
 forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}@ ->
   app_subst ML E E' ->
   (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})

tm'_list_to_tuple_permute2 < intros.

Variables: ML FE E' E
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H2 : {tm'_list_to_tuple FE E}@
H3 : app_subst ML E E'
============================
 exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'}

tm'_list_to_tuple_permute2 < case H2.
Subgoal 1:

Variables: ML E'
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML unit' E'
============================
 exists FE', app_subst_list ML nil FE' /\ {tm'_list_to_tuple FE' E'}

Subgoal 2 is:
 exists FE', app_subst_list ML (M :: ML1) FE' /\ {tm'_list_to_tuple FE' E'}

tm'_list_to_tuple_permute2 < apply app_subst'_unit_comm to H3.
Subgoal 1:

Variables: ML
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML unit' unit'
============================
 exists FE', app_subst_list ML nil FE' /\ {tm'_list_to_tuple FE' unit'}

Subgoal 2 is:
 exists FE', app_subst_list ML (M :: ML1) FE' /\ {tm'_list_to_tuple FE' E'}

tm'_list_to_tuple_permute2 < exists nil.
Subgoal 1:

Variables: ML
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML unit' unit'
============================
 app_subst_list ML nil nil /\ {tm'_list_to_tuple nil unit'}

Subgoal 2 is:
 exists FE', app_subst_list ML (M :: ML1) FE' /\ {tm'_list_to_tuple FE' E'}

tm'_list_to_tuple_permute2 < split.
Subgoal 1.1:

Variables: ML
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML unit' unit'
============================
 app_subst_list ML nil nil

Subgoal 1.2 is:
 {tm'_list_to_tuple nil unit'}

Subgoal 2 is:
 exists FE', app_subst_list ML (M :: ML1) FE' /\ {tm'_list_to_tuple FE' E'}

tm'_list_to_tuple_permute2 < backchain app_subst'_list_nil1.
Subgoal 1.2:

Variables: ML
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML unit' unit'
============================
 {tm'_list_to_tuple nil unit'}

Subgoal 2 is:
 exists FE', app_subst_list ML (M :: ML1) FE' /\ {tm'_list_to_tuple FE' E'}

tm'_list_to_tuple_permute2 < search.
Subgoal 2:

Variables: ML E' ML' ML1 M
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML (pair' M ML') E'
H4 : {tm'_list_to_tuple ML1 ML'}*
============================
 exists FE', app_subst_list ML (M :: ML1) FE' /\ {tm'_list_to_tuple FE' E'}

tm'_list_to_tuple_permute2 < apply app_subst'_pair_comm to H3.
Subgoal 2:

Variables: ML ML' ML1 M M1' M2'
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML (pair' M ML') (pair' M1' M2')
H4 : {tm'_list_to_tuple ML1 ML'}*
H5 : app_subst ML M M1'
H6 : app_subst ML ML' M2'
============================
 exists FE', app_subst_list ML (M :: ML1) FE' /\
   {tm'_list_to_tuple FE' (pair' M1' M2')}

tm'_list_to_tuple_permute2 < apply IH to _ H4 H6.
Subgoal 2:

Variables: ML ML' ML1 M M1' M2' FE'
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML (pair' M ML') (pair' M1' M2')
H4 : {tm'_list_to_tuple ML1 ML'}*
H5 : app_subst ML M M1'
H6 : app_subst ML ML' M2'
H7 : app_subst_list ML ML1 FE'
H8 : {tm'_list_to_tuple FE' M2'}
============================
 exists FE', app_subst_list ML (M :: ML1) FE' /\
   {tm'_list_to_tuple FE' (pair' M1' M2')}

tm'_list_to_tuple_permute2 < exists M1' :: FE'.
Subgoal 2:

Variables: ML ML' ML1 M M1' M2' FE'
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML (pair' M ML') (pair' M1' M2')
H4 : {tm'_list_to_tuple ML1 ML'}*
H5 : app_subst ML M M1'
H6 : app_subst ML ML' M2'
H7 : app_subst_list ML ML1 FE'
H8 : {tm'_list_to_tuple FE' M2'}
============================
 app_subst_list ML (M :: ML1) (M1' :: FE') /\
   {tm'_list_to_tuple (M1' :: FE') (pair' M1' M2')}

tm'_list_to_tuple_permute2 < split.
Subgoal 2.1:

Variables: ML ML' ML1 M M1' M2' FE'
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML (pair' M ML') (pair' M1' M2')
H4 : {tm'_list_to_tuple ML1 ML'}*
H5 : app_subst ML M M1'
H6 : app_subst ML ML' M2'
H7 : app_subst_list ML ML1 FE'
H8 : {tm'_list_to_tuple FE' M2'}
============================
 app_subst_list ML (M :: ML1) (M1' :: FE')

Subgoal 2.2 is:
 {tm'_list_to_tuple (M1' :: FE') (pair' M1' M2')}

tm'_list_to_tuple_permute2 < backchain app_subst_list_compose.
Subgoal 2.2:

Variables: ML ML' ML1 M M1' M2' FE'
IH : forall ML FE E' E, subst' ML -> {tm'_list_to_tuple FE E}* ->
       app_subst ML E E' ->
       (exists FE', app_subst_list ML FE FE' /\ {tm'_list_to_tuple FE' E'})
H1 : subst' ML
H3 : app_subst ML (pair' M ML') (pair' M1' M2')
H4 : {tm'_list_to_tuple ML1 ML'}*
H5 : app_subst ML M M1'
H6 : app_subst ML ML' M2'
H7 : app_subst_list ML ML1 FE'
H8 : {tm'_list_to_tuple FE' M2'}
============================
 {tm'_list_to_tuple (M1' :: FE') (pair' M1' M2')}

tm'_list_to_tuple_permute2 < search.
Proof completed.
Abella < Theorem crev_permute : 
forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3} ->
  app_subst_list ML L3 L3' ->
  (exists L1' L2', app_subst_list ML L1 L1' /\ app_subst_list ML L2 L2' /\
       {rev L1' L2' L3'}).


============================
 forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3} ->
   app_subst_list ML L3 L3' ->
   (exists L1' L2', app_subst_list ML L1 L1' /\ app_subst_list ML L2 L2' /\
        {rev L1' L2' L3'})

crev_permute < induction on 2.

IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
============================
 forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}@ ->
   app_subst_list ML L3 L3' ->
   (exists L1' L2', app_subst_list ML L1 L1' /\ app_subst_list ML L2 L2' /\
        {rev L1' L2' L3'})

crev_permute < intros.

Variables: ML L1 L2 L3 L3'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H2 : {rev L1 L2 L3}@
H3 : app_subst_list ML L3 L3'
============================
 exists L1' L2', app_subst_list ML L1 L1' /\ app_subst_list ML L2 L2' /\
   {rev L1' L2' L3'}

crev_permute < case H2.
Subgoal 1:

Variables: ML L3 L3'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
============================
 exists L1' L2', app_subst_list ML nil L1' /\ app_subst_list ML L3 L2' /\
   {rev L1' L2' L3'}

Subgoal 2 is:
 exists L1' L2', app_subst_list ML (X :: L5) L1' /\
   app_subst_list ML L2 L2' /\ {rev L1' L2' L3'}

crev_permute < exists nil.
Subgoal 1:

Variables: ML L3 L3'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
============================
 exists L2', app_subst_list ML nil nil /\ app_subst_list ML L3 L2' /\
   {rev nil L2' L3'}

Subgoal 2 is:
 exists L1' L2', app_subst_list ML (X :: L5) L1' /\
   app_subst_list ML L2 L2' /\ {rev L1' L2' L3'}

crev_permute < exists L3'.
Subgoal 1:

Variables: ML L3 L3'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
============================
 app_subst_list ML nil nil /\ app_subst_list ML L3 L3' /\ {rev nil L3' L3'}

Subgoal 2 is:
 exists L1' L2', app_subst_list ML (X :: L5) L1' /\
   app_subst_list ML L2 L2' /\ {rev L1' L2' L3'}

crev_permute < split.
Subgoal 1.1:

Variables: ML L3 L3'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
============================
 app_subst_list ML nil nil

Subgoal 1.2 is:
 app_subst_list ML L3 L3'

Subgoal 1.3 is:
 {rev nil L3' L3'}

Subgoal 2 is:
 exists L1' L2', app_subst_list ML (X :: L5) L1' /\
   app_subst_list ML L2 L2' /\ {rev L1' L2' L3'}

crev_permute < backchain app_subst'_list_nil1.
Subgoal 1.2:

Variables: ML L3 L3'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
============================
 app_subst_list ML L3 L3'

Subgoal 1.3 is:
 {rev nil L3' L3'}

Subgoal 2 is:
 exists L1' L2', app_subst_list ML (X :: L5) L1' /\
   app_subst_list ML L2 L2' /\ {rev L1' L2' L3'}

crev_permute < search.
Subgoal 1.3:

Variables: ML L3 L3'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
============================
 {rev nil L3' L3'}

Subgoal 2 is:
 exists L1' L2', app_subst_list ML (X :: L5) L1' /\
   app_subst_list ML L2 L2' /\ {rev L1' L2' L3'}

crev_permute < search.
Subgoal 2:

Variables: ML L2 L3 L3' X L5
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
H4 : {rev L5 (X :: L2) L3}*
============================
 exists L1' L2', app_subst_list ML (X :: L5) L1' /\
   app_subst_list ML L2 L2' /\ {rev L1' L2' L3'}

crev_permute < apply IH to _ H4 H3.
Subgoal 2:

Variables: ML L2 L3 L3' X L5 L1' L2'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
H4 : {rev L5 (X :: L2) L3}*
H5 : app_subst_list ML L5 L1'
H6 : app_subst_list ML (X :: L2) L2'
H7 : {rev L1' L2' L3'}
============================
 exists L1' L2', app_subst_list ML (X :: L5) L1' /\
   app_subst_list ML L2 L2' /\ {rev L1' L2' L3'}

crev_permute < apply app_subst_list_comm1 to H6.
Subgoal 2:

Variables: ML L2 L3 L3' X L5 L1' X' L'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
H4 : {rev L5 (X :: L2) L3}*
H5 : app_subst_list ML L5 L1'
H6 : app_subst_list ML (X :: L2) (X' :: L')
H7 : {rev L1' (X' :: L') L3'}
H8 : app_subst ML X X'
H9 : app_subst_list ML L2 L'
============================
 exists L1' L2', app_subst_list ML (X :: L5) L1' /\
   app_subst_list ML L2 L2' /\ {rev L1' L2' L3'}

crev_permute < exists X' :: L1'.
Subgoal 2:

Variables: ML L2 L3 L3' X L5 L1' X' L'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
H4 : {rev L5 (X :: L2) L3}*
H5 : app_subst_list ML L5 L1'
H6 : app_subst_list ML (X :: L2) (X' :: L')
H7 : {rev L1' (X' :: L') L3'}
H8 : app_subst ML X X'
H9 : app_subst_list ML L2 L'
============================
 exists L2', app_subst_list ML (X :: L5) (X' :: L1') /\
   app_subst_list ML L2 L2' /\ {rev (X' :: L1') L2' L3'}

crev_permute < exists L'.
Subgoal 2:

Variables: ML L2 L3 L3' X L5 L1' X' L'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
H4 : {rev L5 (X :: L2) L3}*
H5 : app_subst_list ML L5 L1'
H6 : app_subst_list ML (X :: L2) (X' :: L')
H7 : {rev L1' (X' :: L') L3'}
H8 : app_subst ML X X'
H9 : app_subst_list ML L2 L'
============================
 app_subst_list ML (X :: L5) (X' :: L1') /\ app_subst_list ML L2 L' /\
   {rev (X' :: L1') L' L3'}

crev_permute < split.
Subgoal 2.1:

Variables: ML L2 L3 L3' X L5 L1' X' L'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
H4 : {rev L5 (X :: L2) L3}*
H5 : app_subst_list ML L5 L1'
H6 : app_subst_list ML (X :: L2) (X' :: L')
H7 : {rev L1' (X' :: L') L3'}
H8 : app_subst ML X X'
H9 : app_subst_list ML L2 L'
============================
 app_subst_list ML (X :: L5) (X' :: L1')

Subgoal 2.2 is:
 app_subst_list ML L2 L'

Subgoal 2.3 is:
 {rev (X' :: L1') L' L3'}

crev_permute < backchain app_subst_list_compose.
Subgoal 2.2:

Variables: ML L2 L3 L3' X L5 L1' X' L'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
H4 : {rev L5 (X :: L2) L3}*
H5 : app_subst_list ML L5 L1'
H6 : app_subst_list ML (X :: L2) (X' :: L')
H7 : {rev L1' (X' :: L') L3'}
H8 : app_subst ML X X'
H9 : app_subst_list ML L2 L'
============================
 app_subst_list ML L2 L'

Subgoal 2.3 is:
 {rev (X' :: L1') L' L3'}

crev_permute < search.
Subgoal 2.3:

Variables: ML L2 L3 L3' X L5 L1' X' L'
IH : forall ML L1 L2 L3 L3', subst' ML -> {rev L1 L2 L3}* ->
       app_subst_list ML L3 L3' ->
       (exists L1' L2', app_subst_list ML L1 L1' /\
            app_subst_list ML L2 L2' /\ {rev L1' L2' L3'})
H1 : subst' ML
H3 : app_subst_list ML L3 L3'
H4 : {rev L5 (X :: L2) L3}*
H5 : app_subst_list ML L5 L1'
H6 : app_subst_list ML (X :: L2) (X' :: L')
H7 : {rev L1' (X' :: L') L3'}
H8 : app_subst ML X X'
H9 : app_subst_list ML L2 L'
============================
 {rev (X' :: L1') L' L3'}

crev_permute < search.
Proof completed.
Abella < Theorem hoist_abs_permute : 
forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
  {hoist_abs R1 g (L l) FA (R2 g) (F l)} -> app_subst ML (R2 g) (R2' g) ->
  app_subst ML (F l x) (F' l x) ->
  (exists R1' FA' L', (nabla x, app_subst ML (R1 x) (R1' x)) /\
       app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
       (nabla l, {hoist_abs R1' g (L' l) FA' (R2' g) (F' l)})).


============================
 forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
   {hoist_abs R1 g (L l) FA (R2 g) (F l)} -> app_subst ML (R2 g) (R2' g) ->
   app_subst ML (F l x) (F' l x) ->
   (exists R1' FA' L', (nabla x, app_subst ML (R1 x) (R1' x)) /\
        app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
        (nabla l, {hoist_abs R1' g (L' l) FA' (R2' g) (F' l)}))

hoist_abs_permute < induction on 2.

IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x, app_subst ML (R1 x) (R1' x)) /\
            app_subst_list ML FA FA' /\
            (nabla l, app_subst ML (L l) (L' l)) /\
            (nabla l, {hoist_abs R1' g (L' l) FA' (R2' g) (F' l)}))
============================
 forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
   {hoist_abs R1 g (L l) FA (R2 g) (F l)}@ -> app_subst ML (R2 g) (R2' g) ->
   app_subst ML (F l x) (F' l x) ->
   (exists R1' FA' L', (nabla x, app_subst ML (R1 x) (R1' x)) /\
        app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
        (nabla l, {hoist_abs R1' g (L' l) FA' (R2' g) (F' l)}))

hoist_abs_permute < intros.

Variables: ML R1 R2 R2' FA L F F'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x, app_subst ML (R1 x) (R1' x)) /\
            app_subst_list ML FA FA' /\
            (nabla l, app_subst ML (L l) (L' l)) /\
            (nabla l, {hoist_abs R1' g (L' l) FA' (R2' g) (F' l)}))
H1 : subst' ML
H2 : {hoist_abs R1 n1 (L n3) FA (R2 n1) (F n3)}@
H3 : app_subst ML (R2 n1) (R2' n1)
H4 : app_subst ML (F n3 n2) (F' n3 n2)
============================
 exists R1' FA' L', (nabla x, app_subst ML (R1 x) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < case H2 (keep).
Subgoal 1:

Variables: ML R2' FA L F' R4 FA' R5
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 (R4 n1)))
        (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 (R4 n1))) (R2' n1)
H4 : app_subst ML (R5 n2) (F' n3 n2)
H5 : {rev FA nil (FA' n3 n1)}*
H6 : {tm'_list_to_tuple (FA' n3 n1) (R4 n1)}*
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply app_subst_prune to H4.
Subgoal 1:

Variables: ML R2' FA L R4 FA' R5 M''
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 (R4 n1)))
        (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 (R4 n1))) (R2' n1)
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil (FA' n3 n1)}*
H6 : {tm'_list_to_tuple (FA' n3 n1) (R4 n1)}*
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply rev_prune to H5.
Subgoal 1:

Variables: ML R2' FA L R4 R5 M'' L3'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 (R4 n1)))
        (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 (R4 n1))) (R2' n1)
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil (L3' n1)}*
H6 : {tm'_list_to_tuple (L3' n1) (R4 n1)}*
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply rev_prune to H5.
Subgoal 1:

Variables: ML R2' FA L R4 R5 M'' L3'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 (R4 n1)))
        (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 (R4 n1))) (R2' n1)
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 (R4 n1)}*
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply tm'_list_to_tuple_prune to H6.
Subgoal 1:

Variables: ML R2' FA L R5 M'' L3'1 E'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (R2' n1)
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply app_subst'_hbase_comm to H3.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (M' n1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (M' n1)
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (hbase (M' n1)) (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply app_subst'_app_comm to H7.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M1' M2'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' (M1' n1) (M2' n1)))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' (M1' n1) (M2' n1))
H8 : app_subst ML n1 (M1' n1)
H9 : app_subst ML E' (M2' n1)
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (hbase (app' (M1' n1) (M2' n1)))
                (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply subst'_nabla to H1 with x = n1.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M1' M2'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' (M1' n1) (M2' n1)))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' (M1' n1) (M2' n1))
H8 : app_subst ML n1 (M1' n1)
H9 : app_subst ML E' (M2' n1)
H10 : app_subst ML n1 n1
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (hbase (app' (M1' n1) (M2' n1)))
                (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply app_subst_det to H8 H10.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M2'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 (M2' n1)))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 (M2' n1))
H8 : app_subst ML n1 n1
H9 : app_subst ML E' (M2' n1)
H10 : app_subst ML n1 n1
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (hbase (app' n1 (M2' n1)))
                (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply tm'_list_to_tuple_permute2 to _ H6 H9.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M2' FE'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 (M2' n1)))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 (M2' n1))
H8 : app_subst ML n1 n1
H9 : app_subst ML E' (M2' n1)
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 (FE' n1)
H12 : {tm'_list_to_tuple (FE' n1) (M2' n1)}
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (hbase (app' n1 (M2' n1)))
                (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply app_subst_list_prune to H11.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M2' M''1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 (M2' n1)))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 (M2' n1))
H8 : app_subst ML n1 n1
H9 : app_subst ML E' (M2' n1)
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 (M2' n1)}
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (hbase (app' n1 (M2' n1)))
                (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply tm'_list_to_tuple_prune to H12.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (hbase (app' n1 E'1)) (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply crev_permute to _ H5 H11.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1' L2'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil L2'
H15 : {rev L1' L2' M''1}
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (hbase (app' n1 E'1)) (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply app_subst_list_nil_comm to H14.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil nil
H15 : {rev L1' nil M''1}
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (hbase (app' n1 E'1)) (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply app_subst'_exists to H1 with M = L n3.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1' M'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil nil
H15 : {rev L1' nil M''1}
H16 : app_subst ML (L n3) (M'1 n3)
============================
 exists R1' FA' L', (nabla x, app_subst ML (hbase (R5 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (hbase (app' n1 E'1)) (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < exists x\hbase (M'' x).
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1' M'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil nil
H15 : {rev L1' nil M''1}
H16 : app_subst ML (L n3) (M'1 n3)
============================
 exists FA' L', (nabla x, app_subst ML (hbase (R5 x)) (hbase (M'' x))) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs (x\hbase (M'' x)) n1 (L' l) FA' (hbase (app' n1 E'1))
                (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < exists L1'.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1' M'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil nil
H15 : {rev L1' nil M''1}
H16 : app_subst ML (L n3) (M'1 n3)
============================
 exists L', (nabla x, app_subst ML (hbase (R5 x)) (hbase (M'' x))) /\
   app_subst_list ML FA L1' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs (x\hbase (M'' x)) n1 (L' l) L1' (hbase (app' n1 E'1))
                (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < exists M'1.
Subgoal 1:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1' M'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil nil
H15 : {rev L1' nil M''1}
H16 : app_subst ML (L n3) (M'1 n3)
============================
 (nabla x, app_subst ML (hbase (R5 x)) (hbase (M'' x))) /\
   app_subst_list ML FA L1' /\ (nabla l, app_subst ML (L l) (M'1 l)) /\
   (nabla l, {hoist_abs (x\hbase (M'' x)) n1 (M'1 l) L1'
                (hbase (app' n1 E'1)) (z2\M'' z2)})

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < split.
Subgoal 1.1:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1' M'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil nil
H15 : {rev L1' nil M''1}
H16 : app_subst ML (L n3) (M'1 n3)
============================
 nabla x, app_subst ML (hbase (R5 x)) (hbase (M'' x))

Subgoal 1.2 is:
 app_subst_list ML FA L1'

Subgoal 1.3 is:
 nabla l, app_subst ML (L l) (M'1 l)

Subgoal 1.4 is:
 nabla l, {hoist_abs (x\hbase (M'' x)) n1 (M'1 l) L1' (hbase (app' n1 E'1))
             (z2\M'' z2)}

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < intros.
Subgoal 1.1:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1' M'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil nil
H15 : {rev L1' nil M''1}
H16 : app_subst ML (L n3) (M'1 n3)
============================
 app_subst ML (hbase (R5 n1)) (hbase (M'' n1))

Subgoal 1.2 is:
 app_subst_list ML FA L1'

Subgoal 1.3 is:
 nabla l, app_subst ML (L l) (M'1 l)

Subgoal 1.4 is:
 nabla l, {hoist_abs (x\hbase (M'' x)) n1 (M'1 l) L1' (hbase (app' n1 E'1))
             (z2\M'' z2)}

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < backchain app_subst'_hbase_compose.
Subgoal 1.2:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1' M'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil nil
H15 : {rev L1' nil M''1}
H16 : app_subst ML (L n3) (M'1 n3)
============================
 app_subst_list ML FA L1'

Subgoal 1.3 is:
 nabla l, app_subst ML (L l) (M'1 l)

Subgoal 1.4 is:
 nabla l, {hoist_abs (x\hbase (M'' x)) n1 (M'1 l) L1' (hbase (app' n1 E'1))
             (z2\M'' z2)}

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < search.
Subgoal 1.3:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1' M'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil nil
H15 : {rev L1' nil M''1}
H16 : app_subst ML (L n3) (M'1 n3)
============================
 nabla l, app_subst ML (L l) (M'1 l)

Subgoal 1.4 is:
 nabla l, {hoist_abs (x\hbase (M'' x)) n1 (M'1 l) L1' (hbase (app' n1 E'1))
             (z2\M'' z2)}

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < search.
Subgoal 1.4:

Variables: ML FA L R5 M'' L3'1 E' M''1 E'1 L1' M'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\hbase (R5 x)) n1 (L n3) FA (hbase (app' n1 E')) (z2\R5 z2)}@
H3 : app_subst ML (hbase (app' n1 E')) (hbase (app' n1 E'1))
H4 : app_subst ML (R5 n2) (M'' n2)
H5 : {rev FA nil L3'1}*
H6 : {tm'_list_to_tuple L3'1 E'}*
H7 : app_subst ML (app' n1 E') (app' n1 E'1)
H8 : app_subst ML n1 n1
H9 : app_subst ML E' E'1
H10 : app_subst ML n1 n1
H11 : app_subst_list ML L3'1 M''1
H12 : {tm'_list_to_tuple M''1 E'1}
H13 : app_subst_list ML FA L1'
H14 : app_subst_list ML nil nil
H15 : {rev L1' nil M''1}
H16 : app_subst ML (L n3) (M'1 n3)
============================
 nabla l, {hoist_abs (x\hbase (M'' x)) n1 (M'1 l) L1' (hbase (app' n1 E'1))
             (z2\M'' z2)}

Subgoal 2 is:
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < search.
Subgoal 2:

Variables: ML R2' FA L F' F2 R4 R3
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (R2' n1)
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2)) (F' n3 n2)
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (R2' n1) (F' l)})

hoist_abs_permute < apply app_subst'_habs_comm to H3.
Subgoal 2:

Variables: ML FA L F' F2 R4 R3 R'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2)) (F' n3 n2)
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1)) (F' l)})

hoist_abs_permute < apply app_subst'_let_comm to H4.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' M1 R5
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (M1 n2 n3) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (M1 n2 n3)
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (M1 z2 l) (R5 z2 l))})

hoist_abs_permute < apply app_subst'_fst_comm to H7.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M1'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M1' n3 n2)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M1' n3 n2))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M1' n3 n2)
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M1' l z2)) (R5 z2 l))})

hoist_abs_permute < apply app_subst_prune to H9.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M''
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < assert app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2).
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M''
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply IH to _ H5 H6 H10.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' R1' FA' L'
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (R1' n2 n1 n3)
H12 : app_subst_list ML (n2 :: FA) (FA' n2 n1)
H13 : app_subst ML (snd' (L n3)) (L' n2 n1 n3)
H14 : {hoist_abs (R1' n2 n1) n1 (L' n2 n1 n3) (FA' n2 n1) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply app_subst_prune to H11.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' FA' L' M''1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''1 n3 n2)
H12 : app_subst_list ML (n2 :: FA) (FA' n2 n1)
H13 : app_subst ML (snd' (L n3)) (L' n2 n1 n3)
H14 : {hoist_abs (z3\M''1 z3 n2) n1 (L' n2 n1 n3) (FA' n2 n1) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply app_subst_list_prune to H12.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' L' M''1 M''2
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''1 n3 n2)
H12 : app_subst_list ML (n2 :: FA) (M''2 n2)
H13 : app_subst ML (snd' (L n3)) (L' n2 n1 n3)
H14 : {hoist_abs (z3\M''1 z3 n2) n1 (L' n2 n1 n3) (M''2 n2) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply app_subst_list_prune to H12.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' L' M''1 M''3
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''1 n3 n2)
H12 : app_subst_list ML (n2 :: FA) (M''3 n2)
H13 : app_subst ML (snd' (L n3)) (L' n2 n1 n3)
H14 : {hoist_abs (z3\M''1 z3 n2) n1 (L' n2 n1 n3) (M''3 n2) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply app_subst_list_comm1 to H12.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' L' M''1 X' L'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''1 n3 n2)
H12 : app_subst_list ML (n2 :: FA) (X' n2 :: L'1 n2)
H13 : app_subst ML (snd' (L n3)) (L' n2 n1 n3)
H14 : {hoist_abs (z3\M''1 z3 n2) n1 (L' n2 n1 n3) (X' n2 :: L'1 n2)
         (R' n1 n2) (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 (X' n2)
H16 : app_subst_list ML FA (L'1 n2)
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply subst'_nabla to H1 with x = n2.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' L' M''1 X' L'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''1 n3 n2)
H12 : app_subst_list ML (n2 :: FA) (X' n2 :: L'1 n2)
H13 : app_subst ML (snd' (L n3)) (L' n2 n1 n3)
H14 : {hoist_abs (z3\M''1 z3 n2) n1 (L' n2 n1 n3) (X' n2 :: L'1 n2)
         (R' n1 n2) (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 (X' n2)
H16 : app_subst_list ML FA (L'1 n2)
H17 : app_subst ML n2 n2
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply app_subst_det to H15 H17.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' L' M''1 L'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''1 n3 n2)
H12 : app_subst_list ML (n2 :: FA) (n2 :: L'1 n2)
H13 : app_subst ML (snd' (L n3)) (L' n2 n1 n3)
H14 : {hoist_abs (z3\M''1 z3 n2) n1 (L' n2 n1 n3) (n2 :: L'1 n2) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA (L'1 n2)
H17 : app_subst ML n2 n2
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply app_subst_prune to H11.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' L' L'1 M''4
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: L'1 n2)
H13 : app_subst ML (snd' (L n3)) (L' n2 n1 n3)
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (L' n2 n1 n3) (n2 :: L'1 n2) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA (L'1 n2)
H17 : app_subst ML n2 n2
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply app_subst_list_prune to H16.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' L' M''4 M''5
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (L' n2 n1 n3)
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (L' n2 n1 n3) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply app_subst'_snd_comm to H13.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M1'1
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M1'1 n3 n1 n2))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M1'1 n3 n1 n2)) (n2 :: M''5)
         (R' n1 n2) (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M1'1 n3 n1 n2)
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply app_subst_prune to H18.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''6
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''6 n2 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''6 n2 n3)) (n2 :: M''5)
         (R' n1 n2) (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''6 n2 n3)
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < apply app_subst_prune to H18.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
============================
 exists R1' FA' L', (nabla x, app_subst ML (habs (R3 x)) (R1' x)) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs R1' n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < exists x\habs (y\M''4 y x).
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
============================
 exists FA' L', (nabla x, app_subst ML (habs (R3 x)) (habs (y\M''4 y x))) /\
   app_subst_list ML FA FA' /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs (x\habs (y\M''4 y x)) n1 (L' l) FA' (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < exists M''5.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
============================
 exists L', (nabla x, app_subst ML (habs (R3 x)) (habs (y\M''4 y x))) /\
   app_subst_list ML FA M''5 /\ (nabla l, app_subst ML (L l) (L' l)) /\
   (nabla l, {hoist_abs (x\habs (y\M''4 y x)) n1 (L' l) M''5 (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < exists M''7.
Subgoal 2:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
============================
 (nabla x, app_subst ML (habs (R3 x)) (habs (y\M''4 y x))) /\
   app_subst_list ML FA M''5 /\ (nabla l, app_subst ML (L l) (M''7 l)) /\
   (nabla l, {hoist_abs (x\habs (y\M''4 y x)) n1 (M''7 l) M''5 (habs (R' n1))
                (z2\let' (fst' (M'' l)) (R5 z2 l))})

hoist_abs_permute < split.
Subgoal 2.1:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
============================
 nabla x, app_subst ML (habs (R3 x)) (habs (y\M''4 y x))

Subgoal 2.2 is:
 app_subst_list ML FA M''5

Subgoal 2.3 is:
 nabla l, app_subst ML (L l) (M''7 l)

Subgoal 2.4 is:
 nabla l, {hoist_abs (x\habs (y\M''4 y x)) n1 (M''7 l) M''5 (habs (R' n1))
             (z2\let' (fst' (M'' l)) (R5 z2 l))}

hoist_abs_permute < intros.
Subgoal 2.1:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
============================
 app_subst ML (habs (R3 n1)) (habs (y\M''4 y n1))

Subgoal 2.2 is:
 app_subst_list ML FA M''5

Subgoal 2.3 is:
 nabla l, app_subst ML (L l) (M''7 l)

Subgoal 2.4 is:
 nabla l, {hoist_abs (x\habs (y\M''4 y x)) n1 (M''7 l) M''5 (habs (R' n1))
             (z2\let' (fst' (M'' l)) (R5 z2 l))}

hoist_abs_permute < apply app_subst'_habs_compose to H11 with x = n2.
Subgoal 2.1:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
H19 : app_subst ML (habs (z2\R3 n3 z2)) (habs (z2\M''4 z2 n3))
============================
 app_subst ML (habs (R3 n1)) (habs (y\M''4 y n1))

Subgoal 2.2 is:
 app_subst_list ML FA M''5

Subgoal 2.3 is:
 nabla l, app_subst ML (L l) (M''7 l)

Subgoal 2.4 is:
 nabla l, {hoist_abs (x\habs (y\M''4 y x)) n1 (M''7 l) M''5 (habs (R' n1))
             (z2\let' (fst' (M'' l)) (R5 z2 l))}

hoist_abs_permute < search.
Subgoal 2.2:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
============================
 app_subst_list ML FA M''5

Subgoal 2.3 is:
 nabla l, app_subst ML (L l) (M''7 l)

Subgoal 2.4 is:
 nabla l, {hoist_abs (x\habs (y\M''4 y x)) n1 (M''7 l) M''5 (habs (R' n1))
             (z2\let' (fst' (M'' l)) (R5 z2 l))}

hoist_abs_permute < search.
Subgoal 2.3:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
============================
 nabla l, app_subst ML (L l) (M''7 l)

Subgoal 2.4 is:
 nabla l, {hoist_abs (x\habs (y\M''4 y x)) n1 (M''7 l) M''5 (habs (R' n1))
             (z2\let' (fst' (M'' l)) (R5 z2 l))}

hoist_abs_permute < search.
Subgoal 2.4:

Variables: ML FA L F2 R4 R3 R' R5 M'' M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M'' n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M'' n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M'' n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
============================
 nabla l, {hoist_abs (x\habs (y\M''4 y x)) n1 (M''7 l) M''5 (habs (R' n1))
             (z2\let' (fst' (M'' l)) (R5 z2 l))}

hoist_abs_permute < apply app_subst_det to H9 H18.
Subgoal 2.4:

Variables: ML FA L F2 R4 R3 R' R5 M''4 M''5 M''7
IH : forall ML R1 R2 R2' FA L F F', nabla g x l, subst' ML ->
       {hoist_abs R1 g (L l) FA (R2 g) (F l)}* ->
       app_subst ML (R2 g) (R2' g) -> app_subst ML (F l x) (F' l x) ->
       (exists R1' FA' L', (nabla x1, app_subst ML (R1 x1) (R1' x1)) /\
            app_subst_list ML FA FA' /\
            (nabla l1, app_subst ML (L l1) (L' l1)) /\
            (nabla l1, {hoist_abs R1' g (L' l1) FA' (R2' g) (F' l1)}))
H1 : subst' ML
H2 : {hoist_abs (x\habs (R3 x)) n1 (L n3) FA (habs (R4 n1))
        (z2\let' (fst' (L n3)) (F2 n3 z2))}@
H3 : app_subst ML (habs (R4 n1)) (habs (R' n1))
H4 : app_subst ML (let' (fst' (L n3)) (F2 n3 n2))
       (let' (fst' (M''7 n3)) (R5 n2 n3))
H5 : {hoist_abs (x\R3 x n2) n1 (snd' (L n3)) (n2 :: FA) (R4 n1 n2)
        (x\F2 n3 x n2)}*
H6 : app_subst ML (R4 n1 n2) (R' n1 n2)
H7 : app_subst ML (fst' (L n3)) (fst' (M''7 n3))
H8 : app_subst ML (F2 n3 n2 n1) (R5 n2 n3 n1)
H9 : app_subst ML (L n3) (M''7 n3)
H10 : app_subst ML (F2 n3 n4 n2) (R5 n4 n3 n2)
H11 : app_subst ML (R3 n3 n2) (M''4 n2 n3)
H12 : app_subst_list ML (n2 :: FA) (n2 :: M''5)
H13 : app_subst ML (snd' (L n3)) (snd' (M''7 n3))
H14 : {hoist_abs (z3\M''4 n2 z3) n1 (snd' (M''7 n3)) (n2 :: M''5) (R' n1 n2)
         (z6\R5 z6 n3 n2)}
H15 : app_subst ML n2 n2
H16 : app_subst_list ML FA M''5
H17 : app_subst ML n2 n2
H18 : app_subst ML (L n3) (M''7 n3)
============================
 nabla l, {hoist_abs (x\habs (y\M''4 y x)) n1 (M''7 l) M''5 (habs (R' n1))
             (z2\let' (fst' (M''7 l)) (R5 z2 l))}

hoist_abs_permute < search.
Proof completed.
Abella < Theorem abstract_permute : 
forall ML F F' R1 R2 R2', nabla l x, subst' ML ->
  app_subst ML (R2 x) (R2' x) -> app_subst ML (F l x) (F' l x) ->
  {abstract R1 R2 F} ->
  (exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\
       {abstract R1' R2' F'}).


============================
 forall ML F F' R1 R2 R2', nabla l x, subst' ML ->
   app_subst ML (R2 x) (R2' x) -> app_subst ML (F l x) (F' l x) ->
   {abstract R1 R2 F} ->
   (exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\
        {abstract R1' R2' F'})

abstract_permute < intros.

Variables: ML F F' R1 R2 R2'
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H4 : {abstract R1 R2 F}
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < case H4.

Variables: ML F F' R1 R2 R2'
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H5 : {hoist_abs R1 n1 n2 nil (R2 n1) (x\F n2 x)}
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < assert app_subst ML (R2 n1) (R2' n1).

Variables: ML F F' R1 R2 R2'
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H5 : {hoist_abs R1 n1 n2 nil (R2 n1) (x\F n2 x)}
H6 : app_subst ML (R2 n1) (R2' n1)
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < assert app_subst ML (F n2 n3) (F' n2 n3).

Variables: ML F F' R1 R2 R2'
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H5 : {hoist_abs R1 n1 n2 nil (R2 n1) (x\F n2 x)}
H6 : app_subst ML (R2 n1) (R2' n1)
H7 : app_subst ML (F n2 n3) (F' n2 n3)
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < apply hoist_abs_permute to _ H5 H6 H7.

Variables: ML F F' R1 R2 R2' R1' FA' L'
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H5 : {hoist_abs R1 n1 n2 nil (R2 n1) (x\F n2 x)}
H6 : app_subst ML (R2 n1) (R2' n1)
H7 : app_subst ML (F n2 n3) (F' n2 n3)
H8 : app_subst ML (R1 n2) (R1' n1 n2)
H9 : app_subst_list ML nil (FA' n1)
H10 : app_subst ML n2 (L' n1 n2)
H11 : {hoist_abs (R1' n1) n1 (L' n1 n2) (FA' n1) (R2' n1) (z5\F' n2 z5)}
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < apply app_subst_list_prune to H9.

Variables: ML F F' R1 R2 R2' R1' L' M''
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H5 : {hoist_abs R1 n1 n2 nil (R2 n1) (x\F n2 x)}
H6 : app_subst ML (R2 n1) (R2' n1)
H7 : app_subst ML (F n2 n3) (F' n2 n3)
H8 : app_subst ML (R1 n2) (R1' n1 n2)
H9 : app_subst_list ML nil M''
H10 : app_subst ML n2 (L' n1 n2)
H11 : {hoist_abs (R1' n1) n1 (L' n1 n2) M'' (R2' n1) (z5\F' n2 z5)}
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < apply app_subst_prune to H10.

Variables: ML F F' R1 R2 R2' R1' M'' M''1
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H5 : {hoist_abs R1 n1 n2 nil (R2 n1) (x\F n2 x)}
H6 : app_subst ML (R2 n1) (R2' n1)
H7 : app_subst ML (F n2 n3) (F' n2 n3)
H8 : app_subst ML (R1 n2) (R1' n1 n2)
H9 : app_subst_list ML nil M''
H10 : app_subst ML n2 (M''1 n2)
H11 : {hoist_abs (R1' n1) n1 (M''1 n2) M'' (R2' n1) (z5\F' n2 z5)}
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < apply app_subst_prune to H8.

Variables: ML F F' R1 R2 R2' M'' M''1 M''2
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H5 : {hoist_abs R1 n1 n2 nil (R2 n1) (x\F n2 x)}
H6 : app_subst ML (R2 n1) (R2' n1)
H7 : app_subst ML (F n2 n3) (F' n2 n3)
H8 : app_subst ML (R1 n2) (M''2 n2)
H9 : app_subst_list ML nil M''
H10 : app_subst ML n2 (M''1 n2)
H11 : {hoist_abs (z2\M''2 z2) n1 (M''1 n2) M'' (R2' n1) (z5\F' n2 z5)}
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < apply app_subst_list_nil_comm to H9.

Variables: ML F F' R1 R2 R2' M''1 M''2
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H5 : {hoist_abs R1 n1 n2 nil (R2 n1) (x\F n2 x)}
H6 : app_subst ML (R2 n1) (R2' n1)
H7 : app_subst ML (F n2 n3) (F' n2 n3)
H8 : app_subst ML (R1 n2) (M''2 n2)
H9 : app_subst_list ML nil nil
H10 : app_subst ML n2 (M''1 n2)
H11 : {hoist_abs (z2\M''2 z2) n1 (M''1 n2) nil (R2' n1) (z5\F' n2 z5)}
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < apply subst'_nabla to H1 with x = n2.

Variables: ML F F' R1 R2 R2' M''1 M''2
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H5 : {hoist_abs R1 n1 n2 nil (R2 n1) (x\F n2 x)}
H6 : app_subst ML (R2 n1) (R2' n1)
H7 : app_subst ML (F n2 n3) (F' n2 n3)
H8 : app_subst ML (R1 n2) (M''2 n2)
H9 : app_subst_list ML nil nil
H10 : app_subst ML n2 (M''1 n2)
H11 : {hoist_abs (z2\M''2 z2) n1 (M''1 n2) nil (R2' n1) (z5\F' n2 z5)}
H12 : app_subst ML n2 n2
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < apply app_subst_det to H10 H12.

Variables: ML F F' R1 R2 R2' M''2
H1 : subst' ML
H2 : app_subst ML (R2 n2) (R2' n2)
H3 : app_subst ML (F n1 n2) (F' n1 n2)
H5 : {hoist_abs R1 n1 n2 nil (R2 n1) (x\F n2 x)}
H6 : app_subst ML (R2 n1) (R2' n1)
H7 : app_subst ML (F n2 n3) (F' n2 n3)
H8 : app_subst ML (R1 n2) (M''2 n2)
H9 : app_subst_list ML nil nil
H10 : app_subst ML n2 n2
H11 : {hoist_abs (z2\M''2 z2) n1 n2 nil (R2' n1) (z5\F' n2 z5)}
H12 : app_subst ML n2 n2
============================
 exists R1', (nabla x, app_subst ML (R1 x) (R1' x)) /\ {abstract R1' R2' F'}

abstract_permute < search.
Proof completed.
Abella < Theorem hoist_abs_eval_fun : 
forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA (R' g)
                                               (F l)} ->
  {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
  {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}.


============================
 forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA 
                                                (R' g) (F l)} ->
   {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
   {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}

hoist_abs_eval_fun < induction on 1.

IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
============================
 forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA 
                                                (R' g) (F l)}@ ->
   {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
   {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}

hoist_abs_eval_fun < intros.

Variables: R R' FA L F FE E E' V V'
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H1 : {hoist_abs R n1 (L n2) FA (R' n1) (F n2)}@
H2 : {tm'_list_to_tuple FE E}
H3 : {eval' (L E') E}
H4 : {eval'' (htm FE (R V)) V'}
============================
 {eval' (F E' V) V'}

hoist_abs_eval_fun < case H1.
Subgoal 1:

Variables: FA L FE E E' V V' R'1 FA' R3
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H2 : {tm'_list_to_tuple FE E}
H3 : {eval' (L E') E}
H4 : {eval'' (htm FE (hbase (R3 V))) V'}
H5 : {rev FA nil (FA' n2 n1)}*
H6 : {tm'_list_to_tuple (FA' n2 n1) (R'1 n1)}*
============================
 {eval' (R3 V) V'}

Subgoal 2 is:
 {eval' (let' (fst' (L E')) (F2 E' V)) V'}

hoist_abs_eval_fun < case H4.
Subgoal 1:

Variables: FA L E E' V V' R'1 FA' R3
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H2 : {tm'_list_to_tuple nil E}
H3 : {eval' (L E') E}
H5 : {rev FA nil (FA' n2 n1)}*
H6 : {tm'_list_to_tuple (FA' n2 n1) (R'1 n1)}*
H7 : {eval' (R3 V) V'}
============================
 {eval' (R3 V) V'}

Subgoal 2 is:
 {eval' (let' (fst' (L E')) (F2 E' V)) V'}

hoist_abs_eval_fun < search.
Subgoal 2:

Variables: FA L FE E E' V V' F2 R'2 R2
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H2 : {tm'_list_to_tuple FE E}
H3 : {eval' (L E') E}
H4 : {eval'' (htm FE (habs (R2 V))) V'}
H5 : {hoist_abs (x\R2 x n3) n1 (snd' (L n2)) (n3 :: FA) (R'2 n1 n3)
        (x\F2 n2 x n3)}*
============================
 {eval' (let' (fst' (L E')) (F2 E' V)) V'}

hoist_abs_eval_fun < case H4.
Subgoal 2:

Variables: FA L E E' V V' F2 R'2 R2 F1 FE1
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H2 : {tm'_list_to_tuple (F1 :: FE1) E}
H3 : {eval' (L E') E}
H5 : {hoist_abs (x\R2 x n3) n1 (snd' (L n2)) (n3 :: FA) (R'2 n1 n3)
        (x\F2 n2 x n3)}*
H6 : {eval'' (htm FE1 (R2 V F1)) V'}
============================
 {eval' (let' (fst' (L E')) (F2 E' V)) V'}

hoist_abs_eval_fun < case H2.
Subgoal 2:

Variables: FA L E' V V' F2 R'2 R2 F1 FE1 ML'
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H3 : {eval' (L E') (pair' F1 ML')}
H5 : {hoist_abs (x\R2 x n3) n1 (snd' (L n2)) (n3 :: FA) (R'2 n1 n3)
        (x\F2 n2 x n3)}*
H6 : {eval'' (htm FE1 (R2 V F1)) V'}
H7 : {tm'_list_to_tuple FE1 ML'}
============================
 {eval' (let' (fst' (L E')) (F2 E' V)) V'}

hoist_abs_eval_fun <  inst H5 with n3 = F1.
Subgoal 2:

Variables: FA L E' V V' F2 R'2 R2 F1 FE1 ML'
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H3 : {eval' (L E') (pair' F1 ML')}
H5 : {hoist_abs (x\R2 x n3) n1 (snd' (L n2)) (n3 :: FA) (R'2 n1 n3)
        (x\F2 n2 x n3)}*
H6 : {eval'' (htm FE1 (R2 V F1)) V'}
H7 : {tm'_list_to_tuple FE1 ML'}
H8 : {hoist_abs (x\R2 x F1) n1 (snd' (L n2)) (F1 :: FA) (R'2 n1 F1)
        (x\F2 n2 x F1)}*
============================
 {eval' (let' (fst' (L E')) (F2 E' V)) V'}

hoist_abs_eval_fun < apply eval'_fst_pair to H3.
Subgoal 2:

Variables: FA L E' V V' F2 R'2 R2 F1 FE1 ML'
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H3 : {eval' (L E') (pair' F1 ML')}
H5 : {hoist_abs (x\R2 x n3) n1 (snd' (L n2)) (n3 :: FA) (R'2 n1 n3)
        (x\F2 n2 x n3)}*
H6 : {eval'' (htm FE1 (R2 V F1)) V'}
H7 : {tm'_list_to_tuple FE1 ML'}
H8 : {hoist_abs (x\R2 x F1) n1 (snd' (L n2)) (F1 :: FA) (R'2 n1 F1)
        (x\F2 n2 x F1)}*
H9 : {eval' (fst' (L E')) F1}
============================
 {eval' (let' (fst' (L E')) (F2 E' V)) V'}

hoist_abs_eval_fun < apply eval'_snd_pair to H3.
Subgoal 2:

Variables: FA L E' V V' F2 R'2 R2 F1 FE1 ML'
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H3 : {eval' (L E') (pair' F1 ML')}
H5 : {hoist_abs (x\R2 x n3) n1 (snd' (L n2)) (n3 :: FA) (R'2 n1 n3)
        (x\F2 n2 x n3)}*
H6 : {eval'' (htm FE1 (R2 V F1)) V'}
H7 : {tm'_list_to_tuple FE1 ML'}
H8 : {hoist_abs (x\R2 x F1) n1 (snd' (L n2)) (F1 :: FA) (R'2 n1 F1)
        (x\F2 n2 x F1)}*
H9 : {eval' (fst' (L E')) F1}
H10 : {eval' (snd' (L E')) ML'}
============================
 {eval' (let' (fst' (L E')) (F2 E' V)) V'}

hoist_abs_eval_fun < apply IH to H8 H7 _ H6 with L = x\snd' (L x), E' = E'.
Subgoal 2:

Variables: FA L E' V V' F2 R'2 R2 F1 FE1 ML'
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H3 : {eval' (L E') (pair' F1 ML')}
H5 : {hoist_abs (x\R2 x n3) n1 (snd' (L n2)) (n3 :: FA) (R'2 n1 n3)
        (x\F2 n2 x n3)}*
H6 : {eval'' (htm FE1 (R2 V F1)) V'}
H7 : {tm'_list_to_tuple FE1 ML'}
H8 : {hoist_abs (x\R2 x F1) n1 (snd' (L n2)) (F1 :: FA) (R'2 n1 F1)
        (x\F2 n2 x F1)}*
H9 : {eval' (fst' (L E')) F1}
H10 : {eval' (snd' (L E')) ML'}
H11 : {eval' (F2 E' V F1) V'}
============================
 {eval' (let' (fst' (L E')) (F2 E' V)) V'}

hoist_abs_eval_fun < apply eval'_let_fwd to H9 H11 with R = F2 E' V.
Subgoal 2:

Variables: FA L E' V V' F2 R'2 R2 F1 FE1 ML'
IH : forall R R' FA L F FE E E' V V', nabla g l, {hoist_abs R g (L l) FA
                                                    (R' g) (F l)}* ->
       {tm'_list_to_tuple FE E} -> {eval' (L E') E} ->
       {eval'' (htm FE (R V)) V'} -> {eval' (F E' V) V'}
H3 : {eval' (L E') (pair' F1 ML')}
H5 : {hoist_abs (x\R2 x n3) n1 (snd' (L n2)) (n3 :: FA) (R'2 n1 n3)
        (x\F2 n2 x n3)}*
H6 : {eval'' (htm FE1 (R2 V F1)) V'}
H7 : {tm'_list_to_tuple FE1 ML'}
H8 : {hoist_abs (x\R2 x F1) n1 (snd' (L n2)) (F1 :: FA) (R'2 n1 F1)
        (x\F2 n2 x F1)}*
H9 : {eval' (fst' (L E')) F1}
H10 : {eval' (snd' (L E')) ML'}
H11 : {eval' (F2 E' V F1) V'}
H12 : {eval' (let' (fst' (L E')) (F2 E' V)) V'}
============================
 {eval' (let' (fst' (L E')) (F2 E' V)) V'}

hoist_abs_eval_fun < search.
Proof completed.
Abella < Theorem abstract_eval_fun : 
forall R R' F FE E V, {val' E} -> {abstract R R' F} ->
  {tm'_list_to_tuple FE E} ->
  (forall V', {eval'' (htm FE (R V)) V'} -> {eval' (F E V) V'}).


============================
 forall R R' F FE E V, {val' E} -> {abstract R R' F} ->
   {tm'_list_to_tuple FE E} ->
   (forall V', {eval'' (htm FE (R V)) V'} -> {eval' (F E V) V'})

abstract_eval_fun < intros.

Variables: R R' F FE E V V'
H1 : {val' E}
H2 : {abstract R R' F}
H3 : {tm'_list_to_tuple FE E}
H4 : {eval'' (htm FE (R V)) V'}
============================
 {eval' (F E V) V'}

abstract_eval_fun < case H2.

Variables: R R' F FE E V V'
H1 : {val' E}
H3 : {tm'_list_to_tuple FE E}
H4 : {eval'' (htm FE (R V)) V'}
H5 : {hoist_abs R n1 n2 nil (R' n1) (x\F n2 x)}
============================
 {eval' (F E V) V'}

abstract_eval_fun < apply hoist_abs_eval_fun to H5 H3 _ H4 with E' = E.

Variables: R R' F FE E V V'
H1 : {val' E}
H3 : {tm'_list_to_tuple FE E}
H4 : {eval'' (htm FE (R V)) V'}
H5 : {hoist_abs R n1 n2 nil (R' n1) (x\F n2 x)}
H6 : {eval' (F E V) V'}
============================
 {eval' (F E V) V'}

abstract_eval_fun < search.
Proof completed.
Abella < Theorem hoist_abs_eval_body : 
forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
  {SL, tm' x |- tm'' (htm FE (R x))} -> {hoist_abs R g L FA (R' g) F} ->
  {rev FA FE FE'} -> {tm'_list_to_tuple FE' E} ->
  (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V}).


============================
 forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
   {SL, tm' x |- tm'' (htm FE (R x))} -> {hoist_abs R g L FA (R' g) F} ->
   {rev FA FE FE'} -> {tm'_list_to_tuple FE' E} ->
   (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})

hoist_abs_eval_body < induction on 4.

IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
============================
 forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
   {SL, tm' x |- tm'' (htm FE (R x))} -> {hoist_abs R g L FA (R' g) F}@ ->
   {rev FA FE FE'} -> {tm'_list_to_tuple FE' E} ->
   (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})

hoist_abs_eval_body < intros.

Variables: SL R R' FA L F FE FE' E V G
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H3 : {SL, tm' n1 |- tm'' (htm FE (R n1))}
H4 : {hoist_abs R n2 L FA (R' n2) F}@
H5 : {rev FA FE FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
============================
 {eval'' (htm FE (R' G)) V}

hoist_abs_eval_body < case H4 (keep).
Subgoal 1:

Variables: SL FA L FE FE' E V G FA'' FA' R2
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H3 : {SL, tm' n1 |- tm'' (htm FE (hbase (R2 n1)))}
H4 : {hoist_abs (x\hbase (R2 x)) n2 L FA (hbase (app' n2 (FA'' n2)))
        (z2\R2 z2)}@
H5 : {rev FA FE FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {rev FA nil (FA' n2)}*
H9 : {tm'_list_to_tuple (FA' n2) (FA'' n2)}*
============================
 {eval'' (htm FE (hbase (app' G (FA'' G)))) V}

Subgoal 2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < case H3.
Subgoal 1.1:

Variables: SL FA L FE' E V G FA'' FA' R2
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\hbase (R2 x)) n2 L FA (hbase (app' n2 (FA'' n2)))
        (z2\R2 z2)}@
H5 : {rev FA nil FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {rev FA nil (FA' n2)}*
H9 : {tm'_list_to_tuple (FA' n2) (FA'' n2)}*
H10 : {SL, tm' n1 |- tm' (R2 n1)}
============================
 {eval'' (htm nil (hbase (app' G (FA'' G)))) V}

Subgoal 1.2 is:
 {eval'' (htm FE (hbase (app' G (FA'' G)))) V}

Subgoal 2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < apply rev_det to H5 H8.
Subgoal 1.1:

Variables: SL FA L FE' E V G FA'' R2
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\hbase (R2 x)) n2 L FA (hbase (app' n2 (FA'' n2)))
        (z2\R2 z2)}@
H5 : {rev FA nil FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {rev FA nil FE'}*
H9 : {tm'_list_to_tuple FE' (FA'' n2)}*
H10 : {SL, tm' n1 |- tm' (R2 n1)}
============================
 {eval'' (htm nil (hbase (app' G (FA'' G)))) V}

Subgoal 1.2 is:
 {eval'' (htm FE (hbase (app' G (FA'' G)))) V}

Subgoal 2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < apply tm'_list_to_tuple_det to H6 H9.
Subgoal 1.1:

Variables: SL FA L FE' E V G R2
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\hbase (R2 x)) n2 L FA (hbase (app' n2 E)) (z2\R2 z2)}@
H5 : {rev FA nil FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {rev FA nil FE'}*
H9 : {tm'_list_to_tuple FE' E}*
H10 : {SL, tm' n1 |- tm' (R2 n1)}
============================
 {eval'' (htm nil (hbase (app' G E))) V}

Subgoal 1.2 is:
 {eval'' (htm FE (hbase (app' G (FA'' G)))) V}

Subgoal 2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < search.
Subgoal 1.2:

Variables: SL FA L FE FE' E V G FA'' FA' R2 F1
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\hbase (R2 x)) n2 L FA (hbase (app' n2 (FA'' n2)))
        (z2\R2 z2)}@
H5 : {rev FA FE FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {rev FA nil (FA' n2)}*
H9 : {tm'_list_to_tuple (FA' n2) (FA'' n2)}*
H10 : {SL, tm' n1, [F1 n1] |- tm'' (htm FE (hbase (R2 n1)))}
H11 : member (F1 n1) (tm' n1 :: SL)
============================
 {eval'' (htm FE (hbase (app' G (FA'' G)))) V}

Subgoal 2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < apply tm'_ctx_mem to _ H11.
Subgoal 1.2:

Variables: SL FA L FE FE' E V G FA'' FA' R2 X
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\hbase (R2 x)) n2 L FA (hbase (app' n2 (FA'' n2)))
        (z2\R2 z2)}@
H5 : {rev FA FE FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {rev FA nil (FA' n2)}*
H9 : {tm'_list_to_tuple (FA' n2) (FA'' n2)}*
H10 : {SL, tm' n1, [tm' (X n1)] |- tm'' (htm FE (hbase (R2 n1)))}
H11 : member (tm' (X n1)) (tm' n1 :: SL)
H12 : name (X n1)
============================
 {eval'' (htm FE (hbase (app' G (FA'' G)))) V}

Subgoal 2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < case H10.
Subgoal 2:

Variables: SL FA L FE FE' E V G F2 F' R2
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H3 : {SL, tm' n1 |- tm'' (htm FE (habs (R2 n1)))}
H4 : {hoist_abs (x\habs (R2 x)) n2 L FA (habs (F' n2))
        (x\let' (fst' L) (F2 x))}@
H5 : {rev FA FE FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {hoist_abs (x\R2 x n1) n2 (snd' L) (n1 :: FA) (F' n2 n1) (x\F2 x n1)}*
============================
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < case H3.
Subgoal 2.1:

Variables: SL FA L FE' E V G F2 F' R2 FE2 FE1
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\habs (R2 x)) n2 L FA (habs (F' n2))
        (x\let' (fst' L) (F2 x))}@
H5 : {rev FA (FE1 :: FE2) FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {hoist_abs (x\R2 x n1) n2 (snd' L) (n1 :: FA) (F' n2 n1) (x\F2 x n1)}*
H9 : {SL, tm' n1 |- tm' FE1}
H10 : {SL, tm' n1, tm' n2 |- tm'' (htm FE2 (R2 n1 n2))}
============================
 {eval'' (htm (FE1 :: FE2) (habs (F' G))) V}

Subgoal 2.2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < assert {rev (FE1 :: FA) FE2 FE'}.
Subgoal 2.1:

Variables: SL FA L FE' E V G F2 F' R2 FE2 FE1
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\habs (R2 x)) n2 L FA (habs (F' n2))
        (x\let' (fst' L) (F2 x))}@
H5 : {rev FA (FE1 :: FE2) FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {hoist_abs (x\R2 x n1) n2 (snd' L) (n1 :: FA) (F' n2 n1) (x\F2 x n1)}*
H9 : {SL, tm' n1 |- tm' FE1}
H10 : {SL, tm' n1, tm' n2 |- tm'' (htm FE2 (R2 n1 n2))}
H11 : {rev (FE1 :: FA) FE2 FE'}
============================
 {eval'' (htm (FE1 :: FE2) (habs (F' G))) V}

Subgoal 2.2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body <  inst H8 with n1 = FE1.
Subgoal 2.1:

Variables: SL FA L FE' E V G F2 F' R2 FE2 FE1
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\habs (R2 x)) n2 L FA (habs (F' n2))
        (x\let' (fst' L) (F2 x))}@
H5 : {rev FA (FE1 :: FE2) FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {hoist_abs (x\R2 x n1) n2 (snd' L) (n1 :: FA) (F' n2 n1) (x\F2 x n1)}*
H9 : {SL, tm' n1 |- tm' FE1}
H10 : {SL, tm' n1, tm' n2 |- tm'' (htm FE2 (R2 n1 n2))}
H11 : {rev (FE1 :: FA) FE2 FE'}
H12 : {hoist_abs (x\R2 x FE1) n2 (snd' L) (FE1 :: FA) (F' n2 FE1)
         (x\F2 x FE1)}*
============================
 {eval'' (htm (FE1 :: FE2) (habs (F' G))) V}

Subgoal 2.2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body <  inst H10 with n2 = FE1.
Subgoal 2.1:

Variables: SL FA L FE' E V G F2 F' R2 FE2 FE1
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\habs (R2 x)) n2 L FA (habs (F' n2))
        (x\let' (fst' L) (F2 x))}@
H5 : {rev FA (FE1 :: FE2) FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {hoist_abs (x\R2 x n1) n2 (snd' L) (n1 :: FA) (F' n2 n1) (x\F2 x n1)}*
H9 : {SL, tm' n1 |- tm' FE1}
H10 : {SL, tm' n1, tm' n2 |- tm'' (htm FE2 (R2 n1 n2))}
H11 : {rev (FE1 :: FA) FE2 FE'}
H12 : {hoist_abs (x\R2 x FE1) n2 (snd' L) (FE1 :: FA) (F' n2 FE1)
         (x\F2 x FE1)}*
H13 : {SL, tm' n1, tm' FE1 |- tm'' (htm FE2 (R2 n1 FE1))}
============================
 {eval'' (htm (FE1 :: FE2) (habs (F' G))) V}

Subgoal 2.2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < cut H13 with H9.
Subgoal 2.1:

Variables: SL FA L FE' E V G F2 F' R2 FE2 FE1
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\habs (R2 x)) n2 L FA (habs (F' n2))
        (x\let' (fst' L) (F2 x))}@
H5 : {rev FA (FE1 :: FE2) FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {hoist_abs (x\R2 x n1) n2 (snd' L) (n1 :: FA) (F' n2 n1) (x\F2 x n1)}*
H9 : {SL, tm' n1 |- tm' FE1}
H10 : {SL, tm' n1, tm' n2 |- tm'' (htm FE2 (R2 n1 n2))}
H11 : {rev (FE1 :: FA) FE2 FE'}
H12 : {hoist_abs (x\R2 x FE1) n2 (snd' L) (FE1 :: FA) (F' n2 FE1)
         (x\F2 x FE1)}*
H13 : {SL, tm' n1, tm' FE1 |- tm'' (htm FE2 (R2 n1 FE1))}
H14 : {SL, tm' n1 |- tm'' (htm FE2 (R2 n1 FE1))}
============================
 {eval'' (htm (FE1 :: FE2) (habs (F' G))) V}

Subgoal 2.2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < apply IH to _ _ H14 H12 H11 _.
Subgoal 2.1:

Variables: SL FA L FE' E V G F2 F' R2 FE2 FE1
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\habs (R2 x)) n2 L FA (habs (F' n2))
        (x\let' (fst' L) (F2 x))}@
H5 : {rev FA (FE1 :: FE2) FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {hoist_abs (x\R2 x n1) n2 (snd' L) (n1 :: FA) (F' n2 n1) (x\F2 x n1)}*
H9 : {SL, tm' n1 |- tm' FE1}
H10 : {SL, tm' n1, tm' n2 |- tm'' (htm FE2 (R2 n1 n2))}
H11 : {rev (FE1 :: FA) FE2 FE'}
H12 : {hoist_abs (x\R2 x FE1) n2 (snd' L) (FE1 :: FA) (F' n2 FE1)
         (x\F2 x FE1)}*
H13 : {SL, tm' n1, tm' FE1 |- tm'' (htm FE2 (R2 n1 FE1))}
H14 : {SL, tm' n1 |- tm'' (htm FE2 (R2 n1 FE1))}
H15 : forall V G, {eval' (app' G E) V} -> {eval'' (htm FE2 (F' G FE1)) V}
============================
 {eval'' (htm (FE1 :: FE2) (habs (F' G))) V}

Subgoal 2.2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < apply H15 to H7.
Subgoal 2.1:

Variables: SL FA L FE' E V G F2 F' R2 FE2 FE1
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\habs (R2 x)) n2 L FA (habs (F' n2))
        (x\let' (fst' L) (F2 x))}@
H5 : {rev FA (FE1 :: FE2) FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {hoist_abs (x\R2 x n1) n2 (snd' L) (n1 :: FA) (F' n2 n1) (x\F2 x n1)}*
H9 : {SL, tm' n1 |- tm' FE1}
H10 : {SL, tm' n1, tm' n2 |- tm'' (htm FE2 (R2 n1 n2))}
H11 : {rev (FE1 :: FA) FE2 FE'}
H12 : {hoist_abs (x\R2 x FE1) n2 (snd' L) (FE1 :: FA) (F' n2 FE1)
         (x\F2 x FE1)}*
H13 : {SL, tm' n1, tm' FE1 |- tm'' (htm FE2 (R2 n1 FE1))}
H14 : {SL, tm' n1 |- tm'' (htm FE2 (R2 n1 FE1))}
H15 : forall V G, {eval' (app' G E) V} -> {eval'' (htm FE2 (F' G FE1)) V}
H16 : {eval'' (htm FE2 (F' G FE1)) V}
============================
 {eval'' (htm (FE1 :: FE2) (habs (F' G))) V}

Subgoal 2.2 is:
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < search.
Subgoal 2.2:

Variables: SL FA L FE FE' E V G F2 F' R2 F1
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\habs (R2 x)) n2 L FA (habs (F' n2))
        (x\let' (fst' L) (F2 x))}@
H5 : {rev FA FE FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {hoist_abs (x\R2 x n1) n2 (snd' L) (n1 :: FA) (F' n2 n1) (x\F2 x n1)}*
H9 : {SL, tm' n1, [F1 n1] |- tm'' (htm FE (habs (R2 n1)))}
H10 : member (F1 n1) (tm' n1 :: SL)
============================
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < apply tm'_ctx_mem to _ H10.
Subgoal 2.2:

Variables: SL FA L FE FE' E V G F2 F' R2 X
IH : forall SL R R' FA L F FE FE' E, nabla x g, {val' E} -> tm'_ctx SL ->
       {SL, tm' x |- tm'' (htm FE (R x))} ->
       {hoist_abs R g L FA (R' g) F}* -> {rev FA FE FE'} ->
       {tm'_list_to_tuple FE' E} ->
       (forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V})
H1 : {val' E}
H2 : tm'_ctx SL
H4 : {hoist_abs (x\habs (R2 x)) n2 L FA (habs (F' n2))
        (x\let' (fst' L) (F2 x))}@
H5 : {rev FA FE FE'}
H6 : {tm'_list_to_tuple FE' E}
H7 : {eval' (app' G E) V}
H8 : {hoist_abs (x\R2 x n1) n2 (snd' L) (n1 :: FA) (F' n2 n1) (x\F2 x n1)}*
H9 : {SL, tm' n1, [tm' (X n1)] |- tm'' (htm FE (habs (R2 n1)))}
H10 : member (tm' (X n1)) (tm' n1 :: SL)
H11 : name (X n1)
============================
 {eval'' (htm FE (habs (F' G))) V}

hoist_abs_eval_body < case H9.
Proof completed.
Abella < Theorem abstract_eval_body : 
forall E FE R R' F G V, nabla x, {val' E} ->
  {tm' x |- tm'' (htm FE (R x))} -> {abstract R R' F} ->
  {tm'_list_to_tuple FE E} -> {eval' (app' G E) V} ->
  {eval'' (htm FE (R' G)) V}.


============================
 forall E FE R R' F G V, nabla x, {val' E} ->
   {tm' x |- tm'' (htm FE (R x))} -> {abstract R R' F} ->
   {tm'_list_to_tuple FE E} -> {eval' (app' G E) V} ->
   {eval'' (htm FE (R' G)) V}

abstract_eval_body < intros.

Variables: E FE R R' F G V
H1 : {val' E}
H2 : {tm' n1 |- tm'' (htm FE (R n1))}
H3 : {abstract R R' F}
H4 : {tm'_list_to_tuple FE E}
H5 : {eval' (app' G E) V}
============================
 {eval'' (htm FE (R' G)) V}

abstract_eval_body < case H3.

Variables: E FE R R' F G V
H1 : {val' E}
H2 : {tm' n1 |- tm'' (htm FE (R n1))}
H4 : {tm'_list_to_tuple FE E}
H5 : {eval' (app' G E) V}
H6 : {hoist_abs R n1 n2 nil (R' n1) (x\F n2 x)}
============================
 {eval'' (htm FE (R' G)) V}

abstract_eval_body <  inst H2 with n1 = n3.

Variables: E FE R R' F G V
H1 : {val' E}
H2 : {tm' n1 |- tm'' (htm FE (R n1))}
H4 : {tm'_list_to_tuple FE E}
H5 : {eval' (app' G E) V}
H6 : {hoist_abs R n1 n2 nil (R' n1) (x\F n2 x)}
H7 : {tm' n3 |- tm'' (htm FE (R n3))}
============================
 {eval'' (htm FE (R' G)) V}

abstract_eval_body < apply hoist_abs_eval_body to _ _ H7 H6 _ H4.

Variables: E FE R R' F G V
H1 : {val' E}
H2 : {tm' n1 |- tm'' (htm FE (R n1))}
H4 : {tm'_list_to_tuple FE E}
H5 : {eval' (app' G E) V}
H6 : {hoist_abs R n1 n2 nil (R' n1) (x\F n2 x)}
H7 : {tm' n3 |- tm'' (htm FE (R n3))}
H8 : forall V G, {eval' (app' G E) V} -> {eval'' (htm FE (R' G)) V}
============================
 {eval'' (htm FE (R' G)) V}

abstract_eval_body < backchain H8.
Proof completed.
Abella < Theorem subst'_cappend_permute : 
forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
  {appd FE1 FE2 FE} ->
  (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
       app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'}).


============================
 forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
   {appd FE1 FE2 FE} ->
   (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
        app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})

subst'_cappend_permute < induction on 3.

IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
============================
 forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
   {appd FE1 FE2 FE}@ ->
   (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
        app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})

subst'_cappend_permute < intros.

Variables: ML FE FE1 FE2 FE'
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML FE FE'
H3 : {appd FE1 FE2 FE}@
============================
 exists FE1' FE2', app_subst_list ML FE1 FE1' /\
   app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'}

subst'_cappend_permute < case H3.
Subgoal 1:

Variables: ML FE FE'
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML FE FE'
============================
 exists FE1' FE2', app_subst_list ML nil FE1' /\ app_subst_list ML FE FE2' /\
   {appd FE1' FE2' FE'}

Subgoal 2 is:
 exists FE1' FE2', app_subst_list ML (X :: L1) FE1' /\
   app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'}

subst'_cappend_permute < apply app_subst'_list_nil1 to H1.
Subgoal 1:

Variables: ML FE FE'
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML FE FE'
H4 : app_subst_list ML nil nil
============================
 exists FE1' FE2', app_subst_list ML nil FE1' /\ app_subst_list ML FE FE2' /\
   {appd FE1' FE2' FE'}

Subgoal 2 is:
 exists FE1' FE2', app_subst_list ML (X :: L1) FE1' /\
   app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'}

subst'_cappend_permute < search.
Subgoal 2:

Variables: ML FE2 FE' L3 L1 X
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML (X :: L3) FE'
H4 : {appd L1 FE2 L3}*
============================
 exists FE1' FE2', app_subst_list ML (X :: L1) FE1' /\
   app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'}

subst'_cappend_permute < apply app_subst_list_comm1 to H2.
Subgoal 2:

Variables: ML FE2 L3 L1 X X' L'
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML (X :: L3) (X' :: L')
H4 : {appd L1 FE2 L3}*
H5 : app_subst ML X X'
H6 : app_subst_list ML L3 L'
============================
 exists FE1' FE2', app_subst_list ML (X :: L1) FE1' /\
   app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' (X' :: L')}

subst'_cappend_permute < apply IH to _ H6 H4.
Subgoal 2:

Variables: ML FE2 L3 L1 X X' L' FE1' FE2'
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML (X :: L3) (X' :: L')
H4 : {appd L1 FE2 L3}*
H5 : app_subst ML X X'
H6 : app_subst_list ML L3 L'
H7 : app_subst_list ML L1 FE1'
H8 : app_subst_list ML FE2 FE2'
H9 : {appd FE1' FE2' L'}
============================
 exists FE1' FE2', app_subst_list ML (X :: L1) FE1' /\
   app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' (X' :: L')}

subst'_cappend_permute < exists X' :: FE1'.
Subgoal 2:

Variables: ML FE2 L3 L1 X X' L' FE1' FE2'
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML (X :: L3) (X' :: L')
H4 : {appd L1 FE2 L3}*
H5 : app_subst ML X X'
H6 : app_subst_list ML L3 L'
H7 : app_subst_list ML L1 FE1'
H8 : app_subst_list ML FE2 FE2'
H9 : {appd FE1' FE2' L'}
============================
 exists FE2', app_subst_list ML (X :: L1) (X' :: FE1') /\
   app_subst_list ML FE2 FE2' /\ {appd (X' :: FE1') FE2' (X' :: L')}

subst'_cappend_permute < exists FE2'.
Subgoal 2:

Variables: ML FE2 L3 L1 X X' L' FE1' FE2'
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML (X :: L3) (X' :: L')
H4 : {appd L1 FE2 L3}*
H5 : app_subst ML X X'
H6 : app_subst_list ML L3 L'
H7 : app_subst_list ML L1 FE1'
H8 : app_subst_list ML FE2 FE2'
H9 : {appd FE1' FE2' L'}
============================
 app_subst_list ML (X :: L1) (X' :: FE1') /\ app_subst_list ML FE2 FE2' /\
   {appd (X' :: FE1') FE2' (X' :: L')}

subst'_cappend_permute < split.
Subgoal 2.1:

Variables: ML FE2 L3 L1 X X' L' FE1' FE2'
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML (X :: L3) (X' :: L')
H4 : {appd L1 FE2 L3}*
H5 : app_subst ML X X'
H6 : app_subst_list ML L3 L'
H7 : app_subst_list ML L1 FE1'
H8 : app_subst_list ML FE2 FE2'
H9 : {appd FE1' FE2' L'}
============================
 app_subst_list ML (X :: L1) (X' :: FE1')

Subgoal 2.2 is:
 app_subst_list ML FE2 FE2'

Subgoal 2.3 is:
 {appd (X' :: FE1') FE2' (X' :: L')}

subst'_cappend_permute < backchain app_subst_list_compose.
Subgoal 2.2:

Variables: ML FE2 L3 L1 X X' L' FE1' FE2'
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML (X :: L3) (X' :: L')
H4 : {appd L1 FE2 L3}*
H5 : app_subst ML X X'
H6 : app_subst_list ML L3 L'
H7 : app_subst_list ML L1 FE1'
H8 : app_subst_list ML FE2 FE2'
H9 : {appd FE1' FE2' L'}
============================
 app_subst_list ML FE2 FE2'

Subgoal 2.3 is:
 {appd (X' :: FE1') FE2' (X' :: L')}

subst'_cappend_permute < search.
Subgoal 2.3:

Variables: ML FE2 L3 L1 X X' L' FE1' FE2'
IH : forall ML FE FE1 FE2 FE', subst' ML -> app_subst_list ML FE FE' ->
       {appd FE1 FE2 FE}* ->
       (exists FE1' FE2', app_subst_list ML FE1 FE1' /\
            app_subst_list ML FE2 FE2' /\ {appd FE1' FE2' FE'})
H1 : subst' ML
H2 : app_subst_list ML (X :: L3) (X' :: L')
H4 : {appd L1 FE2 L3}*
H5 : app_subst ML X X'
H6 : app_subst_list ML L3 L'
H7 : app_subst_list ML L1 FE1'
H8 : app_subst_list ML FE2 FE2'
H9 : {appd FE1' FE2' L'}
============================
 {appd (X' :: FE1') FE2' (X' :: L')}

subst'_cappend_permute < search.
Proof completed.
Abella < Theorem tm'_list_to_tuple_typ_pres : 
forall L FE TE E, ctx' L -> {L |- of''_env FE TE} ->
  {tm'_list_to_tuple FE E} -> {L |- of' E TE}.


============================
 forall L FE TE E, ctx' L -> {L |- of''_env FE TE} ->
   {tm'_list_to_tuple FE E} -> {L |- of' E TE}

tm'_list_to_tuple_typ_pres < induction on 2.

IH : forall L FE TE E, ctx' L -> {L |- of''_env FE TE}* ->
       {tm'_list_to_tuple FE E} -> {L |- of' E TE}
============================
 forall L FE TE E, ctx' L -> {L |- of''_env FE TE}@ ->
   {tm'_list_to_tuple FE E} -> {L |- of' E TE}

tm'_list_to_tuple_typ_pres < intros.

Variables: L FE TE E
IH : forall L FE TE E, ctx' L -> {L |- of''_env FE TE}* ->
       {tm'_list_to_tuple FE E} -> {L |- of' E TE}
H1 : ctx' L
H2 : {L |- of''_env FE TE}@
H3 : {tm'_list_to_tuple FE E}
============================
 {L |- of' E TE}

tm'_list_to_tuple_typ_pres < case H2.
Subgoal 1:

Variables: L E
IH : forall L FE TE E, ctx' L -> {L |- of''_env FE TE}* ->
       {tm'_list_to_tuple FE E} -> {L |- of' E TE}
H1 : ctx' L
H3 : {tm'_list_to_tuple nil E}
============================
 {L |- of' E tunit}

Subgoal 2 is:
 {L |- of' E (prod T TE1)}

Subgoal 3 is:
 {L |- of' E TE}

tm'_list_to_tuple_typ_pres < case H3.
Subgoal 1:

Variables: L
IH : forall L FE TE E, ctx' L -> {L |- of''_env FE TE}* ->
       {tm'_list_to_tuple FE E} -> {L |- of' E TE}
H1 : ctx' L
============================
 {L |- of' unit' tunit}

Subgoal 2 is:
 {L |- of' E (prod T TE1)}

Subgoal 3 is:
 {L |- of' E TE}

tm'_list_to_tuple_typ_pres < search.
Subgoal 2:

Variables: L E TE1 ML T M
IH : forall L FE TE E, ctx' L -> {L |- of''_env FE TE}* ->
       {tm'_list_to_tuple FE E} -> {L |- of' E TE}
H1 : ctx' L
H3 : {tm'_list_to_tuple (M :: ML) E}
H4 : {L |- of' M T}*
H5 : {L |- of''_env ML TE1}*
============================
 {L |- of' E (prod T TE1)}

Subgoal 3 is:
 {L |- of' E TE}

tm'_list_to_tuple_typ_pres < case H3.
Subgoal 2:

Variables: L TE1 ML T M ML'
IH : forall L FE TE E, ctx' L -> {L |- of''_env FE TE}* ->
       {tm'_list_to_tuple FE E} -> {L |- of' E TE}
H1 : ctx' L
H4 : {L |- of' M T}*
H5 : {L |- of''_env ML TE1}*
H6 : {tm'_list_to_tuple ML ML'}
============================
 {L |- of' (pair' M ML') (prod T TE1)}

Subgoal 3 is:
 {L |- of' E TE}

tm'_list_to_tuple_typ_pres < apply IH to _ H5 H6.
Subgoal 2:

Variables: L TE1 ML T M ML'
IH : forall L FE TE E, ctx' L -> {L |- of''_env FE TE}* ->
       {tm'_list_to_tuple FE E} -> {L |- of' E TE}
H1 : ctx' L
H4 : {L |- of' M T}*
H5 : {L |- of''_env ML TE1}*
H6 : {tm'_list_to_tuple ML ML'}
H7 : {L |- of' ML' TE1}
============================
 {L |- of' (pair' M ML') (prod T TE1)}

Subgoal 3 is:
 {L |- of' E TE}

tm'_list_to_tuple_typ_pres < search.
Subgoal 3:

Variables: L FE TE E F
IH : forall L FE TE E, ctx' L -> {L |- of''_env FE TE}* ->
       {tm'_list_to_tuple FE E} -> {L |- of' E TE}
H1 : ctx' L
H3 : {tm'_list_to_tuple FE E}
H4 : {L, [F] |- of''_env FE TE}*
H5 : member F L
============================
 {L |- of' E TE}

tm'_list_to_tuple_typ_pres < apply ctx'_focus_inv to _ _ H4.
Proof completed.
Abella < Theorem tm'_list_append_val : 
forall L1 L2 L3, {tm'_list_val L1} -> {tm'_list_val L2} -> {appd L1 L2 L3} ->
  {tm'_list_val L3}.


============================
 forall L1 L2 L3, {tm'_list_val L1} -> {tm'_list_val L2} ->
   {appd L1 L2 L3} -> {tm'_list_val L3}

tm'_list_append_val < induction on 3.

IH : forall L1 L2 L3, {tm'_list_val L1} -> {tm'_list_val L2} ->
       {appd L1 L2 L3}* -> {tm'_list_val L3}
============================
 forall L1 L2 L3, {tm'_list_val L1} -> {tm'_list_val L2} ->
   {appd L1 L2 L3}@ -> {tm'_list_val L3}

tm'_list_append_val < intros.

Variables: L1 L2 L3
IH : forall L1 L2 L3, {tm'_list_val L1} -> {tm'_list_val L2} ->
       {appd L1 L2 L3}* -> {tm'_list_val L3}
H1 : {tm'_list_val L1}
H2 : {tm'_list_val L2}
H3 : {appd L1 L2 L3}@
============================
 {tm'_list_val L3}

tm'_list_append_val < case H3.
Subgoal 1:

Variables: L3
IH : forall L1 L2 L3, {tm'_list_val L1} -> {tm'_list_val L2} ->
       {appd L1 L2 L3}* -> {tm'_list_val L3}
H1 : {tm'_list_val nil}
H2 : {tm'_list_val L3}
============================
 {tm'_list_val L3}

Subgoal 2 is:
 {tm'_list_val (X :: L4)}

tm'_list_append_val < search.
Subgoal 2:

Variables: L2 L4 L6 X
IH : forall L1 L2 L3, {tm'_list_val L1} -> {tm'_list_val L2} ->
       {appd L1 L2 L3}* -> {tm'_list_val L3}
H1 : {tm'_list_val (X :: L6)}
H2 : {tm'_list_val L2}
H4 : {appd L6 L2 L4}*
============================
 {tm'_list_val (X :: L4)}

tm'_list_append_val < case H1.
Subgoal 2:

Variables: L2 L4 L6 X
IH : forall L1 L2 L3, {tm'_list_val L1} -> {tm'_list_val L2} ->
       {appd L1 L2 L3}* -> {tm'_list_val L3}
H2 : {tm'_list_val L2}
H4 : {appd L6 L2 L4}*
H5 : {val' X}
H6 : {tm'_list_val L6}
============================
 {tm'_list_val (X :: L4)}

tm'_list_append_val < apply IH to H6 H2 H4.
Subgoal 2:

Variables: L2 L4 L6 X
IH : forall L1 L2 L3, {tm'_list_val L1} -> {tm'_list_val L2} ->
       {appd L1 L2 L3}* -> {tm'_list_val L3}
H2 : {tm'_list_val L2}
H4 : {appd L6 L2 L4}*
H5 : {val' X}
H6 : {tm'_list_val L6}
H7 : {tm'_list_val L4}
============================
 {tm'_list_val (X :: L4)}

tm'_list_append_val < search.
Proof completed.
Abella < Theorem ch_env_val : 
forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')} -> {tm'_list_val FE}.


============================
 forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')} -> {tm'_list_val FE}

ch_env_val < induction on 2.

IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
============================
 forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}@ -> {tm'_list_val FE}

ch_env_val < intros.

Variables: L M FE M'
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H2 : {L |- ch M (htm FE M')}@
============================
 {tm'_list_val FE}

ch_env_val < case H2.
Subgoal 1:

Variables: L N
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
============================
 {tm'_list_val nil}

Subgoal 2 is:
 {tm'_list_val FE}

Subgoal 3 is:
 {tm'_list_val FE}

Subgoal 4 is:
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 2:

Variables: L FE M' M'1 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE M'1)}*
H4 : {L |- hconstr M'1 (x\pred' x) M'}*
============================
 {tm'_list_val FE}

Subgoal 3 is:
 {tm'_list_val FE}

Subgoal 4 is:
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 2:

Variables: L FE M' M'1 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE M'1)}*
H4 : {L |- hconstr M'1 (x\pred' x) M'}*
H5 : {tm'_list_val FE}
============================
 {tm'_list_val FE}

Subgoal 3 is:
 {tm'_list_val FE}

Subgoal 4 is:
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 3:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\plus' x y) M'}*
============================
 {tm'_list_val FE}

Subgoal 4 is:
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 3:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\plus' x y) M'}*
H7 : {tm'_list_val FE1}
============================
 {tm'_list_val FE}

Subgoal 4 is:
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H4.
Subgoal 3:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\plus' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
============================
 {tm'_list_val FE}

Subgoal 4 is:
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply cappend_str to _ H5.
Subgoal 3:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\plus' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
============================
 {tm'_list_val FE}

Subgoal 4 is:
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply tm'_list_append_val to H7 H8 H9.
Subgoal 3:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\plus' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
H10 : {tm'_list_val FE}
============================
 {tm'_list_val FE}

Subgoal 4 is:
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 4:

Variables: L FE M' M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- ch M3 (htm FE3 M3')}*
H6 : {L |- appd FE1 FE2 FE12}*
H7 : {L |- appd FE12 FE3 FE}*
H8 : {L |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
============================
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 4:

Variables: L FE M' M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- ch M3 (htm FE3 M3')}*
H6 : {L |- appd FE1 FE2 FE12}*
H7 : {L |- appd FE12 FE3 FE}*
H8 : {L |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H9 : {tm'_list_val FE1}
============================
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H4.
Subgoal 4:

Variables: L FE M' M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- ch M3 (htm FE3 M3')}*
H6 : {L |- appd FE1 FE2 FE12}*
H7 : {L |- appd FE12 FE3 FE}*
H8 : {L |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H9 : {tm'_list_val FE1}
H10 : {tm'_list_val FE2}
============================
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H5.
Subgoal 4:

Variables: L FE M' M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- ch M3 (htm FE3 M3')}*
H6 : {L |- appd FE1 FE2 FE12}*
H7 : {L |- appd FE12 FE3 FE}*
H8 : {L |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H9 : {tm'_list_val FE1}
H10 : {tm'_list_val FE2}
H11 : {tm'_list_val FE3}
============================
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply cappend_str to _ H6.
Subgoal 4:

Variables: L FE M' M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- ch M3 (htm FE3 M3')}*
H6 : {L |- appd FE1 FE2 FE12}*
H7 : {L |- appd FE12 FE3 FE}*
H8 : {L |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H9 : {tm'_list_val FE1}
H10 : {tm'_list_val FE2}
H11 : {tm'_list_val FE3}
H12 : {appd FE1 FE2 FE12}
============================
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply cappend_str to _ H7.
Subgoal 4:

Variables: L FE M' M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- ch M3 (htm FE3 M3')}*
H6 : {L |- appd FE1 FE2 FE12}*
H7 : {L |- appd FE12 FE3 FE}*
H8 : {L |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H9 : {tm'_list_val FE1}
H10 : {tm'_list_val FE2}
H11 : {tm'_list_val FE3}
H12 : {appd FE1 FE2 FE12}
H13 : {appd FE12 FE3 FE}
============================
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply tm'_list_append_val to H9 H10 H12.
Subgoal 4:

Variables: L FE M' M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- ch M3 (htm FE3 M3')}*
H6 : {L |- appd FE1 FE2 FE12}*
H7 : {L |- appd FE12 FE3 FE}*
H8 : {L |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H9 : {tm'_list_val FE1}
H10 : {tm'_list_val FE2}
H11 : {tm'_list_val FE3}
H12 : {appd FE1 FE2 FE12}
H13 : {appd FE12 FE3 FE}
H14 : {tm'_list_val FE12}
============================
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply tm'_list_append_val to H14 H11 H13.
Subgoal 4:

Variables: L FE M' M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- ch M3 (htm FE3 M3')}*
H6 : {L |- appd FE1 FE2 FE12}*
H7 : {L |- appd FE12 FE3 FE}*
H8 : {L |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H9 : {tm'_list_val FE1}
H10 : {tm'_list_val FE2}
H11 : {tm'_list_val FE3}
H12 : {appd FE1 FE2 FE12}
H13 : {appd FE12 FE3 FE}
H14 : {tm'_list_val FE12}
H15 : {tm'_list_val FE}
============================
 {tm'_list_val FE}

Subgoal 5 is:
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 5:

Variables: L
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
============================
 {tm'_list_val nil}

Subgoal 6 is:
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 6:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\pair' x y) M'}*
============================
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 6:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\pair' x y) M'}*
H7 : {tm'_list_val FE1}
============================
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H4.
Subgoal 6:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\pair' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
============================
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply cappend_str to _ H5.
Subgoal 6:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\pair' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
============================
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply tm'_list_append_val to H7 H8 H9.
Subgoal 6:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\pair' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
H10 : {tm'_list_val FE}
============================
 {tm'_list_val FE}

Subgoal 7 is:
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 7:

Variables: L FE M' R' M'1 FE2 FE1 R M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M'1)}*
H4 : {L, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
============================
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 7:

Variables: L FE M' R' M'1 FE2 FE1 R M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M'1)}*
H4 : {L, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H7 : {tm'_list_val FE1}
============================
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H4.
Subgoal 7:

Variables: L FE M' R' M'1 FE2 FE1 R M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M'1)}*
H4 : {L, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
============================
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply cappend_str to _ H5.
Subgoal 7:

Variables: L FE M' R' M'1 FE2 FE1 R M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M'1)}*
H4 : {L, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
============================
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply tm'_list_append_val to H7 H8 H9.
Subgoal 7:

Variables: L FE M' R' M'1 FE2 FE1 R M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M'1)}*
H4 : {L, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
H10 : {tm'_list_val FE}
============================
 {tm'_list_val FE}

Subgoal 8 is:
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 8:

Variables: L FE M' M'1 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE M'1)}*
H4 : {L |- hconstr M'1 (x\fst' x) M'}*
============================
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 8:

Variables: L FE M' M'1 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE M'1)}*
H4 : {L |- hconstr M'1 (x\fst' x) M'}*
H5 : {tm'_list_val FE}
============================
 {tm'_list_val FE}

Subgoal 9 is:
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 9:

Variables: L FE M' M'1 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE M'1)}*
H4 : {L |- hconstr M'1 (x\snd' x) M'}*
============================
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 9:

Variables: L FE M' M'1 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE M'1)}*
H4 : {L |- hconstr M'1 (x\snd' x) M'}*
H5 : {tm'_list_val FE}
============================
 {tm'_list_val FE}

Subgoal 10 is:
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 10:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\app' x y) M'}*
============================
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 10:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\app' x y) M'}*
H7 : {tm'_list_val FE1}
============================
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H4.
Subgoal 10:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\app' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
============================
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply cappend_str to _ H5.
Subgoal 10:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\app' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
============================
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply tm'_list_append_val to H7 H8 H9.
Subgoal 10:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\app' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
H10 : {tm'_list_val FE}
============================
 {tm'_list_val FE}

Subgoal 11 is:
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 11:

Variables: L F R'' R' FE1 R
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H4 : {L |- abstract R' R'' F}*
============================
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 11:

Variables: L F R'' R' FE1 R
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H4 : {L |- abstract R' R'' F}*
H5 : {tm'_list_val FE1}
============================
 {tm'_list_val (abs' (l\abs' (x\F l x)) :: FE1)}

Subgoal 12 is:
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 12:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\clos' x y) M'}*
============================
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 12:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\clos' x y) M'}*
H7 : {tm'_list_val FE1}
============================
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H4.
Subgoal 12:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\clos' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
============================
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply cappend_str to _ H5.
Subgoal 12:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\clos' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
============================
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply tm'_list_append_val to H7 H8 H9.
Subgoal 12:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |- hcombine M1' M2' (x\y\clos' x y) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
H10 : {tm'_list_val FE}
============================
 {tm'_list_val FE}

Subgoal 13 is:
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 13:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |-
        hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
============================
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H3.
Subgoal 13:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |-
        hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H7 : {tm'_list_val FE1}
============================
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply IH to _ H4.
Subgoal 13:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |-
        hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
============================
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply cappend_str to _ H5.
Subgoal 13:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |-
        hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
============================
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < apply tm'_list_append_val to H7 H8 H9.
Subgoal 13:

Variables: L FE M' M2' M1' FE2 FE1 M2 M1
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L |- ch M1 (htm FE1 M1')}*
H4 : {L |- ch M2 (htm FE2 M2')}*
H5 : {L |- appd FE1 FE2 FE}*
H6 : {L |-
        hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H7 : {tm'_list_val FE1}
H8 : {tm'_list_val FE2}
H9 : {appd FE1 FE2 FE}
H10 : {tm'_list_val FE}
============================
 {tm'_list_val FE}

Subgoal 14 is:
 {tm'_list_val FE}

ch_env_val < search.
Subgoal 14:

Variables: L M FE M' F
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L, [F] |- ch M (htm FE M')}*
H4 : member F L
============================
 {tm'_list_val FE}

ch_env_val < apply ch_ctx_mem to _ H4.
Subgoal 14:

Variables: L M FE M' X
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H3 : {L, [ch X (htm nil (hbase X))] |- ch M (htm FE M')}*
H4 : member (ch X (htm nil (hbase X))) L
H5 : name X
============================
 {tm'_list_val FE}

ch_env_val < case H3.
Subgoal 14:

Variables: L M
IH : forall L M FE M', ch_ctx L -> {L |- ch M (htm FE M')}* ->
       {tm'_list_val FE}
H1 : ch_ctx L
H4 : member (ch M (htm nil (hbase M))) L
H5 : name M
============================
 {tm'_list_val nil}

ch_env_val < search.
Proof completed.
Abella < Theorem app_subst'_list_val_pres : 
forall ML V V', {tm'_list_val V} -> app_subst_list ML V V' ->
  {tm'_list_val V'}.


============================
 forall ML V V', {tm'_list_val V} -> app_subst_list ML V V' ->
   {tm'_list_val V'}

app_subst'_list_val_pres < induction on 2.

IH : forall ML V V', {tm'_list_val V} -> app_subst_list ML V V' * ->
       {tm'_list_val V'}
============================
 forall ML V V', {tm'_list_val V} -> app_subst_list ML V V' @ ->
   {tm'_list_val V'}

app_subst'_list_val_pres < intros.

Variables: ML V V'
IH : forall ML V V', {tm'_list_val V} -> app_subst_list ML V V' * ->
       {tm'_list_val V'}
H1 : {tm'_list_val V}
H2 : app_subst_list ML V V' @
============================
 {tm'_list_val V'}

app_subst'_list_val_pres < case H2.
Subgoal 1:

Variables: V'
IH : forall ML V V', {tm'_list_val V} -> app_subst_list ML V V' * ->
       {tm'_list_val V'}
H1 : {tm'_list_val V'}
============================
 {tm'_list_val V'}

Subgoal 2 is:
 {tm'_list_val L'}

app_subst'_list_val_pres < search.
Subgoal 2:

Variables: V L' ML1 V1
IH : forall ML V V', {tm'_list_val V} -> app_subst_list ML V V' * ->
       {tm'_list_val V'}
H1 : {tm'_list_val (V n1)}
H3 : app_subst_list ML1 (V V1) L' *
============================
 {tm'_list_val L'}

app_subst'_list_val_pres <  inst H1 with n1 = V1.
Subgoal 2:

Variables: V L' ML1 V1
IH : forall ML V V', {tm'_list_val V} -> app_subst_list ML V V' * ->
       {tm'_list_val V'}
H1 : {tm'_list_val (V n1)}
H3 : app_subst_list ML1 (V V1) L' *
H4 : {tm'_list_val (V V1)}
============================
 {tm'_list_val L'}

app_subst'_list_val_pres < apply IH to _ H3.
Subgoal 2:

Variables: V L' ML1 V1
IH : forall ML V V', {tm'_list_val V} -> app_subst_list ML V V' * ->
       {tm'_list_val V'}
H1 : {tm'_list_val (V n1)}
H3 : app_subst_list ML1 (V V1) L' *
H4 : {tm'_list_val (V V1)}
H5 : {tm'_list_val L'}
============================
 {tm'_list_val L'}

app_subst'_list_val_pres < search.
Proof completed.
Abella < Theorem tm'_list_to_tuple_val_pres : 
forall FE E, {tm'_list_val FE} -> {tm'_list_to_tuple FE E} -> {val' E}.


============================
 forall FE E, {tm'_list_val FE} -> {tm'_list_to_tuple FE E} -> {val' E}

tm'_list_to_tuple_val_pres < induction on 2.

IH : forall FE E, {tm'_list_val FE} -> {tm'_list_to_tuple FE E}* -> {val' E}
============================
 forall FE E, {tm'_list_val FE} -> {tm'_list_to_tuple FE E}@ -> {val' E}

tm'_list_to_tuple_val_pres < intros.

Variables: FE E
IH : forall FE E, {tm'_list_val FE} -> {tm'_list_to_tuple FE E}* -> {val' E}
H1 : {tm'_list_val FE}
H2 : {tm'_list_to_tuple FE E}@
============================
 {val' E}

tm'_list_to_tuple_val_pres < case H2.
Subgoal 1:

IH : forall FE E, {tm'_list_val FE} -> {tm'_list_to_tuple FE E}* -> {val' E}
H1 : {tm'_list_val nil}
============================
 {val' unit'}

Subgoal 2 is:
 {val' (pair' M ML')}

tm'_list_to_tuple_val_pres < search.
Subgoal 2:

Variables: ML' ML M
IH : forall FE E, {tm'_list_val FE} -> {tm'_list_to_tuple FE E}* -> {val' E}
H1 : {tm'_list_val (M :: ML)}
H3 : {tm'_list_to_tuple ML ML'}*
============================
 {val' (pair' M ML')}

tm'_list_to_tuple_val_pres < case H1.
Subgoal 2:

Variables: ML' ML M
IH : forall FE E, {tm'_list_val FE} -> {tm'_list_to_tuple FE E}* -> {val' E}
H3 : {tm'_list_to_tuple ML ML'}*
H4 : {val' M}
H5 : {tm'_list_val ML}
============================
 {val' (pair' M ML')}

tm'_list_to_tuple_val_pres < apply IH to _ H3.
Subgoal 2:

Variables: ML' ML M
IH : forall FE E, {tm'_list_val FE} -> {tm'_list_to_tuple FE E}* -> {val' E}
H3 : {tm'_list_to_tuple ML ML'}*
H4 : {val' M}
H5 : {tm'_list_val ML}
H6 : {val' ML'}
============================
 {val' (pair' M ML')}

tm'_list_to_tuple_val_pres < search.
Proof completed.
Abella < Theorem ch_sem_pres : 
forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
  ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
  subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
  {CL |- ch M (htm FE M')} -> app_subst ML M P ->
  app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P').


============================
 forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
   ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
   subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
   {CL |- ch M (htm FE M')} -> app_subst ML M P ->
   app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')

ch_sem_pres < induction on 10.

IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
============================
 forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
   ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
   subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
   {CL |- ch M (htm FE M')}@ -> app_subst ML M P ->
   app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')

ch_sem_pres < intros.

Variables: L K CL ML ML' M M' T FE FE' P P' Vs
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H10 : {CL |- ch M (htm FE M')}@
H11 : app_subst ML M P
H12 : app_subst ML' (htm FE M') (htm FE' P')
============================
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H10.
Subgoal 1:

Variables: L K CL ML ML' T FE' P P' Vs N
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (nat' N) T}
H11 : app_subst ML (nat' N) P
H12 : app_subst ML' (htm nil (hbase (nat' N))) (htm FE' P')
============================
 sim_ch T K P (htm FE' P')

Subgoal 2 is:
 sim_ch T K P (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_closed_tm_eq to _ H11.
Subgoal 1:

Variables: L K CL ML ML' T FE' P' Vs N
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (nat' N) T}
H11 : app_subst ML (nat' N) (nat' N)
H12 : app_subst ML' (htm nil (hbase (nat' N))) (htm FE' P')
============================
 sim_ch T K (nat' N) (htm FE' P')

Subgoal 2 is:
 sim_ch T K P (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_closed_tm''_eq to _ H12.
Subgoal 1:

Variables: L K CL ML ML' T Vs N
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (nat' N) T}
H11 : app_subst ML (nat' N) (nat' N)
H12 : app_subst ML' (htm nil (hbase (nat' N))) (htm nil (hbase (nat' N)))
============================
 sim_ch T K (nat' N) (htm nil (hbase (nat' N)))

Subgoal 2 is:
 sim_ch T K P (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of'_nat_inv to _ H9.
Subgoal 1:

Variables: L K CL ML ML' Vs N
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (nat' N) tnat}
H11 : app_subst ML (nat' N) (nat' N)
H12 : app_subst ML' (htm nil (hbase (nat' N))) (htm nil (hbase (nat' N)))
============================
 sim_ch tnat K (nat' N) (htm nil (hbase (nat' N)))

Subgoal 2 is:
 sim_ch T K P (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_nat'.
Subgoal 2:

Variables: L K CL ML ML' M' T FE FE' P P' Vs M'1 M1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pred' M1) T}
H11 : app_subst ML (pred' M1) P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\pred' x) M'}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_pred_comm to H11.
Subgoal 2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M''
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pred' M1) T}
H11 : app_subst ML (pred' M1) (pred' M'')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\pred' x) M'}*
H15 : app_subst ML M1 M''
============================
 sim_ch T K (pred' M'') (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply hconstr_str to _ H14.
Subgoal 2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M''
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pred' M1) T}
H11 : app_subst ML (pred' M1) (pred' M'')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\pred' x) M'}*
H15 : app_subst ML M1 M''
H16 : {hconstr M'1 (x\pred' x) M'}
============================
 sim_ch T K (pred' M'') (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_hconstr_permute to _ H12 H16.
Subgoal 2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M'' P1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pred' M1) T}
H11 : app_subst ML (pred' M1) (pred' M'')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\pred' x) M'}*
H15 : app_subst ML M1 M''
H16 : {hconstr M'1 (x\pred' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\pred' x) P'}
============================
 sim_ch T K (pred' M'') (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 2.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M'1 M1 M'' P1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pred' M1) (pred' M'')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\pred' x) M'}*
H15 : app_subst ML M1 M''
H16 : {hconstr M'1 (x\pred' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\pred' x) P'}
H19 : {L |- of' M1 tnat}
============================
 sim_ch tnat K (pred' M'') (htm FE' P')

Subgoal 2.2 is:
 sim_ch T K (pred' M'') (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H19 H13 H15 H17.
Subgoal 2.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M'1 M1 M'' P1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pred' M1) (pred' M'')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\pred' x) M'}*
H15 : app_subst ML M1 M''
H16 : {hconstr M'1 (x\pred' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\pred' x) P'}
H19 : {L |- of' M1 tnat}
H20 : sim_ch tnat K M'' (htm FE' P1)
============================
 sim_ch tnat K (pred' M'') (htm FE' P')

Subgoal 2.2 is:
 sim_ch T K (pred' M'') (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_pred'.
Subgoal 2.2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M'' P1 F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pred' M1) (pred' M'')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\pred' x) M'}*
H15 : app_subst ML M1 M''
H16 : {hconstr M'1 (x\pred' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\pred' x) P'}
H19 : {L, [F] |- of' (pred' M1) T}
H20 : member F L
============================
 sim_ch T K (pred' M'') (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H19.
Subgoal 2.2:

Variables: L K CL ML ML' M' FE FE' P' Vs M'1 M1 M'' P1 F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pred' M1) (pred' M'')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\pred' x) M'}*
H15 : app_subst ML M1 M''
H16 : {hconstr M'1 (x\pred' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\pred' x) P'}
H19 : {L, [F] |- of' (pred' M1) T1}
H20 : member F L
H21 : name (pred' M1)
============================
 sim_ch T1 K (pred' M'') (htm FE' P')

Subgoal 3 is:
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H21.
Subgoal 3:

Variables: L K CL ML ML' M' T FE FE' P P' Vs M2' M1' FE2 FE1 M2 M1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (plus' M1 M2) T}
H11 : app_subst ML (plus' M1 M2) P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_plus_comm to H11.
Subgoal 3:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (plus' M1 M2) T}
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
============================
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_comm to H12.
Subgoal 3:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (plus' M1 M2) T}
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
============================
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply hcombine_str to _ H16.
Subgoal 3:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (plus' M1 M2) T}
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
============================
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply cappend_str to _ H15.
Subgoal 3:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (plus' M1 M2) T}
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
H22 : {appd FE1 FE2 FE}
============================
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_hcombine_permute to _ H20 H21.
Subgoal 3:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (plus' M1 M2) T}
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\plus' x y) P'}
============================
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_cappend_permute to _ H19 H22.
Subgoal 3:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (plus' M1 M2) T}
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\plus' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
============================
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H26 H23.
Subgoal 3:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (plus' M1 M2) T}
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\plus' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
============================
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H27 H24.
Subgoal 3:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (plus' M1 M2) T}
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\plus' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
============================
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 3.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\plus' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 tnat}
H32 : {L |- of' M2 tnat}
============================
 sim_ch tnat K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 3.2 is:
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H31 H13 H17 H29.
Subgoal 3.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\plus' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 tnat}
H32 : {L |- of' M2 tnat}
H33 : sim_ch tnat K M1'1 (htm FE1' M1'2)
============================
 sim_ch tnat K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 3.2 is:
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H32 H14 H18 H30.
Subgoal 3.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\plus' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 tnat}
H32 : {L |- of' M2 tnat}
H33 : sim_ch tnat K M1'1 (htm FE1' M1'2)
H34 : sim_ch tnat K M2'1 (htm FE2' M2'2)
============================
 sim_ch tnat K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 3.2 is:
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_plus'.
Subgoal 3.2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\plus' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L, [F] |- of' (plus' M1 M2) T}
H32 : member F L
============================
 sim_ch T K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H31.
Subgoal 3.2:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2' F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (plus' M1 M2) (plus' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\plus' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\plus' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\plus' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L, [F] |- of' (plus' M1 M2) T1}
H32 : member F L
H33 : name (plus' M1 M2)
============================
 sim_ch T1 K (plus' M1'1 M2'1) (htm FE' P')

Subgoal 4 is:
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H33.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3
           M2 M1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_ifz_comm to H11.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_comm to H12.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply hcombine3_str to _ H18.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply cappend_str to _ H16.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply cappend_str to _ H17.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_hcombine3_permute to _ H23 H24.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_cappend_permute to _ H22 H26.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_cappend_permute to _ H31 H25.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H34 H27.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H35 H28.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H32 H29.
Subgoal 4:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (ifz' M1 M2 M3) T}
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H40 H13 H19 H37.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H41 H14 H20 H38.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H42 H15 H21 H39.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
H45 : sim_ch T K M2'1 (htm FE2' M3'1)
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_to_tm'_ctx to H2 H4.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
H45 : sim_ch T K M2'1 (htm FE2' M3'1)
H46 : tm'_ctx SL
H47 : vars_of_tm'_ctx SL Vs
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst_equiv_ch_vars_of_subst' to H8 H4.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
H45 : sim_ch T K M2'1 (htm FE2' M3'1)
H46 : tm'_ctx SL
H47 : vars_of_tm'_ctx SL Vs
H48 : vars_of_subst' ML Vs
H49 : vars_of_subst' ML' Vs
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ch_typ_pres to _ _ _ _ H42 H15.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
H45 : sim_ch T K M2'1 (htm FE2' M3'1)
H46 : tm'_ctx SL
H47 : vars_of_tm'_ctx SL Vs
H48 : vars_of_subst' ML Vs
H49 : vars_of_subst' ML' Vs
H50 : {L |- of'' (htm FE3 M3') T}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of''_to_tm'' to _ _ H46 H47 H50.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
H45 : sim_ch T K M2'1 (htm FE2' M3'1)
H46 : tm'_ctx SL
H47 : vars_of_tm'_ctx SL Vs
H48 : vars_of_subst' ML Vs
H49 : vars_of_subst' ML' Vs
H50 : {L |- of'' (htm FE3 M3') T}
H51 : {SL |- tm'' (htm FE3 M3')}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_result_closed_tm'' to _ H51 _ _ H49 H39.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
H45 : sim_ch T K M2'1 (htm FE2' M3'1)
H46 : tm'_ctx SL
H47 : vars_of_tm'_ctx SL Vs
H48 : vars_of_subst' ML Vs
H49 : vars_of_subst' ML' Vs
H50 : {L |- of'' (htm FE3 M3') T}
H51 : {SL |- tm'' (htm FE3 M3')}
H52 : {tm'' (htm FE2' M3'1)}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ch_typ_pres to _ _ _ _ H41 H14.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
H45 : sim_ch T K M2'1 (htm FE2' M3'1)
H46 : tm'_ctx SL
H47 : vars_of_tm'_ctx SL Vs
H48 : vars_of_subst' ML Vs
H49 : vars_of_subst' ML' Vs
H50 : {L |- of'' (htm FE3 M3') T}
H51 : {SL |- tm'' (htm FE3 M3')}
H52 : {tm'' (htm FE2' M3'1)}
H53 : {L |- of'' (htm FE2 M2') T}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of''_to_tm'' to _ _ H46 H47 H53.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
H45 : sim_ch T K M2'1 (htm FE2' M3'1)
H46 : tm'_ctx SL
H47 : vars_of_tm'_ctx SL Vs
H48 : vars_of_subst' ML Vs
H49 : vars_of_subst' ML' Vs
H50 : {L |- of'' (htm FE3 M3') T}
H51 : {SL |- tm'' (htm FE3 M3')}
H52 : {tm'' (htm FE2' M3'1)}
H53 : {L |- of'' (htm FE2 M2') T}
H54 : {SL |- tm'' (htm FE2 M2')}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_result_closed_tm'' to _ H54 _ _ H49 H38.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
H45 : sim_ch T K M2'1 (htm FE2' M3'1)
H46 : tm'_ctx SL
H47 : vars_of_tm'_ctx SL Vs
H48 : vars_of_subst' ML Vs
H49 : vars_of_subst' ML' Vs
H50 : {L |- of'' (htm FE3 M3') T}
H51 : {SL |- tm'' (htm FE3 M3')}
H52 : {tm'' (htm FE2' M3'1)}
H53 : {L |- of'' (htm FE2 M2') T}
H54 : {SL |- tm'' (htm FE2 M2')}
H55 : {tm'' (htm FE2'1 M2'2)}
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_ifz' with FE2 = FE2'1, FE3 = FE2'.
Subgoal 4.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L |- of' M1 tnat}
H41 : {L |- of' M2 T}
H42 : {L |- of' M3 T}
H43 : sim_ch tnat K M'1 (htm FE1'1 M1'2)
H44 : sim_ch T K M1'1 (htm FE2'1 M2'2)
H45 : sim_ch T K M2'1 (htm FE2' M3'1)
H46 : tm'_ctx SL
H47 : vars_of_tm'_ctx SL Vs
H48 : vars_of_subst' ML Vs
H49 : vars_of_subst' ML' Vs
H50 : {L |- of'' (htm FE3 M3') T}
H51 : {SL |- tm'' (htm FE3 M3')}
H52 : {tm'' (htm FE2' M3'1)}
H53 : {L |- of'' (htm FE2 M2') T}
H54 : {SL |- tm'' (htm FE2 M2')}
H55 : {tm'' (htm FE2'1 M2'2)}
============================
 {is_cty T}

Subgoal 4.2 is:
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain of'_is_cty.
Subgoal 4.2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L, [F] |- of' (ifz' M1 M2 M3) T}
H41 : member F L
============================
 sim_ch T K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H40.
Subgoal 4.2:

Variables: L K CL ML ML' M' FE FE' P' Vs M3' M2' M1' FE3 FE12 FE2 FE1 M3 M2
           M1 M'1 M1'1 M2'1 M1'2 M2'2 M3'1 FE1' FE2' FE1'1 FE2'1 F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (ifz' M1 M2 M3) (ifz' M'1 M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- ch M3 (htm FE3 M3')}*
H16 : {CL |- appd FE1 FE2 FE12}*
H17 : {CL |- appd FE12 FE3 FE}*
H18 : {CL |- hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}*
H19 : app_subst ML M1 M'1
H20 : app_subst ML M2 M1'1
H21 : app_subst ML M3 M2'1
H22 : app_subst_list ML' FE FE'
H23 : app_subst ML' M' P'
H24 : {hcombine3 M1' M2' M3' (x\y\z\ifz' x y z) M'}
H25 : {appd FE1 FE2 FE12}
H26 : {appd FE12 FE3 FE}
H27 : app_subst ML' M1' M1'2
H28 : app_subst ML' M2' M2'2
H29 : app_subst ML' M3' M3'1
H30 : {hcombine3 M1'2 M2'2 M3'1 (x\y\z\ifz' x y z) P'}
H31 : app_subst_list ML' FE12 FE1'
H32 : app_subst_list ML' FE3 FE2'
H33 : {appd FE1' FE2' FE'}
H34 : app_subst_list ML' FE1 FE1'1
H35 : app_subst_list ML' FE2 FE2'1
H36 : {appd FE1'1 FE2'1 FE1'}
H37 : app_subst ML' (htm FE1 M1') (htm FE1'1 M1'2)
H38 : app_subst ML' (htm FE2 M2') (htm FE2'1 M2'2)
H39 : app_subst ML' (htm FE3 M3') (htm FE2' M3'1)
H40 : {L, [F] |- of' (ifz' M1 M2 M3) T1}
H41 : member F L
H42 : name (ifz' M1 M2 M3)
============================
 sim_ch T1 K (ifz' M'1 M1'1 M2'1) (htm FE' P')

Subgoal 5 is:
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H42.
Subgoal 5:

Variables: L K CL ML ML' T FE' P P' Vs
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' unit' T}
H11 : app_subst ML unit' P
H12 : app_subst ML' (htm nil (hbase unit')) (htm FE' P')
============================
 sim_ch T K P (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_closed_tm_eq to _ H11.
Subgoal 5:

Variables: L K CL ML ML' T FE' P' Vs
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' unit' T}
H11 : app_subst ML unit' unit'
H12 : app_subst ML' (htm nil (hbase unit')) (htm FE' P')
============================
 sim_ch T K unit' (htm FE' P')

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_closed_tm''_eq to _ H12.
Subgoal 5:

Variables: L K CL ML ML' T Vs
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' unit' T}
H11 : app_subst ML unit' unit'
H12 : app_subst ML' (htm nil (hbase unit')) (htm nil (hbase unit'))
============================
 sim_ch T K unit' (htm nil (hbase unit'))

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 5.1:

Variables: L K CL ML ML' Vs
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML unit' unit'
H12 : app_subst ML' (htm nil (hbase unit')) (htm nil (hbase unit'))
============================
 sim_ch tunit K unit' (htm nil (hbase unit'))

Subgoal 5.2 is:
 sim_ch T K unit' (htm nil (hbase unit'))

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_unit'.
Subgoal 5.2:

Variables: L K CL ML ML' T Vs F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML unit' unit'
H12 : app_subst ML' (htm nil (hbase unit')) (htm nil (hbase unit'))
H13 : {L, [F] |- of' unit' T}
H14 : member F L
============================
 sim_ch T K unit' (htm nil (hbase unit'))

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H13.
Subgoal 5.2:

Variables: L K CL ML ML' Vs F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML unit' unit'
H12 : app_subst ML' (htm nil (hbase unit')) (htm nil (hbase unit'))
H13 : {L, [F] |- of' unit' T1}
H14 : member F L
H15 : name unit'
============================
 sim_ch T1 K unit' (htm nil (hbase unit'))

Subgoal 6 is:
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H15.
Subgoal 6:

Variables: L K CL ML ML' M' T FE FE' P P' Vs M2' M1' FE2 FE1 M2 M1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pair' M1 M2) T}
H11 : app_subst ML (pair' M1 M2) P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_pair_comm to H11.
Subgoal 6:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pair' M1 M2) T}
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
============================
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_comm to H12.
Subgoal 6:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pair' M1 M2) T}
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
============================
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply hcombine_str to _ H16.
Subgoal 6:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pair' M1 M2) T}
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
============================
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply cappend_str to _ H15.
Subgoal 6:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pair' M1 M2) T}
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
============================
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_hcombine_permute to _ H20 H21.
Subgoal 6:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pair' M1 M2) T}
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
============================
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_cappend_permute to _ H19 H22.
Subgoal 6:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pair' M1 M2) T}
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
============================
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H26 H23.
Subgoal 6:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pair' M1 M2) T}
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
============================
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H27 H24.
Subgoal 6:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (pair' M1 M2) T}
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
============================
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 6.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2' T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 T1}
H32 : {L |- of' M2 T2}
============================
 sim_ch (prod T1 T2) K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 6.2 is:
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H31 H13 H17 H29.
Subgoal 6.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2' T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 T1}
H32 : {L |- of' M2 T2}
H33 : sim_ch T1 K M1'1 (htm FE1' M1'2)
============================
 sim_ch (prod T1 T2) K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 6.2 is:
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H32 H14 H18 H30.
Subgoal 6.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2' T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 T1}
H32 : {L |- of' M2 T2}
H33 : sim_ch T1 K M1'1 (htm FE1' M1'2)
H34 : sim_ch T2 K M2'1 (htm FE2' M2'2)
============================
 sim_ch (prod T1 T2) K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 6.2 is:
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_pair'.
Subgoal 6.1.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2' T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 T1}
H32 : {L |- of' M2 T2}
H33 : sim_ch T1 K M1'1 (htm FE1' M1'2)
H34 : sim_ch T2 K M2'1 (htm FE2' M2'2)
============================
 {is_cty T1}

Subgoal 6.1.2 is:
 {is_cty T2}

Subgoal 6.2 is:
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain of'_is_cty.
Subgoal 6.1.2:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2' T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 T1}
H32 : {L |- of' M2 T2}
H33 : sim_ch T1 K M1'1 (htm FE1' M1'2)
H34 : sim_ch T2 K M2'1 (htm FE2' M2'2)
============================
 {is_cty T2}

Subgoal 6.2 is:
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain of'_is_cty.
Subgoal 6.2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L, [F] |- of' (pair' M1 M2) T}
H32 : member F L
============================
 sim_ch T K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H31.
Subgoal 6.2:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2' F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (pair' M1 M2) (pair' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\pair' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\pair' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\pair' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L, [F] |- of' (pair' M1 M2) T1}
H32 : member F L
H33 : name (pair' M1 M2)
============================
 sim_ch T1 K (pair' M1'1 M2'1) (htm FE' P')

Subgoal 7 is:
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H33.
Subgoal 7:

Variables: L K CL ML ML' M' T FE FE' P P' Vs R' M'1 FE2 FE1 R M1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (let' M1 R) T}
H11 : app_subst ML (let' M1 R) P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_let_comm to H11.
Subgoal 7:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (let' M1 R) T}
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
============================
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_comm to H12.
Subgoal 7:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (let' M1 R) T}
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
============================
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply hcombine_abs_str to _ H16.
Subgoal 7:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (let' M1 R) T}
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
============================
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply cappend_str to _ H15.
Subgoal 7:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (let' M1 R) T}
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
============================
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_hcombine_abs_let_permute to H20 H21.
Subgoal 7:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (let' M1 R) T}
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
============================
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_cappend_permute to _ H19 H22.
Subgoal 7:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (let' M1 R) T}
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
============================
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H26 H23.
Subgoal 7:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (let' M1 R) T}
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
============================
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 7.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
============================
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H30 H13 H17 H29.
Subgoal 7.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 K M2 (htm FE1' M1')
============================
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < unfold.
Subgoal 7.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 K M2 (htm FE1' M1')
============================
 forall J V, le J K -> {nstep' J (let' M2 R1) V} -> {val' V} ->
   (exists V' N, {eval'' (htm FE' P') V'} /\ {add J N K} /\
        equiv_ch T N V V')

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < intros.
Subgoal 7.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 J V
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 K M2 (htm FE1' M1')
H33 : le J K
H34 : {nstep' J (let' M2 R1) V}
H35 : {val' V}
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add J N K} /\ equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply nstep'_let_inv to _ H34.
Subgoal 7.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 K M2 (htm FE1' M1')
H33 : le (s K3) K
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N K} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H33.
Subgoal 7.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 K M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H40 : {add (s K3) N K}
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N K} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H40.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply add_assoc to H36 H41.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply add_s to H43.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply sim_ch_nstep to H32 H37 _ H44.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of'_is_cty to _ H30.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert {is_nat N23}.
Subgoal 7.1.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
============================
 {is_nat N23}

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain add_arg2_isnat.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply equiv_ch_tm1 to _ _ H46.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply equiv_ch_tm2 to _ _ H46.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert app_subst (map n1 V1 :: ML) (R n1) (R1 V1).
Subgoal 7.1.2:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
============================
 app_subst (map n1 V1 :: ML) (R n1) (R1 V1)

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain explct_meta_subst'_comm with E = R1.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert app_subst (map n1 V' :: ML') (R' n1) (M2' V').
Subgoal 7.1.3:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
============================
 app_subst (map n1 V' :: ML') (R' n1) (M2' V')

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain explct_meta_subst'_comm with E = M2'.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert app_subst_list (map n1 V' :: ML') FE2 FE2'.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H53 H52.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H31 H14 H51 H54 with K = s N23.
Subgoal 7.1.4:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
============================
 subst_equiv_ch (of' n1 T1 :: L) (s N23) (map n1 V1 :: ML) (map n1 V' :: ML')

Subgoal 7.1.5 is:
 subst' (map n1 V' :: ML')

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < unfold.
Subgoal 7.1.4.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
============================
 equiv_ch T1 (s N23) V1 V'

Subgoal 7.1.4.2 is:
 subst_equiv_ch L (s N23) ML ML'

Subgoal 7.1.5 is:
 subst' (map n1 V' :: ML')

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < search.
Subgoal 7.1.4.2:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
============================
 subst_equiv_ch L (s N23) ML ML'

Subgoal 7.1.5 is:
 subst' (map n1 V' :: ML')

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain subst_equiv_ch_closed.
Subgoal 7.1.4.2:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
============================
 le (s N23) (s N3)

Subgoal 7.1.5 is:
 subst' (map n1 V' :: ML')

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < unfold.
Subgoal 7.1.4.2:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
============================
 exists N, {add (s N23) N (s N3)}

Subgoal 7.1.5 is:
 subst' (map n1 V' :: ML')

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < exists K1.
Subgoal 7.1.4.2:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
============================
 {add (s N23) K1 (s N3)}

Subgoal 7.1.5 is:
 subst' (map n1 V' :: ML')

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain add_comm.
Subgoal 7.1.5:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
============================
 subst' (map n1 V' :: ML')

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain subst'_extend.
Subgoal 7.1.5:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
============================
 {val' V'}

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain equiv_ch_val2 with V = V1, K = s N23.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply sim_ch_nstep to H55 H39 _ _ with I = s N.
Subgoal 7.1.6:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
============================
 {add K2 (s N) (s N23)}

Subgoal 7.1 is:
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain add_s.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
============================
 exists V' N, {eval'' (htm FE' P') V'} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < exists V'1.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
============================
 exists N, {eval'' (htm FE' P') V'1} /\ {add (s K3) N (s N3)} /\
   equiv_ch T N V V'1

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < exists N.
Subgoal 7.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
============================
 {eval'' (htm FE' P') V'1} /\ {add (s K3) N (s N3)} /\ equiv_ch T N V V'1

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < split.
Subgoal 7.1.7:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
============================
 {eval'' (htm FE' P') V'1}

Subgoal 7.1.8 is:
 {add (s K3) N (s N3)}

Subgoal 7.1.9 is:
 equiv_ch T N V V'1

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply eval''_let_fwd to H45 H56 H25 _ with M2 = M2'.
Subgoal 7.1.7:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
H58 : {eval'' (htm FE' P') V'1}
============================
 {eval'' (htm FE' P') V'1}

Subgoal 7.1.8 is:
 {add (s K3) N (s N3)}

Subgoal 7.1.9 is:
 equiv_ch T N V V'1

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < search.
Subgoal 7.1.8:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
============================
 {add (s K3) N (s N3)}

Subgoal 7.1.9 is:
 equiv_ch T N V V'1

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < search.
Subgoal 7.1.9:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
============================
 equiv_ch T N V V'1

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert {is_nat N}.
Subgoal 7.1.9.1:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
============================
 {is_nat N}

Subgoal 7.1.9 is:
 equiv_ch T N V V'1

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain add_arg2_isnat.
Subgoal 7.1.9:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
H58 : {is_nat N}
============================
 equiv_ch T N V V'1

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain equiv_ch_closed with K = s N.
Subgoal 7.1.9.2:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
H58 : {is_nat N}
============================
 {is_cty T}

Subgoal 7.1.9.3 is:
 le N (s N)

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain of'_is_cty.
Subgoal 7.1.9.3:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
H58 : {is_nat N}
============================
 le N (s N)

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < unfold.
Subgoal 7.1.9.3:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
H58 : {is_nat N}
============================
 exists N1, {add N N1 (s N)}

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < exists s z.
Subgoal 7.1.9.3:

Variables: L CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' T1 V K1 K2 K3 V1 N N3 N23 V' V'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat (s N3)}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L (s N3) ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L |- of' M1 T1}
H31 : {L, of' n1 T1 |- of' (R n1) T}
H32 : sim_ch T1 (s N3) M2 (htm FE1' M1')
H34 : {nstep' (s K3) (let' M2 R1) V}
H35 : {val' V}
H36 : {add K1 K2 K3}
H37 : {nstep' K1 M2 V1}
H38 : {val' V1}
H39 : {nstep' K2 (R1 V1) V}
H41 : {add K3 N N3}
H42 : {add K2 N N23}
H43 : {add K1 N23 N3}
H44 : {add K1 (s N23) (s N3)}
H45 : {eval'' (htm FE1' M1') V'}
H46 : equiv_ch T1 (s N23) V1 V'
H47 : {is_cty T1}
H48 : {is_nat N23}
H49 : {tm' V1}
H50 : {tm' V'}
H51 : app_subst (map n1 V1 :: ML) (R n1) (R1 V1)
H52 : app_subst (map n1 V' :: ML') (R' n1) (M2' V')
H53 : app_subst_list (map n1 V' :: ML') FE2 FE2'
H54 : app_subst (map n1 V' :: ML') (htm FE2 (R' n1)) (htm FE2' (M2' V'))
H55 : sim_ch T (s N23) (R1 V1) (htm FE2' (M2' V'))
H56 : {eval'' (htm FE2' (M2' V')) V'1}
H57 : equiv_ch T (s N) V V'1
H58 : {is_nat N}
============================
 {add N (s z) (s N)}

Subgoal 7.2 is:
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain add_comm.
Subgoal 7.2:

Variables: L K CL ML ML' M' T FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L, [F] |- of' (let' M1 R) T}
H31 : member F L
============================
 sim_ch T K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H30.
Subgoal 7.2:

Variables: L K CL ML ML' M' FE FE' P' Vs R' M'1 FE2 FE1 R M1 M2 R1 M1' M2'
           FE1' FE2' F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (let' M1 R) (let' M2 R1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M'1)}*
H14 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE2 (R' n1))}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine_abs M'1 R' (x\y\let' x y) M'}*
H17 : app_subst ML M1 M2
H18 : app_subst ML (R n1) (R1 n1)
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine_abs M'1 R' (x\y\let' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M'1 M1'
H24 : app_subst ML' (R' n1) (M2' n1)
H25 : {hcombine_abs M1' M2' (x\y\let' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M'1) (htm FE1' M1')
H30 : {L, [F] |- of' (let' M1 R) T1}
H31 : member F L
H32 : name (let' M1 R)
============================
 sim_ch T1 K (let' M2 R1) (htm FE' P')

Subgoal 8 is:
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H32.
Subgoal 8:

Variables: L K CL ML ML' M' T FE FE' P P' Vs M'1 M1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (fst' M1) T}
H11 : app_subst ML (fst' M1) P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\fst' x) M'}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_fst_comm to H11.
Subgoal 8:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (fst' M1) T}
H11 : app_subst ML (fst' M1) (fst' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\fst' x) M'}*
H15 : app_subst ML M1 M1'
============================
 sim_ch T K (fst' M1') (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply hconstr_str to _ H14.
Subgoal 8:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (fst' M1) T}
H11 : app_subst ML (fst' M1) (fst' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\fst' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\fst' x) M'}
============================
 sim_ch T K (fst' M1') (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_hconstr_permute to _ H12 H16.
Subgoal 8:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1' P1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (fst' M1) T}
H11 : app_subst ML (fst' M1) (fst' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\fst' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\fst' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\fst' x) P'}
============================
 sim_ch T K (fst' M1') (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 8.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1' P1 T2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (fst' M1) (fst' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\fst' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\fst' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\fst' x) P'}
H19 : {L |- of' M1 (prod T T2)}
============================
 sim_ch T K (fst' M1') (htm FE' P')

Subgoal 8.2 is:
 sim_ch T K (fst' M1') (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H19 H13 H15 H17.
Subgoal 8.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1' P1 T2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (fst' M1) (fst' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\fst' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\fst' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\fst' x) P'}
H19 : {L |- of' M1 (prod T T2)}
H20 : sim_ch (prod T T2) K M1' (htm FE' P1)
============================
 sim_ch T K (fst' M1') (htm FE' P')

Subgoal 8.2 is:
 sim_ch T K (fst' M1') (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_fst'.
Subgoal 8.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1' P1 T2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (fst' M1) (fst' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\fst' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\fst' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\fst' x) P'}
H19 : {L |- of' M1 (prod T T2)}
H20 : sim_ch (prod T T2) K M1' (htm FE' P1)
============================
 {is_cty (prod T T2)}

Subgoal 8.2 is:
 sim_ch T K (fst' M1') (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain of'_is_cty.
Subgoal 8.2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1' P1 F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (fst' M1) (fst' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\fst' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\fst' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\fst' x) P'}
H19 : {L, [F] |- of' (fst' M1) T}
H20 : member F L
============================
 sim_ch T K (fst' M1') (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H19.
Subgoal 8.2:

Variables: L K CL ML ML' M' FE FE' P' Vs M'1 M1 M1' P1 F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (fst' M1) (fst' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\fst' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\fst' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\fst' x) P'}
H19 : {L, [F] |- of' (fst' M1) T1}
H20 : member F L
H21 : name (fst' M1)
============================
 sim_ch T1 K (fst' M1') (htm FE' P')

Subgoal 9 is:
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H21.
Subgoal 9:

Variables: L K CL ML ML' M' T FE FE' P P' Vs M'1 M1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (snd' M1) T}
H11 : app_subst ML (snd' M1) P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\snd' x) M'}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_snd_comm to H11.
Subgoal 9:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (snd' M1) T}
H11 : app_subst ML (snd' M1) (snd' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\snd' x) M'}*
H15 : app_subst ML M1 M1'
============================
 sim_ch T K (snd' M1') (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply hconstr_str to _ H14.
Subgoal 9:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (snd' M1) T}
H11 : app_subst ML (snd' M1) (snd' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\snd' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\snd' x) M'}
============================
 sim_ch T K (snd' M1') (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_hconstr_permute to _ H12 H16.
Subgoal 9:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1' P1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (snd' M1) T}
H11 : app_subst ML (snd' M1) (snd' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\snd' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\snd' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\snd' x) P'}
============================
 sim_ch T K (snd' M1') (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 9.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1' P1 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (snd' M1) (snd' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\snd' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\snd' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\snd' x) P'}
H19 : {L |- of' M1 (prod T1 T)}
============================
 sim_ch T K (snd' M1') (htm FE' P')

Subgoal 9.2 is:
 sim_ch T K (snd' M1') (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H19 H13 H15 H17.
Subgoal 9.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1' P1 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (snd' M1) (snd' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\snd' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\snd' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\snd' x) P'}
H19 : {L |- of' M1 (prod T1 T)}
H20 : sim_ch (prod T1 T) K M1' (htm FE' P1)
============================
 sim_ch T K (snd' M1') (htm FE' P')

Subgoal 9.2 is:
 sim_ch T K (snd' M1') (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_snd' with T1 = T1.
Subgoal 9.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1' P1 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (snd' M1) (snd' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\snd' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\snd' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\snd' x) P'}
H19 : {L |- of' M1 (prod T1 T)}
H20 : sim_ch (prod T1 T) K M1' (htm FE' P1)
============================
 {is_cty (prod T1 T)}

Subgoal 9.2 is:
 sim_ch T K (snd' M1') (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain of'_is_cty.
Subgoal 9.2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M'1 M1 M1' P1 F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (snd' M1) (snd' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\snd' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\snd' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\snd' x) P'}
H19 : {L, [F] |- of' (snd' M1) T}
H20 : member F L
============================
 sim_ch T K (snd' M1') (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H19.
Subgoal 9.2:

Variables: L K CL ML ML' M' FE FE' P' Vs M'1 M1 M1' P1 F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (snd' M1) (snd' M1')
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE M'1)}*
H14 : {CL |- hconstr M'1 (x\snd' x) M'}*
H15 : app_subst ML M1 M1'
H16 : {hconstr M'1 (x\snd' x) M'}
H17 : app_subst ML' (htm FE M'1) (htm FE' P1)
H18 : {hconstr P1 (x\snd' x) P'}
H19 : {L, [F] |- of' (snd' M1) T1}
H20 : member F L
H21 : name (snd' M1)
============================
 sim_ch T1 K (snd' M1') (htm FE' P')

Subgoal 10 is:
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H21.
Subgoal 10:

Variables: L K CL ML ML' M' T FE FE' P P' Vs M2' M1' FE2 FE1 M2 M1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (app' M1 M2) T}
H11 : app_subst ML (app' M1 M2) P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_app_comm to H11.
Subgoal 10:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (app' M1 M2) T}
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_comm to H12.
Subgoal 10:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (app' M1 M2) T}
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply hcombine_str to _ H16.
Subgoal 10:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (app' M1 M2) T}
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply cappend_str to _ H15.
Subgoal 10:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (app' M1 M2) T}
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_hcombine_permute to _ H20 H21.
Subgoal 10:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (app' M1 M2) T}
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\app' x y) P'}
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_cappend_permute to _ H19 H22.
Subgoal 10:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (app' M1 M2) T}
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\app' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H26 H23.
Subgoal 10:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (app' M1 M2) T}
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\app' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H27 H24.
Subgoal 10:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (app' M1 M2) T}
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\app' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 10.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\app' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 (arr' T1 T)}
H32 : {L |- of' M2 T1}
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 10.2 is:
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H31 H13 H17 H29.
Subgoal 10.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\app' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 (arr' T1 T)}
H32 : {L |- of' M2 T1}
H33 : sim_ch (arr' T1 T) K M1'1 (htm FE1' M1'2)
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 10.2 is:
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H32 H14 H18 H30.
Subgoal 10.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\app' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 (arr' T1 T)}
H32 : {L |- of' M2 T1}
H33 : sim_ch (arr' T1 T) K M1'1 (htm FE1' M1'2)
H34 : sim_ch T1 K M2'1 (htm FE2' M2'2)
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 10.2 is:
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_app' with T1 = T1.
Subgoal 10.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\app' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 (arr' T1 T)}
H32 : {L |- of' M2 T1}
H33 : sim_ch (arr' T1 T) K M1'1 (htm FE1' M1'2)
H34 : sim_ch T1 K M2'1 (htm FE2' M2'2)
============================
 {is_cty (arr' T1 T)}

Subgoal 10.2 is:
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain of'_is_cty.
Subgoal 10.2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\app' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L, [F] |- of' (app' M1 M2) T}
H32 : member F L
============================
 sim_ch T K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H31.
Subgoal 10.2:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2' F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (app' M1 M2) (app' M1'1 M2'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\app' x y) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\app' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\app' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L, [F] |- of' (app' M1 M2) T1}
H32 : member F L
H33 : name (app' M1 M2)
============================
 sim_ch T1 K (app' M1'1 M2'1) (htm FE' P')

Subgoal 11 is:
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H33.
Subgoal 11:

Variables: L K CL ML ML' T FE' P P' Vs F R'' R' FE1 R
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) P
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm FE' P')
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_abs_comm to H11.
Subgoal 11:

Variables: L K CL ML ML' T FE' P' Vs F R'' R' FE1 R R'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm FE' P')
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
============================
 sim_ch T K (abs' R'1) (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_comm to H12.
Subgoal 11:

Variables: L K CL ML ML' T FE' P' Vs F R'' R' FE1 R R'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm FE' P')
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1) FE'
H17 : app_subst ML' (habs R'') P'
============================
 sim_ch T K (abs' R'1) (htm FE' P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst_list_comm1 to H16.
Subgoal 11:

Variables: L K CL ML ML' T P' Vs F R'' R' FE1 R R'1 X' L'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (X' :: L') P')
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1) (X' :: L')
H17 : app_subst ML' (habs R'') P'
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) X'
H19 : app_subst_list ML' FE1 L'
============================
 sim_ch T K (abs' R'1) (htm (X' :: L') P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_abs_comm to H18.
Subgoal 11:

Variables: L K CL ML ML' T P' Vs F R'' R' FE1 R R'1 L' R'2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' R'2 :: L') P')
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1) (abs' R'2 :: L')
H17 : app_subst ML' (habs R'') P'
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' R'2)
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (R'2 n1)
============================
 sim_ch T K (abs' R'1) (htm (abs' R'2 :: L') P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_abs_comm to H20.
Subgoal 11:

Variables: L K CL ML ML' T P' Vs F R'' R' FE1 R R'1 L' R'3
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') P')
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') P'
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
============================
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') P')

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_habs_comm to H17.
Subgoal 11:

Variables: L K CL ML ML' T Vs F R'' R' FE1 R R'1 L' R'3 R'4
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
============================
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply abstract_str to _ H14.
Subgoal 11:

Variables: L K CL ML ML' T Vs F R'' R' FE1 R R'1 L' R'3 R'4
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
============================
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert app_subst ML' (R'' n2) (R'4 n2).
Subgoal 11:

Variables: L K CL ML ML' T Vs F R'' R' FE1 R R'1 L' R'3 R'4
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
============================
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply abstract_permute to _ H24 H21 H23.
Subgoal 11:

Variables: L K CL ML ML' T Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
============================
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H19 H25.
Subgoal 11:

Variables: L K CL ML ML' T Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
============================
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9 (keep).
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' T1 T2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply is_cty_str to _ H29.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' T1 T2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ch_typ_pres to _ _ _ _ H28 H13.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' T1 T2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of''_to_alter_ver to _ H31.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply abstract_body_typ to _ _ H33 H23.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'' n1) (arr' T1 T2)}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of'_is_cty to _ H28.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'' n1) (arr' T1 T2)}
H35 : {is_cty T2}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of''_env_is_cty to _ H32.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'' n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs R'') (arr' T1 T2)}.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'' n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs R'') (arr' T1 T2)}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of''_body_to_tm'' to _ _ _ _ H37.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'' n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs R'') (arr' T1 T2)}
H38 : {tm''_body (habs R'')}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_habs_compose to H24.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'' n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs R'') (arr' T1 T2)}
H38 : {tm''_body (habs R'')}
H39 : app_subst ML' (habs (z2\R'' z2)) (habs (z2\R'4 z2))
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_closed_tm''_body_eq to H38 H39.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of''_env_tm'_list to _ H32.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert exists FE1', {tm'_list_to_tuple L' FE1'}.
Subgoal 11.1.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
============================
 exists FE1', {tm'_list_to_tuple L' FE1'}

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst_islist_trans to H40 H19.
Subgoal 11.1.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H41 : is_list L'
============================
 exists FE1', {tm'_list_to_tuple L' FE1'}

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain tm'_list_to_tuple_exists.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H41 : exists FE1', {tm'_list_to_tuple L' FE1'}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H41.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_to_tm'_ctx to H2 H4.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst_equiv_ch_vars_of_subst' to H8 H4.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1')).
Subgoal 11.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
============================
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert equiv_ch_arr' (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1')).
Subgoal 11.1.2.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
============================
 equiv_ch_arr' (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < unfold.
Subgoal 11.1.2.1.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
============================
 {tm' (abs' R'1)}

Subgoal 11.1.2.1.2 is:
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of'_to_tm' to _ _ _ _ H9.
Subgoal 11.1.2.1.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {SL |- tm' (abs' R)}
============================
 {tm' (abs' R'1)}

Subgoal 11.1.2.1.2 is:
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_result_closed_tm to _ H47 H44 _ H45 H11.
Subgoal 11.1.2.1.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {SL |- tm' (abs' R)}
H48 : {tm' (abs' R'1)}
============================
 {tm' (abs' R'1)}

Subgoal 11.1.2.1.2 is:
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < search.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply abstract_fun_typ to _ _ H33 H23.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply tm'_list_to_tuple_permute1 to _ _ H19 H42.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of''_env_str to _ _ H32.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply tm'_list_to_tuple_typ_pres to _ H50 H48.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
H51 : {L |- of' E TE}
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres <  inst H47 with n2 = E.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
H51 : {L |- of' E TE}
H52 : {L, of' E TE, of' n1 T1 |- of' (F E n1) T2}
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < cut H52 with H51.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
H51 : {L |- of' E TE}
H52 : {L, of' E TE, of' n1 T1 |- of' (F E n1) T2}
H53 : {L, of' n1 T1 |- of' (F E n1) T2}
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of'_to_tm' to _ _ _ _ H53 with Vs = n1 :: Vs.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
H51 : {L |- of' E TE}
H52 : {L, of' E TE, of' n1 T1 |- of' (F E n1) T2}
H53 : {L, of' n1 T1 |- of' (F E n1) T2}
H54 : {SL, tm' n1 |- tm' (F E n1)}
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert app_subst ML' (F E n1) (R'3 FE1' n1).
Subgoal 11.1.2.1.2.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
H51 : {L |- of' E TE}
H52 : {L, of' E TE, of' n1 T1 |- of' (F E n1) T2}
H53 : {L, of' n1 T1 |- of' (F E n1) T2}
H54 : {SL, tm' n1 |- tm' (F E n1)}
============================
 app_subst ML' (F E n1) (R'3 FE1' n1)

Subgoal 11.1.2.1.2 is:
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst_inst to H49 H21.
Subgoal 11.1.2.1.2.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
H51 : {L |- of' E TE}
H52 : {L, of' E TE, of' n1 T1 |- of' (F E n1) T2}
H53 : {L, of' n1 T1 |- of' (F E n1) T2}
H54 : {SL, tm' n1 |- tm' (F E n1)}
H55 : app_subst ML' (F E n2) (R'3 FE1' n2)
============================
 app_subst ML' (F E n1) (R'3 FE1' n1)

Subgoal 11.1.2.1.2 is:
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < search.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
H51 : {L |- of' E TE}
H52 : {L, of' E TE, of' n1 T1 |- of' (F E n1) T2}
H53 : {L, of' n1 T1 |- of' (F E n1) T2}
H54 : {SL, tm' n1 |- tm' (F E n1)}
H55 : app_subst ML' (F E n1) (R'3 FE1' n1)
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_abs_compose to H55.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
H51 : {L |- of' E TE}
H52 : {L, of' E TE, of' n1 T1 |- of' (F E n1) T2}
H53 : {L, of' n1 T1 |- of' (F E n1) T2}
H54 : {SL, tm' n1 |- tm' (F E n1)}
H55 : app_subst ML' (F E n1) (R'3 FE1' n1)
H56 : app_subst ML' (abs' (z2\F E z2)) (abs' (z2\R'3 FE1' z2))
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert {SL |- tm' (abs' (F E))}.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
H51 : {L |- of' E TE}
H52 : {L, of' E TE, of' n1 T1 |- of' (F E n1) T2}
H53 : {L, of' n1 T1 |- of' (F E n1) T2}
H54 : {SL, tm' n1 |- tm' (F E n1)}
H55 : app_subst ML' (F E n1) (R'3 FE1' n1)
H56 : app_subst ML' (abs' (z2\F E z2)) (abs' (z2\R'3 FE1' z2))
H57 : {SL |- tm' (abs' (F E))}
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_result_closed_tm to _ H57 H44 _ H46 H56.
Subgoal 11.1.2.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL E
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : {L, of' n2 TE, of' n1 T1 |- of' (F n2 n1) T2}
H48 : {tm'_list_to_tuple FE1 E}
H49 : app_subst ML' E FE1'
H50 : {L |- of''_env FE1 TE}
H51 : {L |- of' E TE}
H52 : {L, of' E TE, of' n1 T1 |- of' (F E n1) T2}
H53 : {L, of' n1 T1 |- of' (F E n1) T2}
H54 : {SL, tm' n1 |- tm' (F E n1)}
H55 : app_subst ML' (F E n1) (R'3 FE1' n1)
H56 : app_subst ML' (abs' (z2\F E z2)) (abs' (z2\R'3 FE1' z2))
H57 : {SL |- tm' (abs' (F E))}
H58 : {tm' (abs' (z2\R'3 FE1' z2))}
============================
 {tm' (abs' (R'3 FE1'))}

Subgoal 11.1.2.1.3 is:
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < search.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
============================
 forall J V V', lt J K -> equiv_ch T1 J V V' ->
   sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < intros.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
============================
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert {is_nat J}.
Subgoal 11.1.2.1.3.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
============================
 {is_nat J}

Subgoal 11.1.2.1.3 is:
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H47.
Subgoal 11.1.2.1.3.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V' N
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H48 : equiv_ch T1 J V V'
H49 : {add J (s N) K}
============================
 {is_nat J}

Subgoal 11.1.2.1.3 is:
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain add_arg1_isnat.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
============================
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply equiv_ch_tm1 to _ _ H48.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
============================
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply equiv_ch_tm2 to _ _ H48.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
============================
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply equiv_ch_val1 to _ _ H48.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
============================
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply equiv_ch_val2 to _ _ H48.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
============================
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML').
Subgoal 11.1.2.1.3.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
============================
 subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')

Subgoal 11.1.2.1.3 is:
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain subst_equiv_ch_extend.
Subgoal 11.1.2.1.3.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
============================
 subst_equiv_ch L J ML ML'

Subgoal 11.1.2.1.3 is:
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain subst_equiv_ch_closed.
Subgoal 11.1.2.1.3.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
============================
 le J K

Subgoal 11.1.2.1.3 is:
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain lt_to_le.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
============================
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert app_subst (map n1 V :: ML) (R n1) (R'1 V).
Subgoal 11.1.2.1.3.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
============================
 app_subst (map n1 V :: ML) (R n1) (R'1 V)

Subgoal 11.1.2.1.3 is:
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain explct_meta_subst'_comm with E = R'1.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
============================
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V')).
Subgoal 11.1.2.1.3.4:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
============================
 app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V'))

Subgoal 11.1.2.1.3 is:
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain explct_meta_subst'_comm with E = x\htm L' (R1' x).
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
H56 : app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V'))
============================
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ H54 H28 H13 H55 H56.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
H56 : app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V'))
H57 : sim_ch T2 J (R'1 V) (htm L' (R1' V'))
============================
 sim_ch T2 J (R'1 V) (htm nil (hbase (R'3 FE1' V')))

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_eval''_closed.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
H56 : app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V'))
H57 : sim_ch T2 J (R'1 V) (htm L' (R1' V'))
============================
 forall V, {eval'' (htm L' (R1' V')) V} ->
   {eval'' (htm nil (hbase (R'3 FE1' V'))) V}

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ch_env_val to _ H13.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
H56 : app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V'))
H57 : sim_ch T2 J (R'1 V) (htm L' (R1' V'))
H58 : {tm'_list_val FE1}
============================
 forall V, {eval'' (htm L' (R1' V')) V} ->
   {eval'' (htm nil (hbase (R'3 FE1' V'))) V}

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_list_val_pres to _ H19.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
H56 : app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V'))
H57 : sim_ch T2 J (R'1 V) (htm L' (R1' V'))
H58 : {tm'_list_val FE1}
H59 : {tm'_list_val L'}
============================
 forall V, {eval'' (htm L' (R1' V')) V} ->
   {eval'' (htm nil (hbase (R'3 FE1' V'))) V}

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply tm'_list_to_tuple_val_pres to _ H42.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
H56 : app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V'))
H57 : sim_ch T2 J (R'1 V) (htm L' (R1' V'))
H58 : {tm'_list_val FE1}
H59 : {tm'_list_val L'}
H60 : {val' FE1'}
============================
 forall V, {eval'' (htm L' (R1' V')) V} ->
   {eval'' (htm nil (hbase (R'3 FE1' V'))) V}

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply abstract_eval_fun to _ H26 H42 with V = V'.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
H56 : app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V'))
H57 : sim_ch T2 J (R'1 V) (htm L' (R1' V'))
H58 : {tm'_list_val FE1}
H59 : {tm'_list_val L'}
H60 : {val' FE1'}
H61 : forall V'1, {eval'' (htm L' (R1' V')) V'1} -> {eval' (R'3 FE1' V') V'1}
============================
 forall V, {eval'' (htm L' (R1' V')) V} ->
   {eval'' (htm nil (hbase (R'3 FE1' V'))) V}

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < intros.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V' V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
H56 : app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V'))
H57 : sim_ch T2 J (R'1 V) (htm L' (R1' V'))
H58 : {tm'_list_val FE1}
H59 : {tm'_list_val L'}
H60 : {val' FE1'}
H61 : forall V'1, {eval'' (htm L' (R1' V')) V'1} -> {eval' (R'3 FE1' V') V'1}
H62 : {eval'' (htm L' (R1' V')) V1}
============================
 {eval'' (htm nil (hbase (R'3 FE1' V'))) V1}

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply H61 to H62.
Subgoal 11.1.2.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V V' V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : lt J K
H48 : equiv_ch T1 J V V'
H49 : {is_nat J}
H50 : {tm' V}
H51 : {tm' V'}
H52 : {val' V}
H53 : {val' V'}
H54 : subst_equiv_ch (of' n1 T1 :: L) J (map n1 V :: ML) (map n1 V' :: ML')
H55 : app_subst (map n1 V :: ML) (R n1) (R'1 V)
H56 : app_subst (map n1 V' :: ML') (htm FE1 (R' n1)) (htm L' (R1' V'))
H57 : sim_ch T2 J (R'1 V) (htm L' (R1' V'))
H58 : {tm'_list_val FE1}
H59 : {tm'_list_val L'}
H60 : {val' FE1'}
H61 : forall V'1, {eval'' (htm L' (R1' V')) V'1} -> {eval' (R'3 FE1' V') V'1}
H62 : {eval'' (htm L' (R1' V')) V1}
H63 : {eval' (R'3 FE1' V') V1}
============================
 {eval'' (htm nil (hbase (R'3 FE1' V'))) V1}

Subgoal 11.1.2 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < search.
Subgoal 11.1.2:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch_arr' (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
============================
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.1 is:
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain equiv_ch_arr'_to_equiv_ch.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
============================
 sim_ch (arr' T1 T2) K (abs' R'1)
   (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < unfold.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
============================
 forall J V, le J K -> {nstep' J (abs' R'1) V} -> {val' V} ->
   (exists V' N, {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) V'} /\
        {add J N K} /\ equiv_ch (arr' T1 T2) N V V')

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < intros.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL J
           V
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le J K
H49 : {nstep' J (abs' R'1) V}
H50 : {val' V}
============================
 exists V' N, {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) V'} /\
   {add J N K} /\ equiv_ch (arr' T1 T2) N V V'

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply nstep'_val'_inv to _ H49.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
============================
 exists V' N, {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) V'} /\
   {add z N K} /\ equiv_ch (arr' T1 T2) N (abs' R'1) V'

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < exists abs' (R'3 FE1').
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
============================
 exists N, {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
              (abs' (R'3 FE1'))} /\
   {add z N K} /\ equiv_ch (arr' T1 T2) N (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < exists K.
Subgoal 11.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))} /\
   {add z K K} /\ equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < split.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of''_to_tm'' to _ _ _ _ H31 with Vs = n1 :: Vs.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply equiv_ch_tm1 to _ _ H47.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_habs_compose to H25.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < assert app_subst ML' (abs' R'1) (abs' R'1).
Subgoal 11.1.3.1:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
============================
 app_subst ML' (abs' R'1) (abs' R'1)

Subgoal 11.1.3 is:
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain subst'_closed_tm.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
H55 : app_subst ML' (abs' R'1) (abs' R'1)
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst_list_compose to H55 H19.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
H55 : app_subst ML' (abs' R'1) (abs' R'1)
H56 : app_subst_list ML' (abs' R'1 :: FE1) (abs' R'1 :: L')
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H56 H54.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
H55 : app_subst ML' (abs' R'1) (abs' R'1)
H56 : app_subst_list ML' (abs' R'1 :: FE1) (abs' R'1 :: L')
H57 : app_subst ML' (htm (abs' R'1 :: FE1) (habs (z2\R' z2)))
        (htm (abs' R'1 :: L') (habs (z2\R1' z2)))
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_result_closed_tm'' to _ H53 H44 _ H46 H57.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
H55 : app_subst ML' (abs' R'1) (abs' R'1)
H56 : app_subst_list ML' (abs' R'1 :: FE1) (abs' R'1 :: L')
H57 : app_subst ML' (htm (abs' R'1 :: FE1) (habs (z2\R' z2)))
        (htm (abs' R'1 :: L') (habs (z2\R1' z2)))
H58 : {tm'' (htm (abs' R'1 :: L') (habs (z2\R1' z2)))}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H58.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
H55 : app_subst ML' (abs' R'1) (abs' R'1)
H56 : app_subst_list ML' (abs' R'1 :: FE1) (abs' R'1 :: L')
H57 : app_subst ML' (htm (abs' R'1 :: FE1) (habs (z2\R' z2)))
        (htm (abs' R'1 :: L') (habs (z2\R1' z2)))
H59 : {tm' (abs' R'1)}
H60 : {tm' n1 |- tm'' (htm L' (R1' n1))}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ch_env_val to _ H13.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
H55 : app_subst ML' (abs' R'1) (abs' R'1)
H56 : app_subst_list ML' (abs' R'1 :: FE1) (abs' R'1 :: L')
H57 : app_subst ML' (htm (abs' R'1 :: FE1) (habs (z2\R' z2)))
        (htm (abs' R'1 :: L') (habs (z2\R1' z2)))
H59 : {tm' (abs' R'1)}
H60 : {tm' n1 |- tm'' (htm L' (R1' n1))}
H61 : {tm'_list_val FE1}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_list_val_pres to _ H19.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
H55 : app_subst ML' (abs' R'1) (abs' R'1)
H56 : app_subst_list ML' (abs' R'1 :: FE1) (abs' R'1 :: L')
H57 : app_subst ML' (htm (abs' R'1 :: FE1) (habs (z2\R' z2)))
        (htm (abs' R'1 :: L') (habs (z2\R1' z2)))
H59 : {tm' (abs' R'1)}
H60 : {tm' n1 |- tm'' (htm L' (R1' n1))}
H61 : {tm'_list_val FE1}
H62 : {tm'_list_val L'}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply tm'_list_to_tuple_val_pres to _ H42.
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
H55 : app_subst ML' (abs' R'1) (abs' R'1)
H56 : app_subst_list ML' (abs' R'1 :: FE1) (abs' R'1 :: L')
H57 : app_subst ML' (htm (abs' R'1 :: FE1) (habs (z2\R' z2)))
        (htm (abs' R'1 :: L') (habs (z2\R1' z2)))
H59 : {tm' (abs' R'1)}
H60 : {tm' n1 |- tm'' (htm L' (R1' n1))}
H61 : {tm'_list_val FE1}
H62 : {tm'_list_val L'}
H63 : {val' FE1'}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply abstract_eval_body to _ H60 H26 H42 _ with G = abs' (x\abs' (R'3 x)), V = abs' (R'3 FE1').
Subgoal 11.1.3:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
H51 : {SL, tm' n1 |- tm'' (htm FE1 (R' n1))}
H52 : {tm' (abs' R'1)}
H53 : {SL |- tm'' (htm (abs' R'1 :: FE1) (habs R'))}
H54 : app_subst ML' (habs (z2\R' z2)) (habs (z2\R1' z2))
H55 : app_subst ML' (abs' R'1) (abs' R'1)
H56 : app_subst_list ML' (abs' R'1 :: FE1) (abs' R'1 :: L')
H57 : app_subst ML' (htm (abs' R'1 :: FE1) (habs (z2\R' z2)))
        (htm (abs' R'1 :: L') (habs (z2\R1' z2)))
H59 : {tm' (abs' R'1)}
H60 : {tm' n1 |- tm'' (htm L' (R1' n1))}
H61 : {tm'_list_val FE1}
H62 : {tm'_list_val L'}
H63 : {val' FE1'}
H64 : {eval'' (htm L' (R'4 (abs' (x\abs' (R'3 x))))) (abs' (R'3 FE1'))}
============================
 {eval'' (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4)) (abs' (R'3 FE1'))}

Subgoal 11.1.4 is:
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < search.
Subgoal 11.1.4:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
============================
 {add z K K}

Subgoal 11.1.5 is:
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < search.
Subgoal 11.1.5:

Variables: L K CL ML ML' Vs F R' FE1 R R'1 L' R'3 R'4 R1' T1 T2 TE FE1' SL
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) (arr' T1 T2)}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs (z2\R'4 z2)))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' (z2\R'4 z2) F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs (z2\R'4 z2)) (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'4 n1) (R'4 n1)
H23 : {abstract R' (z2\R'4 z2) F}
H24 : app_subst ML' (R'4 n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, of' n1 T1 |- of' (R n1) T2}
H29 : {L |- is_cty T1}
H30 : {is_cty T1}
H31 : {L, of' n1 T1 |- of'' (htm FE1 (R' n1)) T2}
H32 : {L, of' n1 T1 |- of''_env FE1 TE}
H33 : {L, of' n1 T1 |- of''_body TE (R' n1) T2}
H34 : {of' n1 (arr' TE (arr' T1 T2)) |- of''_body TE (R'4 n1) (arr' T1 T2)}
H35 : {is_cty T2}
H36 : {is_cty TE}
H37 : {of''_body (prod (arr' TE (arr' T1 T2)) TE) (habs (z2\R'4 z2))
         (arr' T1 T2)}
H38 : {tm''_body (habs (z2\R'4 z2))}
H39 : app_subst ML' (habs (z2\R'4 z2)) (habs (z2\R'4 z2))
H40 : is_list FE1
H42 : {tm'_list_to_tuple L' FE1'}
H43 : tm'_ctx SL
H44 : vars_of_tm'_ctx SL Vs
H45 : vars_of_subst' ML Vs
H46 : vars_of_subst' ML' Vs
H47 : equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))
H48 : le z K
H49 : {nstep' z (abs' R'1) (abs' R'1)}
H50 : {val' (abs' R'1)}
============================
 equiv_ch (arr' T1 T2) K (abs' R'1) (abs' (R'3 FE1'))

Subgoal 11.2 is:
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < search.
Subgoal 11.2:

Variables: L K CL ML ML' T Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' F1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, [F1] |- of' (abs' R) T}
H29 : member F1 L
============================
 sim_ch T K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H28.
Subgoal 11.2:

Variables: L K CL ML ML' Vs F R'' R' FE1 R R'1 L' R'3 R'4 R1' F1 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (abs' R) T1}
H11 : app_subst ML (abs' R) (abs' R'1)
H12 : app_subst ML' (htm (abs' (l\abs' (x\F l x)) :: FE1) (habs R''))
        (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))
H13 : {CL, ch n1 (htm nil (hbase n1)) |- ch (R n1) (htm FE1 (R' n1))}*
H14 : {CL |- abstract R' R'' F}*
H15 : app_subst ML (R n1) (R'1 n1)
H16 : app_subst_list ML' (abs' (l\abs' (x\F l x)) :: FE1)
        (abs' (z1\abs' (R'3 z1)) :: L')
H17 : app_subst ML' (habs R'') (habs R'4)
H18 : app_subst ML' (abs' (l\abs' (x\F l x))) (abs' (z1\abs' (R'3 z1)))
H19 : app_subst_list ML' FE1 L'
H20 : app_subst ML' (abs' (x\F n1 x)) (abs' (R'3 n1))
H21 : app_subst ML' (F n1 n2) (R'3 n1 n2)
H22 : app_subst ML' (R'' n1) (R'4 n1)
H23 : {abstract R' R'' F}
H24 : app_subst ML' (R'' n2) (R'4 n2)
H25 : app_subst ML' (R' n1) (R1' n1)
H26 : {abstract R1' (z3\R'4 z3) (z3\z4\R'3 z3 z4)}
H27 : app_subst ML' (htm FE1 (R' n1)) (htm L' (R1' n1))
H28 : {L, [F1] |- of' (abs' R) T1}
H29 : member F1 L
H30 : name (abs' R)
============================
 sim_ch T1 K (abs' R'1) (htm (abs' (z1\abs' (R'3 z1)) :: L') (habs R'4))

Subgoal 12 is:
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H30.
Subgoal 12:

Variables: L K CL ML ML' M' T FE FE' P P' Vs M2' M1' FE2 FE1 M2 M1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (clos' M1 M2) T}
H11 : app_subst ML (clos' M1 M2) P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_clos_comm to H11.
Subgoal 12:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (clos' M1 M2) T}
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
============================
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_comm to H12.
Subgoal 12:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (clos' M1 M2) T}
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
============================
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply hcombine_str to _ H16.
Subgoal 12:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (clos' M1 M2) T}
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
============================
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply cappend_str to _ H15.
Subgoal 12:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (clos' M1 M2) T}
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
============================
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_hcombine_permute to _ H20 H21.
Subgoal 12:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (clos' M1 M2) T}
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
============================
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_cappend_permute to _ H19 H22.
Subgoal 12:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (clos' M1 M2) T}
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
============================
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H26 H23.
Subgoal 12:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (clos' M1 M2) T}
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
============================
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H27 H24.
Subgoal 12:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (clos' M1 M2) T}
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'1)
============================
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 12.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2' TL T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'1)
H31 : {L |- of' M1 (arr' (prod (arr T1 T2) (prod T1 TL)) T2)}
H32 : {L |- of' M2 TL}
============================
 sim_ch (arr T1 T2) K (clos' F' M1'1) (htm FE' P')

Subgoal 12.2 is:
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H31 H13 H17 H29.
Subgoal 12.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2' TL T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'1)
H31 : {L |- of' M1 (arr' (prod (arr T1 T2) (prod T1 TL)) T2)}
H32 : {L |- of' M2 TL}
H33 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F' (htm FE1' M1'2)
============================
 sim_ch (arr T1 T2) K (clos' F' M1'1) (htm FE' P')

Subgoal 12.2 is:
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H32 H14 H18 H30.
Subgoal 12.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2' TL T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'1)
H31 : {L |- of' M1 (arr' (prod (arr T1 T2) (prod T1 TL)) T2)}
H32 : {L |- of' M2 TL}
H33 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F' (htm FE1' M1'2)
H34 : sim_ch TL K M1'1 (htm FE2' M2'1)
============================
 sim_ch (arr T1 T2) K (clos' F' M1'1) (htm FE' P')

Subgoal 12.2 is:
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of'_is_cty to _ H31.
Subgoal 12.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2' TL T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'1)
H31 : {L |- of' M1 (arr' (prod (arr T1 T2) (prod T1 TL)) T2)}
H32 : {L |- of' M2 TL}
H33 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F' (htm FE1' M1'2)
H34 : sim_ch TL K M1'1 (htm FE2' M2'1)
H35 : {is_cty (arr' (prod (arr T1 T2) (prod T1 TL)) T2)}
============================
 sim_ch (arr T1 T2) K (clos' F' M1'1) (htm FE' P')

Subgoal 12.2 is:
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H35.
Subgoal 12.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2' TL T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'1)
H31 : {L |- of' M1 (arr' (prod (arr T1 T2) (prod T1 TL)) T2)}
H32 : {L |- of' M2 TL}
H33 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F' (htm FE1' M1'2)
H34 : sim_ch TL K M1'1 (htm FE2' M2'1)
H36 : {is_cty (prod (arr T1 T2) (prod T1 TL))}
H37 : {is_cty T2}
============================
 sim_ch (arr T1 T2) K (clos' F' M1'1) (htm FE' P')

Subgoal 12.2 is:
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H36.
Subgoal 12.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2' TL T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'1)
H31 : {L |- of' M1 (arr' (prod (arr T1 T2) (prod T1 TL)) T2)}
H32 : {L |- of' M2 TL}
H33 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F' (htm FE1' M1'2)
H34 : sim_ch TL K M1'1 (htm FE2' M2'1)
H37 : {is_cty T2}
H38 : {is_cty (arr T1 T2)}
H39 : {is_cty (prod T1 TL)}
============================
 sim_ch (arr T1 T2) K (clos' F' M1'1) (htm FE' P')

Subgoal 12.2 is:
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H39.
Subgoal 12.1:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2' TL T2 T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'1)
H31 : {L |- of' M1 (arr' (prod (arr T1 T2) (prod T1 TL)) T2)}
H32 : {L |- of' M2 TL}
H33 : sim_ch (arr' (prod (arr T1 T2) (prod T1 TL)) T2) K F' (htm FE1' M1'2)
H34 : sim_ch TL K M1'1 (htm FE2' M2'1)
H37 : {is_cty T2}
H38 : {is_cty (arr T1 T2)}
H40 : {is_cty T1}
H41 : {is_cty TL}
============================
 sim_ch (arr T1 T2) K (clos' F' M1'1) (htm FE' P')

Subgoal 12.2 is:
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_clos' with TL = TL.
Subgoal 12.2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2' F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'1)
H31 : {L, [F] |- of' (clos' M1 M2) T}
H32 : member F L
============================
 sim_ch T K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H31.
Subgoal 12.2:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 F' M1'1 M1'2
           M2'1 FE1' FE2' F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (clos' M1 M2) (clos' F' M1'1)
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |- hcombine M1' M2' (x\y\clos' x y) M'}*
H17 : app_subst ML M1 F'
H18 : app_subst ML M2 M1'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\clos' x y) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'1
H25 : {hcombine M1'2 M2'1 (x\y\clos' x y) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'1)
H31 : {L, [F] |- of' (clos' M1 M2) T1}
H32 : member F L
H33 : name (clos' M1 M2)
============================
 sim_ch T1 K (clos' F' M1'1) (htm FE' P')

Subgoal 13 is:
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H33.
Subgoal 13:

Variables: L K CL ML ML' M' T FE FE' P P' Vs M2' M1' FE2 FE1 M2 M1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T}
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
============================
 sim_ch T K P (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_open_comm to H11.
Subgoal 13:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T}
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_comm to H12.
Subgoal 13:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T}
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply hcombine_str to _ H16.
Subgoal 13:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T}
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply cappend_str to _ H15.
Subgoal 13:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T}
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_hcombine_permute to _ H20 H21.
Subgoal 13:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T}
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_cappend_permute to _ H19 H22.
Subgoal 13:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T}
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H26 H23.
Subgoal 13:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T}
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply app_subst'_htm_compose to H27 H24.
Subgoal 13:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T}
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H9.
Subgoal 13.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 (arr T1 T)}
H32 : {L |- of' M2 T1}
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 13.2 is:
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H31 H13 H17 H29.
Subgoal 13.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 (arr T1 T)}
H32 : {L |- of' M2 T1}
H33 : sim_ch (arr T1 T) K M1'1 (htm FE1' M1'2)
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 13.2 is:
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply IH to _ _ _ _ _ _ _ _ H32 H14 H18 H30.
Subgoal 13.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 (arr T1 T)}
H32 : {L |- of' M2 T1}
H33 : sim_ch (arr T1 T) K M1'1 (htm FE1' M1'2)
H34 : sim_ch T1 K M2'1 (htm FE2' M2'2)
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 13.2 is:
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply of'_is_cty to _ H31.
Subgoal 13.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 (arr T1 T)}
H32 : {L |- of' M2 T1}
H33 : sim_ch (arr T1 T) K M1'1 (htm FE1' M1'2)
H34 : sim_ch T1 K M2'1 (htm FE2' M2'2)
H35 : {is_cty (arr T1 T)}
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 13.2 is:
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H35.
Subgoal 13.1:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L |- of' M1 (arr T1 T)}
H32 : {L |- of' M2 T1}
H33 : sim_ch (arr T1 T) K M1'1 (htm FE1' M1'2)
H34 : sim_ch T1 K M2'1 (htm FE2' M2'2)
H36 : {is_cty T1}
H37 : {is_cty T}
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 13.2 is:
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < backchain sim_ch_open'.
Subgoal 13.2:

Variables: L K CL ML ML' M' T FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1
           M1'2 M2'2 FE1' FE2' F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L, [F] |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T}
H32 : member F L
============================
 sim_ch T K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_focus_inv to _ _ H31.
Subgoal 13.2:

Variables: L K CL ML ML' M' FE FE' P' Vs M2' M1' FE2 FE1 M2 M1 M1'1 M2'1 M1'2
           M2'2 FE1' FE2' F T1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H11 : app_subst ML (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
        (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL |- ch M1 (htm FE1 M1')}*
H14 : {CL |- ch M2 (htm FE2 M2')}*
H15 : {CL |- appd FE1 FE2 FE}*
H16 : {CL |-
         hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}*
H17 : app_subst ML M1 M1'1
H18 : app_subst ML M2 M2'1
H19 : app_subst_list ML' FE FE'
H20 : app_subst ML' M' P'
H21 : {hcombine M1' M2' (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) M'}
H22 : {appd FE1 FE2 FE}
H23 : app_subst ML' M1' M1'2
H24 : app_subst ML' M2' M2'2
H25 : {hcombine M1'2 M2'2 (x\y\open' x (f\e\app' f (pair' x (pair' y e)))) P'}
H26 : app_subst_list ML' FE1 FE1'
H27 : app_subst_list ML' FE2 FE2'
H28 : {appd FE1' FE2' FE'}
H29 : app_subst ML' (htm FE1 M1') (htm FE1' M1'2)
H30 : app_subst ML' (htm FE2 M2') (htm FE2' M2'2)
H31 : {L, [F] |- of' (open' M1 (f\e\app' f (pair' M1 (pair' M2 e)))) T1}
H32 : member F L
H33 : name (open' M1 (f\e\app' f (pair' M1 (pair' M2 e))))
============================
 sim_ch T1 K (open' M1'1 (f\e\app' f (pair' M1'1 (pair' M2'1 e))))
   (htm FE' P')

Subgoal 14 is:
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H33.
Subgoal 14:

Variables: L K CL ML ML' M M' T FE FE' P P' Vs F
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL, [F] |- ch M (htm FE M')}*
H14 : member F CL
============================
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ch_ctx_mem to H3 H14.
Subgoal 14:

Variables: L K CL ML ML' M M' T FE FE' P P' Vs X
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M P
H12 : app_subst ML' (htm FE M') (htm FE' P')
H13 : {CL, [ch X (htm nil (hbase X))] |- ch M (htm FE M')}*
H14 : member (ch X (htm nil (hbase X))) CL
H15 : name X
============================
 sim_ch T K P (htm FE' P')

ch_sem_pres < case H13.
Subgoal 14:

Variables: L K CL ML ML' M T FE' P P' Vs
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M P
H12 : app_subst ML' (htm nil (hbase M)) (htm FE' P')
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
============================
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply ctx'_var_mem to _ H9 _.
Subgoal 14:

Variables: L K CL ML ML' M T FE' P P' Vs
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M P
H12 : app_subst ML' (htm nil (hbase M)) (htm FE' P')
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
============================
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst_equiv_ch_mem to H8 H16.
Subgoal 14:

Variables: L K CL ML ML' M T FE' P P' Vs V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M P
H12 : app_subst ML' (htm nil (hbase M)) (htm FE' P')
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V V'
============================
 sim_ch T K P (htm FE' P')

ch_sem_pres < apply subst'_var_eq to _ H17 H11.
Subgoal 14:

Variables: L K CL ML ML' M T FE' P' Vs V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V
H12 : app_subst ML' (htm nil (hbase M)) (htm FE' P')
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V V'
============================
 sim_ch T K V (htm FE' P')

ch_sem_pres < apply app_subst'_htm_comm to H12.
Subgoal 14:

Variables: L K CL ML ML' M T FE' P' Vs V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V
H12 : app_subst ML' (htm nil (hbase M)) (htm FE' P')
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V V'
H20 : app_subst_list ML' nil FE'
H21 : app_subst ML' (hbase M) P'
============================
 sim_ch T K V (htm FE' P')

ch_sem_pres < apply app_subst_list_nil_comm to H20.
Subgoal 14:

Variables: L K CL ML ML' M T P' Vs V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V
H12 : app_subst ML' (htm nil (hbase M)) (htm nil P')
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) P'
============================
 sim_ch T K V (htm nil P')

ch_sem_pres < apply app_subst'_hbase_comm to H21.
Subgoal 14:

Variables: L K CL ML ML' M T Vs V V' M'1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase M'1))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase M'1)
H22 : app_subst ML' M M'1
============================
 sim_ch T K V (htm nil (hbase M'1))

ch_sem_pres < apply subst'_var_eq to _ H18 H22.
Subgoal 14:

Variables: L K CL ML ML' M T Vs V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
============================
 sim_ch T K V (htm nil (hbase V'))

ch_sem_pres < unfold.
Subgoal 14:

Variables: L K CL ML ML' M T Vs V V'
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
============================
 forall J V1, le J K -> {nstep' J V V1} -> {val' V1} ->
   (exists V'1 N, {eval'' (htm nil (hbase V')) V'1} /\ {add J N K} /\
        equiv_ch T N V1 V'1)

ch_sem_pres < intros.
Subgoal 14:

Variables: L K CL ML ML' M T Vs V V' J V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le J K
H24 : {nstep' J V V1}
H25 : {val' V1}
============================
 exists V'1 N, {eval'' (htm nil (hbase V')) V'1} /\ {add J N K} /\
   equiv_ch T N V1 V'1

ch_sem_pres < apply of'_is_cty to _ H9.
Subgoal 14:

Variables: L K CL ML ML' M T Vs V V' J V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le J K
H24 : {nstep' J V V1}
H25 : {val' V1}
H26 : {is_cty T}
============================
 exists V'1 N, {eval'' (htm nil (hbase V')) V'1} /\ {add J N K} /\
   equiv_ch T N V1 V'1

ch_sem_pres < apply equiv_ch_val1 to _ _ H19.
Subgoal 14:

Variables: L K CL ML ML' M T Vs V V' J V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le J K
H24 : {nstep' J V V1}
H25 : {val' V1}
H26 : {is_cty T}
H27 : {val' V}
============================
 exists V'1 N, {eval'' (htm nil (hbase V')) V'1} /\ {add J N K} /\
   equiv_ch T N V1 V'1

ch_sem_pres < apply nstep'_val'_inv to _ H24.
Subgoal 14:

Variables: L K CL ML ML' M T Vs V' V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V1
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V1) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V1 V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le z K
H24 : {nstep' z V1 V1}
H25 : {val' V1}
H26 : {is_cty T}
H27 : {val' V1}
============================
 exists V'1 N, {eval'' (htm nil (hbase V')) V'1} /\ {add z N K} /\
   equiv_ch T N V1 V'1

ch_sem_pres < exists V'.
Subgoal 14:

Variables: L K CL ML ML' M T Vs V' V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V1
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V1) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V1 V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le z K
H24 : {nstep' z V1 V1}
H25 : {val' V1}
H26 : {is_cty T}
H27 : {val' V1}
============================
 exists N, {eval'' (htm nil (hbase V')) V'} /\ {add z N K} /\
   equiv_ch T N V1 V'

ch_sem_pres < exists K.
Subgoal 14:

Variables: L K CL ML ML' M T Vs V' V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V1
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V1) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V1 V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le z K
H24 : {nstep' z V1 V1}
H25 : {val' V1}
H26 : {is_cty T}
H27 : {val' V1}
============================
 {eval'' (htm nil (hbase V')) V'} /\ {add z K K} /\ equiv_ch T K V1 V'

ch_sem_pres < split.
Subgoal 14.1:

Variables: L K CL ML ML' M T Vs V' V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V1
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V1) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V1 V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le z K
H24 : {nstep' z V1 V1}
H25 : {val' V1}
H26 : {is_cty T}
H27 : {val' V1}
============================
 {eval'' (htm nil (hbase V')) V'}

Subgoal 14.2 is:
 {add z K K}

Subgoal 14.3 is:
 equiv_ch T K V1 V'

ch_sem_pres < apply equiv_ch_val2 to _ _ H19.
Subgoal 14.1:

Variables: L K CL ML ML' M T Vs V' V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V1
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V1) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V1 V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le z K
H24 : {nstep' z V1 V1}
H25 : {val' V1}
H26 : {is_cty T}
H27 : {val' V1}
H28 : {val' V'}
============================
 {eval'' (htm nil (hbase V')) V'}

Subgoal 14.2 is:
 {add z K K}

Subgoal 14.3 is:
 equiv_ch T K V1 V'

ch_sem_pres < apply eval'_refl to H28.
Subgoal 14.1:

Variables: L K CL ML ML' M T Vs V' V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V1
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V1) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V1 V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le z K
H24 : {nstep' z V1 V1}
H25 : {val' V1}
H26 : {is_cty T}
H27 : {val' V1}
H28 : {val' V'}
H29 : {eval' V' V'}
============================
 {eval'' (htm nil (hbase V')) V'}

Subgoal 14.2 is:
 {add z K K}

Subgoal 14.3 is:
 equiv_ch T K V1 V'

ch_sem_pres < search.
Subgoal 14.2:

Variables: L K CL ML ML' M T Vs V' V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V1
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V1) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V1 V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le z K
H24 : {nstep' z V1 V1}
H25 : {val' V1}
H26 : {is_cty T}
H27 : {val' V1}
============================
 {add z K K}

Subgoal 14.3 is:
 equiv_ch T K V1 V'

ch_sem_pres < search.
Subgoal 14.3:

Variables: L K CL ML ML' M T Vs V' V1
IH : forall L K CL ML ML' M M' T FE FE' P P' Vs, {is_nat K} -> ctx' L ->
       ch_ctx CL -> vars_of_ctx' L Vs -> vars_of_ch_ctx CL Vs -> subst' ML ->
       subst' ML' -> subst_equiv_ch L K ML ML' -> {L |- of' M T} ->
       {CL |- ch M (htm FE M')}* -> app_subst ML M P ->
       app_subst ML' (htm FE M') (htm FE' P') -> sim_ch T K P (htm FE' P')
H1 : {is_nat K}
H2 : ctx' L
H3 : ch_ctx CL
H4 : vars_of_ctx' L Vs
H5 : vars_of_ch_ctx CL Vs
H6 : subst' ML
H7 : subst' ML'
H8 : subst_equiv_ch L K ML ML'
H9 : {L |- of' M T}
H11 : app_subst ML M V1
H12 : app_subst ML' (htm nil (hbase M)) (htm nil (hbase V'))
H14 : member (ch M (htm nil (hbase M))) CL
H15 : name M
H16 : member (of' M T) L
H17 : member (map M V1) ML
H18 : member (map M V') ML'
H19 : equiv_ch T K V1 V'
H20 : app_subst_list ML' nil nil
H21 : app_subst ML' (hbase M) (hbase V')
H22 : app_subst ML' M V'
H23 : le z K
H24 : {nstep' z V1 V1}
H25 : {val' V1}
H26 : {is_cty T}
H27 : {val' V1}
============================
 equiv_ch T K V1 V'

ch_sem_pres < search.
Proof completed.
Abella < Theorem ch_nat_sem_pres : 
forall M FE M' N, {of' M tnat} -> {ch M (htm FE M')} -> {eval' M (nat' N)} ->
  {eval'' (htm FE M') (nat' N)}.


============================
 forall M FE M' N, {of' M tnat} -> {ch M (htm FE M')} ->
   {eval' M (nat' N)} -> {eval'' (htm FE M') (nat' N)}

ch_nat_sem_pres < intros.

Variables: M FE M' N
H1 : {of' M tnat}
H2 : {ch M (htm FE M')}
H3 : {eval' M (nat' N)}
============================
 {eval'' (htm FE M') (nat' N)}

ch_nat_sem_pres < case H3.

Variables: M FE M' N N1
H1 : {of' M tnat}
H2 : {ch M (htm FE M')}
H4 : {nstep' N1 M (nat' N)}
H5 : {val' (nat' N)}
============================
 {eval'' (htm FE M') (nat' N)}

ch_nat_sem_pres < apply nstep'_is_nat to H4.

Variables: M FE M' N N1
H1 : {of' M tnat}
H2 : {ch M (htm FE M')}
H4 : {nstep' N1 M (nat' N)}
H5 : {val' (nat' N)}
H6 : {is_nat N1}
============================
 {eval'' (htm FE M') (nat' N)}

ch_nat_sem_pres < assert sim_ch tnat N1 M (htm FE M').
Subgoal 1:

Variables: M FE M' N N1
H1 : {of' M tnat}
H2 : {ch M (htm FE M')}
H4 : {nstep' N1 M (nat' N)}
H5 : {val' (nat' N)}
H6 : {is_nat N1}
============================
 sim_ch tnat N1 M (htm FE M')

Subgoal is:
 {eval'' (htm FE M') (nat' N)}

ch_nat_sem_pres < backchain ch_sem_pres with L = nil, ML = nil, ML' = nil, Vs = nil, M = M, M' = M', FE = FE.

Variables: M FE M' N N1
H1 : {of' M tnat}
H2 : {ch M (htm FE M')}
H4 : {nstep' N1 M (nat' N)}
H5 : {val' (nat' N)}
H6 : {is_nat N1}
H7 : sim_ch tnat N1 M (htm FE M')
============================
 {eval'' (htm FE M') (nat' N)}

ch_nat_sem_pres < apply sim_ch_nstep to H7 H4 _ _ with I = z.
Subgoal 2:

Variables: M FE M' N N1
H1 : {of' M tnat}
H2 : {ch M (htm FE M')}
H4 : {nstep' N1 M (nat' N)}
H5 : {val' (nat' N)}
H6 : {is_nat N1}
H7 : sim_ch tnat N1 M (htm FE M')
============================
 {add N1 z N1}

Subgoal is:
 {eval'' (htm FE M') (nat' N)}

ch_nat_sem_pres < backchain add_comm.

Variables: M FE M' N N1 V'
H1 : {of' M tnat}
H2 : {ch M (htm FE M')}
H4 : {nstep' N1 M (nat' N)}
H5 : {val' (nat' N)}
H6 : {is_nat N1}
H7 : sim_ch tnat N1 M (htm FE M')
H8 : {eval'' (htm FE M') V'}
H9 : equiv_ch tnat z (nat' N) V'
============================
 {eval'' (htm FE M') (nat' N)}

ch_nat_sem_pres < case H9.

Variables: M FE M' N N1
H1 : {of' M tnat}
H2 : {ch M (htm FE M')}
H4 : {nstep' N1 M (nat' N)}
H5 : {val' (nat' N)}
H6 : {is_nat N1}
H7 : sim_ch tnat N1 M (htm FE M')
H8 : {eval'' (htm FE M') (nat' N)}
============================
 {eval'' (htm FE M') (nat' N)}

ch_nat_sem_pres < search.
Proof completed.
Abella < Theorem cg_nat_sem_pres : 
forall M M' V, {of'' M tnat} -> {hcgen M M'} -> {eval'' M V} -> {eval'' M' V}.


============================
 forall M M' V, {of'' M tnat} -> {hcgen M M'} -> {eval'' M V} ->
   {eval'' M' V}

cg_nat_sem_pres < intros.

Variables: M M' V
H1 : {of'' M tnat}
H2 : {hcgen M M'}
H3 : {eval'' M V}
============================
 {eval'' M' V}

cg_nat_sem_pres < case H2.

Variables: V M1 FE
H1 : {of'' (htm FE M1) tnat}
H3 : {eval'' (htm FE M1) V}
============================
 {eval'' (htm FE M1) V}

cg_nat_sem_pres < search.
Proof completed.
Abella <