Welcome to Abella 2.0.5-dev
Abella < Specification "trans".
Reading specification "/home/yuting/Projects/svn_sparrow/compiler-correctness/website/wang-phd-thesis/code/./trans" (from "/home/yuting/Projects/svn_sparrow/compiler-correctness/website/wang-phd-thesis/code/.")

Abella < Import "typing".
Importing from /home/yuting/Projects/svn_sparrow/compiler-correctness/website/wang-phd-thesis/code/./typing

Abella < Define prune_ctx : (list tm) -> (list o) -> (list o) -> prop by 
prune_ctx nil L nil;
prune_ctx (X :: Vs) L (of X T :: L') := member (of X T) L /\ prune_ctx Vs L L'.

Abella < Define bvars : (list o) -> prop by 
bvars nil;
nabla x, bvars (notfree x :: L) := bvars L.

Abella < Define ctx_bvars : (list o) -> (list o) -> prop by 
ctx_bvars nil nil;
ctx_bvars (of X T :: L) (notfree X :: L') := ctx_bvars L L'.

Abella < Theorem bvars_mem : 
forall BVs E, bvars BVs -> member E BVs ->
  (exists X, E = notfree X /\ name X).


============================
 forall BVs E, bvars BVs -> member E BVs ->
   (exists X, E = notfree X /\ name X)

bvars_mem < induction on 2.

IH : forall BVs E, bvars BVs -> member E BVs * ->
       (exists X, E = notfree X /\ name X)
============================
 forall BVs E, bvars BVs -> member E BVs @ ->
   (exists X, E = notfree X /\ name X)

bvars_mem < intros.

Variables: BVs E
IH : forall BVs E, bvars BVs -> member E BVs * ->
       (exists X, E = notfree X /\ name X)
H1 : bvars BVs
H2 : member E BVs @
============================
 exists X, E = notfree X /\ name X

bvars_mem < case H2.
Subgoal 1:

Variables: E L
IH : forall BVs E, bvars BVs -> member E BVs * ->
       (exists X, E = notfree X /\ name X)
H1 : bvars (E :: L)
============================
 exists X, E = notfree X /\ name X

Subgoal 2 is:
 exists X, E = notfree X /\ name X

bvars_mem < case H1.
Subgoal 1:

Variables: L1
IH : forall BVs E, bvars BVs -> member E BVs * ->
       (exists X, E = notfree X /\ name X)
H3 : bvars L1
============================
 exists X, notfree n1 = notfree X /\ name X

Subgoal 2 is:
 exists X, E = notfree X /\ name X

bvars_mem < search.
Subgoal 2:

Variables: E L B
IH : forall BVs E, bvars BVs -> member E BVs * ->
       (exists X, E = notfree X /\ name X)
H1 : bvars (B :: L)
H3 : member E L *
============================
 exists X, E = notfree X /\ name X

bvars_mem < case H1.
Subgoal 2:

Variables: E L1
IH : forall BVs E, bvars BVs -> member E BVs * ->
       (exists X, E = notfree X /\ name X)
H3 : member (E n1) L1 *
H4 : bvars L1
============================
 exists X, E n1 = notfree X /\ name X

bvars_mem < backchain IH.
Proof completed.
Abella < Theorem prune_ctx_mem_rev : 
forall FVs L L' A, prune_ctx FVs L L' -> member A L' -> member A L.


============================
 forall FVs L L' A, prune_ctx FVs L L' -> member A L' -> member A L

prune_ctx_mem_rev < induction on 1.

IH : forall FVs L L' A, prune_ctx FVs L L' * -> member A L' -> member A L
============================
 forall FVs L L' A, prune_ctx FVs L L' @ -> member A L' -> member A L

prune_ctx_mem_rev < intros.

Variables: FVs L L' A
IH : forall FVs L L' A, prune_ctx FVs L L' * -> member A L' -> member A L
H1 : prune_ctx FVs L L' @
H2 : member A L'
============================
 member A L

prune_ctx_mem_rev < case H1.
Subgoal 1:

Variables: L A
IH : forall FVs L L' A, prune_ctx FVs L L' * -> member A L' -> member A L
H2 : member A nil
============================
 member A L

Subgoal 2 is:
 member A L

prune_ctx_mem_rev < case H2.
Subgoal 2:

Variables: L A L'1 T X Vs
IH : forall FVs L L' A, prune_ctx FVs L L' * -> member A L' -> member A L
H2 : member A (of X T :: L'1)
H3 : member (of X T) L
H4 : prune_ctx Vs L L'1 *
============================
 member A L

prune_ctx_mem_rev < case H2.
Subgoal 2.1:

Variables: L L'1 T X Vs
IH : forall FVs L L' A, prune_ctx FVs L L' * -> member A L' -> member A L
H3 : member (of X T) L
H4 : prune_ctx Vs L L'1 *
============================
 member (of X T) L

Subgoal 2.2 is:
 member A L

prune_ctx_mem_rev < search.
Subgoal 2.2:

Variables: L A L'1 T X Vs
IH : forall FVs L L' A, prune_ctx FVs L L' * -> member A L' -> member A L
H3 : member (of X T) L
H4 : prune_ctx Vs L L'1 *
H5 : member A L'1
============================
 member A L

prune_ctx_mem_rev < apply IH to H4 _.
Subgoal 2.2:

Variables: L A L'1 T X Vs
IH : forall FVs L L' A, prune_ctx FVs L L' * -> member A L' -> member A L
H3 : member (of X T) L
H4 : prune_ctx Vs L L'1 *
H5 : member A L'1
H6 : member A L
============================
 member A L

prune_ctx_mem_rev < search.
Proof completed.
Abella < Theorem prune_ctx_pres : 
forall FVs L L', ctx L -> prune_ctx FVs L L' -> ctx L'.


============================
 forall FVs L L', ctx L -> prune_ctx FVs L L' -> ctx L'

prune_ctx_pres < induction on 2.

IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
============================
 forall FVs L L', ctx L -> prune_ctx FVs L L' @ -> ctx L'

prune_ctx_pres < intros.

Variables: FVs L L'
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
H2 : prune_ctx FVs L L' @
============================
 ctx L'

prune_ctx_pres < case H2.
Subgoal 1:

Variables: L
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
============================
 ctx nil

Subgoal 2 is:
 ctx (of X T :: L'1)

prune_ctx_pres < search.
Subgoal 2:

Variables: L L'1 T X Vs
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
H3 : member (of X T) L
H4 : prune_ctx Vs L L'1 *
============================
 ctx (of X T :: L'1)

prune_ctx_pres < apply IH to _ H4.
Subgoal 2:

Variables: L L'1 T X Vs
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
H3 : member (of X T) L
H4 : prune_ctx Vs L L'1 *
H5 : ctx L'1
============================
 ctx (of X T :: L'1)

prune_ctx_pres < apply ctx_mem to _ H3.
Subgoal 2:

Variables: L L'1 Vs X1 T1
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
H3 : member (of X1 T1) L
H4 : prune_ctx Vs L L'1 *
H5 : ctx L'1
H6 : name X1
H7 : {is_sty T1}
============================
 ctx (of X1 T1 :: L'1)

prune_ctx_pres < unfold.
Subgoal 2.1:

Variables: L L'1 Vs X1 T1
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
H3 : member (of X1 T1) L
H4 : prune_ctx Vs L L'1 *
H5 : ctx L'1
H6 : name X1
H7 : {is_sty T1}
============================
 ctx L'1

Subgoal 2.2 is:
 name X1

Subgoal 2.3 is:
 {is_sty T1}

Subgoal 2.4 is:
 forall T', member (of X1 T') L'1 -> T1 = T'

prune_ctx_pres < search.
Subgoal 2.2:

Variables: L L'1 Vs X1 T1
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
H3 : member (of X1 T1) L
H4 : prune_ctx Vs L L'1 *
H5 : ctx L'1
H6 : name X1
H7 : {is_sty T1}
============================
 name X1

Subgoal 2.3 is:
 {is_sty T1}

Subgoal 2.4 is:
 forall T', member (of X1 T') L'1 -> T1 = T'

prune_ctx_pres < search.
Subgoal 2.3:

Variables: L L'1 Vs X1 T1
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
H3 : member (of X1 T1) L
H4 : prune_ctx Vs L L'1 *
H5 : ctx L'1
H6 : name X1
H7 : {is_sty T1}
============================
 {is_sty T1}

Subgoal 2.4 is:
 forall T', member (of X1 T') L'1 -> T1 = T'

prune_ctx_pres < search.
Subgoal 2.4:

Variables: L L'1 Vs X1 T1
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
H3 : member (of X1 T1) L
H4 : prune_ctx Vs L L'1 *
H5 : ctx L'1
H6 : name X1
H7 : {is_sty T1}
============================
 forall T', member (of X1 T') L'1 -> T1 = T'

prune_ctx_pres < intros.
Subgoal 2.4:

Variables: L L'1 Vs X1 T1 T'
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
H3 : member (of X1 T1) L
H4 : prune_ctx Vs L L'1 *
H5 : ctx L'1
H6 : name X1
H7 : {is_sty T1}
H8 : member (of X1 T') L'1
============================
 T1 = T'

prune_ctx_pres < apply prune_ctx_mem_rev to H4 H8.
Subgoal 2.4:

Variables: L L'1 Vs X1 T1 T'
IH : forall FVs L L', ctx L -> prune_ctx FVs L L' * -> ctx L'
H1 : ctx L
H3 : member (of X1 T1) L
H4 : prune_ctx Vs L L'1 *
H5 : ctx L'1
H6 : name X1
H7 : {is_sty T1}
H8 : member (of X1 T') L'1
H9 : member (of X1 T') L
============================
 T1 = T'

prune_ctx_pres < backchain ctx_mem_sync.
Proof completed.
Abella < Theorem prune_ctx_vars_of : 
forall FVs L L', prune_ctx FVs L L' -> vars_of_ctx L' FVs.


============================
 forall FVs L L', prune_ctx FVs L L' -> vars_of_ctx L' FVs

prune_ctx_vars_of < induction on 1.

IH : forall FVs L L', prune_ctx FVs L L' * -> vars_of_ctx L' FVs
============================
 forall FVs L L', prune_ctx FVs L L' @ -> vars_of_ctx L' FVs

prune_ctx_vars_of < intros.

Variables: FVs L L'
IH : forall FVs L L', prune_ctx FVs L L' * -> vars_of_ctx L' FVs
H1 : prune_ctx FVs L L' @
============================
 vars_of_ctx L' FVs

prune_ctx_vars_of < case H1.
Subgoal 1:

Variables: L
IH : forall FVs L L', prune_ctx FVs L L' * -> vars_of_ctx L' FVs
============================
 vars_of_ctx nil nil

Subgoal 2 is:
 vars_of_ctx (of X T :: L'1) (X :: Vs)

prune_ctx_vars_of < search.
Subgoal 2:

Variables: L L'1 T X Vs
IH : forall FVs L L', prune_ctx FVs L L' * -> vars_of_ctx L' FVs
H2 : member (of X T) L
H3 : prune_ctx Vs L L'1 *
============================
 vars_of_ctx (of X T :: L'1) (X :: Vs)

prune_ctx_vars_of < apply IH to H3.
Subgoal 2:

Variables: L L'1 T X Vs
IH : forall FVs L L', prune_ctx FVs L L' * -> vars_of_ctx L' FVs
H2 : member (of X T) L
H3 : prune_ctx Vs L L'1 *
H4 : vars_of_ctx L'1 Vs
============================
 vars_of_ctx (of X T :: L'1) (X :: Vs)

prune_ctx_vars_of < search.
Proof completed.
Abella < Theorem ctx_bvars_sync : 
forall X L Ps, ctx_bvars L Ps -> member (notfree X) Ps ->
  (exists T, member (of X T) L).


============================
 forall X L Ps, ctx_bvars L Ps -> member (notfree X) Ps ->
   (exists T, member (of X T) L)

ctx_bvars_sync < induction on 2.

IH : forall X L Ps, ctx_bvars L Ps -> member (notfree X) Ps * ->
       (exists T, member (of X T) L)
============================
 forall X L Ps, ctx_bvars L Ps -> member (notfree X) Ps @ ->
   (exists T, member (of X T) L)

ctx_bvars_sync < intros.

Variables: X L Ps
IH : forall X L Ps, ctx_bvars L Ps -> member (notfree X) Ps * ->
       (exists T, member (of X T) L)
H1 : ctx_bvars L Ps
H2 : member (notfree X) Ps @
============================
 exists T, member (of X T) L

ctx_bvars_sync < case H2.
Subgoal 1:

Variables: X L L1
IH : forall X L Ps, ctx_bvars L Ps -> member (notfree X) Ps * ->
       (exists T, member (of X T) L)
H1 : ctx_bvars L (notfree X :: L1)
============================
 exists T, member (of X T) L

Subgoal 2 is:
 exists T, member (of X T) L

ctx_bvars_sync < case H1.
Subgoal 1:

Variables: X L1 L2 T
IH : forall X L Ps, ctx_bvars L Ps -> member (notfree X) Ps * ->
       (exists T, member (of X T) L)
H3 : ctx_bvars L2 L1
============================
 exists T1, member (of X T1) (of X T :: L2)

Subgoal 2 is:
 exists T, member (of X T) L

ctx_bvars_sync < search.
Subgoal 2:

Variables: X L L1 B
IH : forall X L Ps, ctx_bvars L Ps -> member (notfree X) Ps * ->
       (exists T, member (of X T) L)
H1 : ctx_bvars L (B :: L1)
H3 : member (notfree X) L1 *
============================
 exists T, member (of X T) L

ctx_bvars_sync < case H1.
Subgoal 2:

Variables: X L1 X1 L2 T
IH : forall X L Ps, ctx_bvars L Ps -> member (notfree X) Ps * ->
       (exists T, member (of X T) L)
H3 : member (notfree X) L1 *
H4 : ctx_bvars L2 L1
============================
 exists T1, member (of X T1) (of X1 T :: L2)

ctx_bvars_sync < apply IH to _ H3.
Subgoal 2:

Variables: X L1 X1 L2 T T1
IH : forall X L Ps, ctx_bvars L Ps -> member (notfree X) Ps * ->
       (exists T, member (of X T) L)
H3 : member (notfree X) L1 *
H4 : ctx_bvars L2 L1
H5 : member (of X T1) L2
============================
 exists T1, member (of X T1) (of X1 T :: L2)

ctx_bvars_sync < search.
Proof completed.
Abella < Theorem subset_prune_ctx : 
forall L L' Vs, subset L L' -> vars_of_ctx L Vs -> prune_ctx Vs L' L.


============================
 forall L L' Vs, subset L L' -> vars_of_ctx L Vs -> prune_ctx Vs L' L

subset_prune_ctx < induction on 2.

IH : forall L L' Vs, subset L L' -> vars_of_ctx L Vs * -> prune_ctx Vs L' L
============================
 forall L L' Vs, subset L L' -> vars_of_ctx L Vs @ -> prune_ctx Vs L' L

subset_prune_ctx < intros.

Variables: L L' Vs
IH : forall L L' Vs, subset L L' -> vars_of_ctx L Vs * -> prune_ctx Vs L' L
H1 : subset L L'
H2 : vars_of_ctx L Vs @
============================
 prune_ctx Vs L' L

subset_prune_ctx < case H2.
Subgoal 1:

Variables: L'
IH : forall L L' Vs, subset L L' -> vars_of_ctx L Vs * -> prune_ctx Vs L' L
H1 : subset nil L'
============================
 prune_ctx nil L' nil

Subgoal 2 is:
 prune_ctx (X :: Vs1) L' (of X T :: L1)

subset_prune_ctx < search.
Subgoal 2:

Variables: L' Vs1 X L1 T
IH : forall L L' Vs, subset L L' -> vars_of_ctx L Vs * -> prune_ctx Vs L' L
H1 : subset (of X T :: L1) L'
H3 : vars_of_ctx L1 Vs1 *
============================
 prune_ctx (X :: Vs1) L' (of X T :: L1)

subset_prune_ctx < unfold.
Subgoal 2.1:

Variables: L' Vs1 X L1 T
IH : forall L L' Vs, subset L L' -> vars_of_ctx L Vs * -> prune_ctx Vs L' L
H1 : subset (of X T :: L1) L'
H3 : vars_of_ctx L1 Vs1 *
============================
 member (of X T) L'

Subgoal 2.2 is:
 prune_ctx Vs1 L' L1

subset_prune_ctx < case H1.
Subgoal 2.1:

Variables: L' Vs1 X L1 T
IH : forall L L' Vs, subset L L' -> vars_of_ctx L Vs * -> prune_ctx Vs L' L
H3 : vars_of_ctx L1 Vs1 *
H4 : member (of X T) L'
H5 : subset L1 L'
============================
 member (of X T) L'

Subgoal 2.2 is:
 prune_ctx Vs1 L' L1

subset_prune_ctx < search.
Subgoal 2.2:

Variables: L' Vs1 X L1 T
IH : forall L L' Vs, subset L L' -> vars_of_ctx L Vs * -> prune_ctx Vs L' L
H1 : subset (of X T :: L1) L'
H3 : vars_of_ctx L1 Vs1 *
============================
 prune_ctx Vs1 L' L1

subset_prune_ctx < backchain IH.
Subgoal 2.2:

Variables: L' Vs1 X L1 T
IH : forall L L' Vs, subset L L' -> vars_of_ctx L Vs * -> prune_ctx Vs L' L
H1 : subset (of X T :: L1) L'
H3 : vars_of_ctx L1 Vs1 *
============================
 subset L1 L'

subset_prune_ctx < case H1.
Subgoal 2.2:

Variables: L' Vs1 X L1 T
IH : forall L L' Vs, subset L L' -> vars_of_ctx L Vs * -> prune_ctx Vs L' L
H3 : vars_of_ctx L1 Vs1 *
H4 : member (of X T) L'
H5 : subset L1 L'
============================
 subset L1 L'

subset_prune_ctx < search.
Proof completed.
Abella < Theorem memb_bvars_strengthening : 
forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs} -> {memb M Vs}.


============================
 forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs} -> {memb M Vs}

memb_bvars_strengthening < induction on 2.

IH : forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs}* -> {memb M Vs}
============================
 forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs}@ -> {memb M Vs}

memb_bvars_strengthening < intros.

Variables: Ps M Vs
IH : forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs}* -> {memb M Vs}
H1 : bvars Ps
H2 : {Ps |- memb M Vs}@
============================
 {memb M Vs}

memb_bvars_strengthening < case H2.
Subgoal 1:

Variables: Ps M L
IH : forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs}* -> {memb M Vs}
H1 : bvars Ps
============================
 {memb M (M :: L)}

Subgoal 2 is:
 {memb M (X :: L)}

Subgoal 3 is:
 {memb M Vs}

memb_bvars_strengthening < search.
Subgoal 2:

Variables: Ps M L X
IH : forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs}* -> {memb M Vs}
H1 : bvars Ps
H3 : {Ps |- memb M L}*
============================
 {memb M (X :: L)}

Subgoal 3 is:
 {memb M Vs}

memb_bvars_strengthening < assert {memb M L}.
Subgoal 2.1:

Variables: Ps M L X
IH : forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs}* -> {memb M Vs}
H1 : bvars Ps
H3 : {Ps |- memb M L}*
============================
 {memb M L}

Subgoal 2 is:
 {memb M (X :: L)}

Subgoal 3 is:
 {memb M Vs}

memb_bvars_strengthening < backchain IH.
Subgoal 2:

Variables: Ps M L X
IH : forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs}* -> {memb M Vs}
H1 : bvars Ps
H3 : {Ps |- memb M L}*
H4 : {memb M L}
============================
 {memb M (X :: L)}

Subgoal 3 is:
 {memb M Vs}

memb_bvars_strengthening < search.
Subgoal 3:

Variables: Ps M Vs F
IH : forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs}* -> {memb M Vs}
H1 : bvars Ps
H3 : {Ps, [F] |- memb M Vs}*
H4 : member F Ps
============================
 {memb M Vs}

memb_bvars_strengthening < apply bvars_mem to _ H4.
Subgoal 3:

Variables: Ps M Vs X
IH : forall Ps M Vs, bvars Ps -> {Ps |- memb M Vs}* -> {memb M Vs}
H1 : bvars Ps
H3 : {Ps, [notfree X] |- memb M Vs}*
H4 : member (notfree X) Ps
H5 : name X
============================
 {memb M Vs}

memb_bvars_strengthening < case H3.
Proof completed.
Abella < Theorem combine_bvars_strengthening : 
forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3} ->
  {combine L1 L2 L3}.


============================
 forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3} ->
   {combine L1 L2 L3}

combine_bvars_strengthening < induction on 2.

IH : forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}* ->
       {combine L1 L2 L3}
============================
 forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}@ ->
   {combine L1 L2 L3}

combine_bvars_strengthening < intros.

Variables: L1 L2 L3 Ps
IH : forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}* ->
       {combine L1 L2 L3}
H1 : bvars Ps
H2 : {Ps |- combine L1 L2 L3}@
============================
 {combine L1 L2 L3}

combine_bvars_strengthening < case H2.
Subgoal 1:

Variables: L3 Ps
IH : forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}* ->
       {combine L1 L2 L3}
H1 : bvars Ps
============================
 {combine nil L3 L3}

Subgoal 2 is:
 {combine (X :: L5) L2 L3}

Subgoal 3 is:
 {combine (X :: L5) L2 (X :: L)}

Subgoal 4 is:
 {combine L1 L2 L3}

combine_bvars_strengthening < search.
Subgoal 2:

Variables: L2 L3 Ps L5 X
IH : forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}* ->
       {combine L1 L2 L3}
H1 : bvars Ps
H3 : {Ps |- memb X L2}*
H4 : {Ps |- combine L5 L2 L3}*
============================
 {combine (X :: L5) L2 L3}

Subgoal 3 is:
 {combine (X :: L5) L2 (X :: L)}

Subgoal 4 is:
 {combine L1 L2 L3}

combine_bvars_strengthening < apply IH to H1 H4.
Subgoal 2:

Variables: L2 L3 Ps L5 X
IH : forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}* ->
       {combine L1 L2 L3}
H1 : bvars Ps
H3 : {Ps |- memb X L2}*
H4 : {Ps |- combine L5 L2 L3}*
H5 : {combine L5 L2 L3}
============================
 {combine (X :: L5) L2 L3}

Subgoal 3 is:
 {combine (X :: L5) L2 (X :: L)}

Subgoal 4 is:
 {combine L1 L2 L3}

combine_bvars_strengthening < apply memb_bvars_strengthening to H1 H3.
Subgoal 2:

Variables: L2 L3 Ps L5 X
IH : forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}* ->
       {combine L1 L2 L3}
H1 : bvars Ps
H3 : {Ps |- memb X L2}*
H4 : {Ps |- combine L5 L2 L3}*
H5 : {combine L5 L2 L3}
H6 : {memb X L2}
============================
 {combine (X :: L5) L2 L3}

Subgoal 3 is:
 {combine (X :: L5) L2 (X :: L)}

Subgoal 4 is:
 {combine L1 L2 L3}

combine_bvars_strengthening < search.
Subgoal 3:

Variables: L2 Ps L L5 X
IH : forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}* ->
       {combine L1 L2 L3}
H1 : bvars Ps
H3 : {Ps |- combine L5 L2 L}*
============================
 {combine (X :: L5) L2 (X :: L)}

Subgoal 4 is:
 {combine L1 L2 L3}

combine_bvars_strengthening < apply IH to H1 H3.
Subgoal 3:

Variables: L2 Ps L L5 X
IH : forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}* ->
       {combine L1 L2 L3}
H1 : bvars Ps
H3 : {Ps |- combine L5 L2 L}*
H4 : {combine L5 L2 L}
============================
 {combine (X :: L5) L2 (X :: L)}

Subgoal 4 is:
 {combine L1 L2 L3}

combine_bvars_strengthening < search.
Subgoal 4:

Variables: L1 L2 L3 Ps F
IH : forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}* ->
       {combine L1 L2 L3}
H1 : bvars Ps
H3 : {Ps, [F] |- combine L1 L2 L3}*
H4 : member F Ps
============================
 {combine L1 L2 L3}

combine_bvars_strengthening < apply bvars_mem to H1 H4.
Subgoal 4:

Variables: L1 L2 L3 Ps X
IH : forall L1 L2 L3 Ps, bvars Ps -> {Ps |- combine L1 L2 L3}* ->
       {combine L1 L2 L3}
H1 : bvars Ps
H3 : {Ps, [notfree X] |- combine L1 L2 L3}*
H4 : member (notfree X) Ps
H5 : name X
============================
 {combine L1 L2 L3}

combine_bvars_strengthening < case H3.
Proof completed.
Abella < Theorem ctx_vars_of_ctx_sync : 
forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs} ->
  (exists T, member (of X T) L).


============================
 forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs} ->
   (exists T, member (of X T) L)

ctx_vars_of_ctx_sync < induction on 3.

IH : forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs}* ->
       (exists T, member (of X T) L)
============================
 forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs}@ ->
   (exists T, member (of X T) L)

ctx_vars_of_ctx_sync < intros.

Variables: L Vs X
IH : forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs}* ->
       (exists T, member (of X T) L)
H1 : ctx L
H2 : vars_of_ctx L Vs
H3 : {memb X Vs}@
============================
 exists T, member (of X T) L

ctx_vars_of_ctx_sync < case H3.
Subgoal 1:

Variables: L X L1
IH : forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs}* ->
       (exists T, member (of X T) L)
H1 : ctx L
H2 : vars_of_ctx L (X :: L1)
============================
 exists T, member (of X T) L

Subgoal 2 is:
 exists T, member (of X T) L

ctx_vars_of_ctx_sync < case H2.
Subgoal 1:

Variables: X L1 L2 T
IH : forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs}* ->
       (exists T, member (of X T) L)
H1 : ctx (of X T :: L2)
H4 : vars_of_ctx L2 L1
============================
 exists T1, member (of X T1) (of X T :: L2)

Subgoal 2 is:
 exists T, member (of X T) L

ctx_vars_of_ctx_sync < case H1.
Subgoal 1:

Variables: X L1 L2 T
IH : forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs}* ->
       (exists T, member (of X T) L)
H4 : vars_of_ctx L2 L1
H5 : ctx L2
H6 : name X
H7 : {is_sty T}
H8 : forall T', member (of X T') L2 -> T = T'
============================
 exists T1, member (of X T1) (of X T :: L2)

Subgoal 2 is:
 exists T, member (of X T) L

ctx_vars_of_ctx_sync < search.
Subgoal 2:

Variables: L X L1 X1
IH : forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs}* ->
       (exists T, member (of X T) L)
H1 : ctx L
H2 : vars_of_ctx L (X1 :: L1)
H4 : {memb X L1}*
============================
 exists T, member (of X T) L

ctx_vars_of_ctx_sync < case H2.
Subgoal 2:

Variables: X L1 X1 L2 T
IH : forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs}* ->
       (exists T, member (of X T) L)
H1 : ctx (of X1 T :: L2)
H4 : {memb X L1}*
H5 : vars_of_ctx L2 L1
============================
 exists T1, member (of X T1) (of X1 T :: L2)

ctx_vars_of_ctx_sync < case H1.
Subgoal 2:

Variables: X L1 X1 L2 T
IH : forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs}* ->
       (exists T, member (of X T) L)
H4 : {memb X L1}*
H5 : vars_of_ctx L2 L1
H6 : ctx L2
H7 : name X1
H8 : {is_sty T}
H9 : forall T', member (of X1 T') L2 -> T = T'
============================
 exists T1, member (of X T1) (of X1 T :: L2)

ctx_vars_of_ctx_sync < apply IH to _ _ H4.
Subgoal 2:

Variables: X L1 X1 L2 T T1
IH : forall L Vs X, ctx L -> vars_of_ctx L Vs -> {memb X Vs}* ->
       (exists T, member (of X T) L)
H4 : {memb X L1}*
H5 : vars_of_ctx L2 L1
H6 : ctx L2
H7 : name X1
H8 : {is_sty T}
H9 : forall T', member (of X1 T') L2 -> T = T'
H10 : member (of X T1) L2
============================
 exists T1, member (of X T1) (of X1 T :: L2)

ctx_vars_of_ctx_sync < search.
Proof completed.
Abella < Theorem prune_ctx_prune_tm : 
forall FVs L L', nabla n, prune_ctx FVs L (L' n) -> (exists L'', L' = y\L'').


============================
 forall FVs L L', nabla n, prune_ctx FVs L (L' n) -> (exists L'', L' = y\L'')

prune_ctx_prune_tm < induction on 1.

IH : forall FVs L L', nabla n, prune_ctx FVs L (L' n) * ->
       (exists L'', L' = y\L'')
============================
 forall FVs L L', nabla n, prune_ctx FVs L (L' n) @ ->
   (exists L'', L' = y\L'')

prune_ctx_prune_tm < intros.

Variables: FVs L L'
IH : forall FVs L L', nabla n, prune_ctx FVs L (L' n) * ->
       (exists L'', L' = y\L'')
H1 : prune_ctx FVs L (L' n1) @
============================
 exists L'', L' = y\L''

prune_ctx_prune_tm < case H1.
Subgoal 1:

Variables: L
IH : forall FVs L L', nabla n, prune_ctx FVs L (L' n) * ->
       (exists L'', L' = y\L'')
============================
 exists L'', z1\nil = y\L''

Subgoal 2 is:
 exists L'', z1\of FVs1 T :: L'1 z1 = y\L''

prune_ctx_prune_tm < search.
Subgoal 2:

Variables: L L'1 T FVs1 FVs2
IH : forall FVs L L', nabla n, prune_ctx FVs L (L' n) * ->
       (exists L'', L' = y\L'')
H2 : member (of FVs1 T) L
H3 : prune_ctx FVs2 L (L'1 n1) *
============================
 exists L'', z1\of FVs1 T :: L'1 z1 = y\L''

prune_ctx_prune_tm < apply IH to H3.
Subgoal 2:

Variables: L T FVs1 FVs2 L''
IH : forall FVs L L', nabla n, prune_ctx FVs L (L' n) * ->
       (exists L'', L' = y\L'')
H2 : member (of FVs1 T) L
H3 : prune_ctx FVs2 L L'' *
============================
 exists L''1, z1\of FVs1 T :: L'' = y\L''1

prune_ctx_prune_tm < search.
Proof completed.
Abella < Theorem prune_ctx_input_islist : 
forall Vs L L', prune_ctx Vs L L' -> is_list Vs.


============================
 forall Vs L L', prune_ctx Vs L L' -> is_list Vs

prune_ctx_input_islist < induction on 1.

IH : forall Vs L L', prune_ctx Vs L L' * -> is_list Vs
============================
 forall Vs L L', prune_ctx Vs L L' @ -> is_list Vs

prune_ctx_input_islist < intros.

Variables: Vs L L'
IH : forall Vs L L', prune_ctx Vs L L' * -> is_list Vs
H1 : prune_ctx Vs L L' @
============================
 is_list Vs

prune_ctx_input_islist < case H1.
Subgoal 1:

Variables: L
IH : forall Vs L L', prune_ctx Vs L L' * -> is_list Vs
============================
 is_list nil

Subgoal 2 is:
 is_list (X :: Vs1)

prune_ctx_input_islist < search.
Subgoal 2:

Variables: L L'1 T X Vs1
IH : forall Vs L L', prune_ctx Vs L L' * -> is_list Vs
H2 : member (of X T) L
H3 : prune_ctx Vs1 L L'1 *
============================
 is_list (X :: Vs1)

prune_ctx_input_islist < unfold.
Subgoal 2:

Variables: L L'1 T X Vs1
IH : forall Vs L L', prune_ctx Vs L L' * -> is_list Vs
H2 : member (of X T) L
H3 : prune_ctx Vs1 L L'1 *
============================
 is_list Vs1

prune_ctx_input_islist < backchain IH.
Proof completed.
Abella < Theorem prune_ctx_rsl_islist : 
forall Vs L L', prune_ctx Vs L L' -> is_list L'.


============================
 forall Vs L L', prune_ctx Vs L L' -> is_list L'

prune_ctx_rsl_islist < induction on 1.

IH : forall Vs L L', prune_ctx Vs L L' * -> is_list L'
============================
 forall Vs L L', prune_ctx Vs L L' @ -> is_list L'

prune_ctx_rsl_islist < intros.

Variables: Vs L L'
IH : forall Vs L L', prune_ctx Vs L L' * -> is_list L'
H1 : prune_ctx Vs L L' @
============================
 is_list L'

prune_ctx_rsl_islist < case H1.
Subgoal 1:

Variables: L
IH : forall Vs L L', prune_ctx Vs L L' * -> is_list L'
============================
 is_list nil

Subgoal 2 is:
 is_list (of X T :: L'1)

prune_ctx_rsl_islist < search.
Subgoal 2:

Variables: L L'1 T X Vs1
IH : forall Vs L L', prune_ctx Vs L L' * -> is_list L'
H2 : member (of X T) L
H3 : prune_ctx Vs1 L L'1 *
============================
 is_list (of X T :: L'1)

prune_ctx_rsl_islist < unfold.
Subgoal 2:

Variables: L L'1 T X Vs1
IH : forall Vs L L', prune_ctx Vs L L' * -> is_list L'
H2 : member (of X T) L
H3 : prune_ctx Vs1 L L'1 *
============================
 is_list L'1

prune_ctx_rsl_islist < backchain IH.
Proof completed.
Abella < Theorem prune_ctx_rsl_subset : 
forall Vs L L', prune_ctx Vs L L' -> subset L' L.


============================
 forall Vs L L', prune_ctx Vs L L' -> subset L' L

prune_ctx_rsl_subset < induction on 1.

IH : forall Vs L L', prune_ctx Vs L L' * -> subset L' L
============================
 forall Vs L L', prune_ctx Vs L L' @ -> subset L' L

prune_ctx_rsl_subset < intros.

Variables: Vs L L'
IH : forall Vs L L', prune_ctx Vs L L' * -> subset L' L
H1 : prune_ctx Vs L L' @
============================
 subset L' L

prune_ctx_rsl_subset < case H1.
Subgoal 1:

Variables: L
IH : forall Vs L L', prune_ctx Vs L L' * -> subset L' L
============================
 subset nil L

Subgoal 2 is:
 subset (of X T :: L'1) L

prune_ctx_rsl_subset < search.
Subgoal 2:

Variables: L L'1 T X Vs1
IH : forall Vs L L', prune_ctx Vs L L' * -> subset L' L
H2 : member (of X T) L
H3 : prune_ctx Vs1 L L'1 *
============================
 subset (of X T :: L'1) L

prune_ctx_rsl_subset < unfold.
Subgoal 2.1:

Variables: L L'1 T X Vs1
IH : forall Vs L L', prune_ctx Vs L L' * -> subset L' L
H2 : member (of X T) L
H3 : prune_ctx Vs1 L L'1 *
============================
 member (of X T) L

Subgoal 2.2 is:
 subset L'1 L

prune_ctx_rsl_subset < search.
Subgoal 2.2:

Variables: L L'1 T X Vs1
IH : forall Vs L L', prune_ctx Vs L L' * -> subset L' L
H2 : member (of X T) L
H3 : prune_ctx Vs1 L L'1 *
============================
 subset L'1 L

prune_ctx_rsl_subset < backchain IH.
Proof completed.
Abella < Theorem prune_ctx_exists : 
forall X Vs L L', {memb X Vs} -> prune_ctx Vs L L' ->
  (exists T, member (of X T) L').


============================
 forall X Vs L L', {memb X Vs} -> prune_ctx Vs L L' ->
   (exists T, member (of X T) L')

prune_ctx_exists < induction on 1.

IH : forall X Vs L L', {memb X Vs}* -> prune_ctx Vs L L' ->
       (exists T, member (of X T) L')
============================
 forall X Vs L L', {memb X Vs}@ -> prune_ctx Vs L L' ->
   (exists T, member (of X T) L')

prune_ctx_exists < intros.

Variables: X Vs L L'
IH : forall X Vs L L', {memb X Vs}* -> prune_ctx Vs L L' ->
       (exists T, member (of X T) L')
H1 : {memb X Vs}@
H2 : prune_ctx Vs L L'
============================
 exists T, member (of X T) L'

prune_ctx_exists < case H1.
Subgoal 1:

Variables: X L L' L1
IH : forall X Vs L L', {memb X Vs}* -> prune_ctx Vs L L' ->
       (exists T, member (of X T) L')
H2 : prune_ctx (X :: L1) L L'
============================
 exists T, member (of X T) L'

Subgoal 2 is:
 exists T, member (of X T) L'

prune_ctx_exists < case H2.
Subgoal 1:

Variables: X L L1 L'1 T
IH : forall X Vs L L', {memb X Vs}* -> prune_ctx Vs L L' ->
       (exists T, member (of X T) L')
H3 : member (of X T) L
H4 : prune_ctx L1 L L'1
============================
 exists T1, member (of X T1) (of X T :: L'1)

Subgoal 2 is:
 exists T, member (of X T) L'

prune_ctx_exists < search.
Subgoal 2:

Variables: X L L' L1 X1
IH : forall X Vs L L', {memb X Vs}* -> prune_ctx Vs L L' ->
       (exists T, member (of X T) L')
H2 : prune_ctx (X1 :: L1) L L'
H3 : {memb X L1}*
============================
 exists T, member (of X T) L'

prune_ctx_exists < case H2.
Subgoal 2:

Variables: X L L1 X1 L'1 T
IH : forall X Vs L L', {memb X Vs}* -> prune_ctx Vs L L' ->
       (exists T, member (of X T) L')
H3 : {memb X L1}*
H4 : member (of X1 T) L
H5 : prune_ctx L1 L L'1
============================
 exists T1, member (of X T1) (of X1 T :: L'1)

prune_ctx_exists < apply IH to H3 _.
Subgoal 2:

Variables: X L L1 X1 L'1 T T1
IH : forall X Vs L L', {memb X Vs}* -> prune_ctx Vs L L' ->
       (exists T, member (of X T) L')
H3 : {memb X L1}*
H4 : member (of X1 T) L
H5 : prune_ctx L1 L L'1
H6 : member (of X T1) L'1
============================
 exists T1, member (of X T1) (of X1 T :: L'1)

prune_ctx_exists < search.
Proof completed.
Abella < Theorem subset_prune_ctx_sim : 
forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 -> prune_ctx Vs1 L L1 ->
  prune_ctx Vs2 L L2 -> subset L1 L2.


============================
 forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 -> prune_ctx Vs1 L L1 ->
   prune_ctx Vs2 L L2 -> subset L1 L2

subset_prune_ctx_sim < induction on 3.

IH : forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 ->
       prune_ctx Vs1 L L1 * -> prune_ctx Vs2 L L2 -> subset L1 L2
============================
 forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 -> prune_ctx Vs1 L L1 @ ->
   prune_ctx Vs2 L L2 -> subset L1 L2

subset_prune_ctx_sim < intros.

Variables: Vs1 Vs2 L L1 L2
IH : forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 ->
       prune_ctx Vs1 L L1 * -> prune_ctx Vs2 L L2 -> subset L1 L2
H1 : ctx L
H2 : ssubset Vs1 Vs2
H3 : prune_ctx Vs1 L L1 @
H4 : prune_ctx Vs2 L L2
============================
 subset L1 L2

subset_prune_ctx_sim < case H3.
Subgoal 1:

Variables: Vs2 L L2
IH : forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 ->
       prune_ctx Vs1 L L1 * -> prune_ctx Vs2 L L2 -> subset L1 L2
H1 : ctx L
H2 : ssubset nil Vs2
H4 : prune_ctx Vs2 L L2
============================
 subset nil L2

Subgoal 2 is:
 subset (of X T :: L') L2

subset_prune_ctx_sim < search.
Subgoal 2:

Variables: Vs2 L L2 L' T X Vs
IH : forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 ->
       prune_ctx Vs1 L L1 * -> prune_ctx Vs2 L L2 -> subset L1 L2
H1 : ctx L
H2 : ssubset (X :: Vs) Vs2
H4 : prune_ctx Vs2 L L2
H5 : member (of X T) L
H6 : prune_ctx Vs L L' *
============================
 subset (of X T :: L') L2

subset_prune_ctx_sim < case H2.
Subgoal 2:

Variables: Vs2 L L2 L' T X Vs
IH : forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 ->
       prune_ctx Vs1 L L1 * -> prune_ctx Vs2 L L2 -> subset L1 L2
H1 : ctx L
H4 : prune_ctx Vs2 L L2
H5 : member (of X T) L
H6 : prune_ctx Vs L L' *
H7 : {memb X Vs2}
H8 : ssubset Vs Vs2
============================
 subset (of X T :: L') L2

subset_prune_ctx_sim < unfold.
Subgoal 2.1:

Variables: Vs2 L L2 L' T X Vs
IH : forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 ->
       prune_ctx Vs1 L L1 * -> prune_ctx Vs2 L L2 -> subset L1 L2
H1 : ctx L
H4 : prune_ctx Vs2 L L2
H5 : member (of X T) L
H6 : prune_ctx Vs L L' *
H7 : {memb X Vs2}
H8 : ssubset Vs Vs2
============================
 member (of X T) L2

Subgoal 2.2 is:
 subset L' L2

subset_prune_ctx_sim < apply prune_ctx_exists to H7 H4.
Subgoal 2.1:

Variables: Vs2 L L2 L' T X Vs T1
IH : forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 ->
       prune_ctx Vs1 L L1 * -> prune_ctx Vs2 L L2 -> subset L1 L2
H1 : ctx L
H4 : prune_ctx Vs2 L L2
H5 : member (of X T) L
H6 : prune_ctx Vs L L' *
H7 : {memb X Vs2}
H8 : ssubset Vs Vs2
H9 : member (of X T1) L2
============================
 member (of X T) L2

Subgoal 2.2 is:
 subset L' L2

subset_prune_ctx_sim < apply prune_ctx_mem_rev to H4 H9.
Subgoal 2.1:

Variables: Vs2 L L2 L' T X Vs T1
IH : forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 ->
       prune_ctx Vs1 L L1 * -> prune_ctx Vs2 L L2 -> subset L1 L2
H1 : ctx L
H4 : prune_ctx Vs2 L L2
H5 : member (of X T) L
H6 : prune_ctx Vs L L' *
H7 : {memb X Vs2}
H8 : ssubset Vs Vs2
H9 : member (of X T1) L2
H10 : member (of X T1) L
============================
 member (of X T) L2

Subgoal 2.2 is:
 subset L' L2

subset_prune_ctx_sim < apply ctx_mem_sync to _ H5 H10.
Subgoal 2.1:

Variables: Vs2 L L2 L' X Vs T1
IH : forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 ->
       prune_ctx Vs1 L L1 * -> prune_ctx Vs2 L L2 -> subset L1 L2
H1 : ctx L
H4 : prune_ctx Vs2 L L2
H5 : member (of X T1) L
H6 : prune_ctx Vs L L' *
H7 : {memb X Vs2}
H8 : ssubset Vs Vs2
H9 : member (of X T1) L2
H10 : member (of X T1) L
============================
 member (of X T1) L2

Subgoal 2.2 is:
 subset L' L2

subset_prune_ctx_sim < search.
Subgoal 2.2:

Variables: Vs2 L L2 L' T X Vs
IH : forall Vs1 Vs2 L L1 L2, ctx L -> ssubset Vs1 Vs2 ->
       prune_ctx Vs1 L L1 * -> prune_ctx Vs2 L L2 -> subset L1 L2
H1 : ctx L
H4 : prune_ctx Vs2 L L2
H5 : member (of X T) L
H6 : prune_ctx Vs L L' *
H7 : {memb X Vs2}
H8 : ssubset Vs Vs2
============================
 subset L' L2

subset_prune_ctx_sim < backchain IH.
Proof completed.
Abella < Theorem prune_ctx_combine : 
forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
  {combine Vs1 Vs2 Vs} -> (exists L', prune_ctx Vs L L').


============================
 forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
   {combine Vs1 Vs2 Vs} -> (exists L', prune_ctx Vs L L')

prune_ctx_combine < induction on 3.

IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
============================
 forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
   {combine Vs1 Vs2 Vs}@ -> (exists L', prune_ctx Vs L L')

prune_ctx_combine < intros.

Variables: Vs1 Vs2 L L1 L2 Vs
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H1 : prune_ctx Vs1 L L1
H2 : prune_ctx Vs2 L L2
H3 : {combine Vs1 Vs2 Vs}@
============================
 exists L', prune_ctx Vs L L'

prune_ctx_combine < case H3.
Subgoal 1:

Variables: L L1 L2 Vs
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H1 : prune_ctx nil L L1
H2 : prune_ctx Vs L L2
============================
 exists L', prune_ctx Vs L L'

Subgoal 2 is:
 exists L', prune_ctx Vs L L'

Subgoal 3 is:
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < case H1.
Subgoal 1:

Variables: L L2 Vs
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H2 : prune_ctx Vs L L2
============================
 exists L', prune_ctx Vs L L'

Subgoal 2 is:
 exists L', prune_ctx Vs L L'

Subgoal 3 is:
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < search.
Subgoal 2:

Variables: Vs2 L L1 L2 Vs L5 X
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H1 : prune_ctx (X :: L5) L L1
H2 : prune_ctx Vs2 L L2
H4 : {memb X Vs2}*
H5 : {combine L5 Vs2 Vs}*
============================
 exists L', prune_ctx Vs L L'

Subgoal 3 is:
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < case H1.
Subgoal 2:

Variables: Vs2 L L2 Vs L5 X L' T
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H2 : prune_ctx Vs2 L L2
H4 : {memb X Vs2}*
H5 : {combine L5 Vs2 Vs}*
H6 : member (of X T) L
H7 : prune_ctx L5 L L'
============================
 exists L', prune_ctx Vs L L'

Subgoal 3 is:
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < assert exists L', prune_ctx Vs L L'.
Subgoal 2.1:

Variables: Vs2 L L2 Vs L5 X L' T
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H2 : prune_ctx Vs2 L L2
H4 : {memb X Vs2}*
H5 : {combine L5 Vs2 Vs}*
H6 : member (of X T) L
H7 : prune_ctx L5 L L'
============================
 exists L'1, prune_ctx Vs L L'1

Subgoal 2 is:
 exists L', prune_ctx Vs L L'

Subgoal 3 is:
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < backchain IH with Vs1 = L5.
Subgoal 2:

Variables: Vs2 L L2 Vs L5 X L' T
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H2 : prune_ctx Vs2 L L2
H4 : {memb X Vs2}*
H5 : {combine L5 Vs2 Vs}*
H6 : member (of X T) L
H7 : prune_ctx L5 L L'
H8 : exists L'1, prune_ctx Vs L L'1
============================
 exists L', prune_ctx Vs L L'

Subgoal 3 is:
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < case H8.
Subgoal 2:

Variables: Vs2 L L2 Vs L5 X L' T L'1
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H2 : prune_ctx Vs2 L L2
H4 : {memb X Vs2}*
H5 : {combine L5 Vs2 Vs}*
H6 : member (of X T) L
H7 : prune_ctx L5 L L'
H9 : prune_ctx Vs L L'1
============================
 exists L', prune_ctx Vs L L'

Subgoal 3 is:
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < search.
Subgoal 3:

Variables: Vs2 L L1 L2 L3 L5 X
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H1 : prune_ctx (X :: L5) L L1
H2 : prune_ctx Vs2 L L2
H4 : {combine L5 Vs2 L3}*
============================
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < case H1.
Subgoal 3:

Variables: Vs2 L L2 L3 L5 X L' T
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H2 : prune_ctx Vs2 L L2
H4 : {combine L5 Vs2 L3}*
H5 : member (of X T) L
H6 : prune_ctx L5 L L'
============================
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < assert exists L', prune_ctx L3 L L'.
Subgoal 3.1:

Variables: Vs2 L L2 L3 L5 X L' T
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H2 : prune_ctx Vs2 L L2
H4 : {combine L5 Vs2 L3}*
H5 : member (of X T) L
H6 : prune_ctx L5 L L'
============================
 exists L'1, prune_ctx L3 L L'1

Subgoal 3 is:
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < backchain IH with Vs1 = L5, Vs2 = Vs2, Vs = L3.
Subgoal 3:

Variables: Vs2 L L2 L3 L5 X L' T
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H2 : prune_ctx Vs2 L L2
H4 : {combine L5 Vs2 L3}*
H5 : member (of X T) L
H6 : prune_ctx L5 L L'
H7 : exists L'1, prune_ctx L3 L L'1
============================
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < case H7.
Subgoal 3:

Variables: Vs2 L L2 L3 L5 X L' T L'1
IH : forall Vs1 Vs2 L L1 L2 Vs, prune_ctx Vs1 L L1 -> prune_ctx Vs2 L L2 ->
       {combine Vs1 Vs2 Vs}* -> (exists L', prune_ctx Vs L L')
H2 : prune_ctx Vs2 L L2
H4 : {combine L5 Vs2 L3}*
H5 : member (of X T) L
H6 : prune_ctx L5 L L'
H8 : prune_ctx L3 L L'1
============================
 exists L', prune_ctx (X :: L3) L L'

prune_ctx_combine < search.
Proof completed.
Abella < Theorem ctx_prune_tail : 
forall L LH LT FVs LT' L', ctx L -> append LH LT L -> prune_ctx FVs LT LT' ->
  append LH LT' L' -> ctx L'.


============================
 forall L LH LT FVs LT' L', ctx L -> append LH LT L ->
   prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'

ctx_prune_tail < induction on 2.

IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
============================
 forall L LH LT FVs LT' L', ctx L -> append LH LT L @ ->
   prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'

ctx_prune_tail < intros.

Variables: L LH LT FVs LT' L'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H1 : ctx L
H2 : append LH LT L @
H3 : prune_ctx FVs LT LT'
H4 : append LH LT' L'
============================
 ctx L'

ctx_prune_tail < case H2.
Subgoal 1:

Variables: L FVs LT' L'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H1 : ctx L
H3 : prune_ctx FVs L LT'
H4 : append nil LT' L'
============================
 ctx L'

Subgoal 2 is:
 ctx L'

ctx_prune_tail < case H4.
Subgoal 1:

Variables: L FVs L'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H1 : ctx L
H3 : prune_ctx FVs L L'
============================
 ctx L'

Subgoal 2 is:
 ctx L'

ctx_prune_tail < backchain prune_ctx_pres.
Subgoal 2:

Variables: LT FVs LT' L' L3 X L1
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H1 : ctx (X :: L3)
H3 : prune_ctx FVs LT LT'
H4 : append (X :: L1) LT' L'
H5 : append L1 LT L3 *
============================
 ctx L'

ctx_prune_tail < case H4.
Subgoal 2:

Variables: LT FVs LT' L3 X L1 L5
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H1 : ctx (X :: L3)
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
============================
 ctx (X :: L5)

ctx_prune_tail < case H1.
Subgoal 2:

Variables: LT FVs LT' L3 L1 L5 T X1
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
============================
 ctx (of X1 T :: L5)

ctx_prune_tail < apply IH to _ H5 H3 _.
Subgoal 2:

Variables: LT FVs LT' L3 L1 L5 T X1
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
============================
 ctx (of X1 T :: L5)

ctx_prune_tail < unfold.
Subgoal 2.1:

Variables: LT FVs LT' L3 L1 L5 T X1
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
============================
 ctx L5

Subgoal 2.2 is:
 name X1

Subgoal 2.3 is:
 {is_sty T}

Subgoal 2.4 is:
 forall T', member (of X1 T') L5 -> T = T'

ctx_prune_tail < search.
Subgoal 2.2:

Variables: LT FVs LT' L3 L1 L5 T X1
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
============================
 name X1

Subgoal 2.3 is:
 {is_sty T}

Subgoal 2.4 is:
 forall T', member (of X1 T') L5 -> T = T'

ctx_prune_tail < search.
Subgoal 2.3:

Variables: LT FVs LT' L3 L1 L5 T X1
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
============================
 {is_sty T}

Subgoal 2.4 is:
 forall T', member (of X1 T') L5 -> T = T'

ctx_prune_tail < search.
Subgoal 2.4:

Variables: LT FVs LT' L3 L1 L5 T X1
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
============================
 forall T', member (of X1 T') L5 -> T = T'

ctx_prune_tail < intros.
Subgoal 2.4:

Variables: LT FVs LT' L3 L1 L5 T X1 T'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
H12 : member (of X1 T') L5
============================
 T = T'

ctx_prune_tail < backchain H10.
Subgoal 2.4:

Variables: LT FVs LT' L3 L1 L5 T X1 T'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
H12 : member (of X1 T') L5
============================
 member (of X1 T') L3

ctx_prune_tail < backchain subset_mem_trans with L1 = L5.
Subgoal 2.4:

Variables: LT FVs LT' L3 L1 L5 T X1 T'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
H12 : member (of X1 T') L5
============================
 subset L5 L3

ctx_prune_tail < backchain append_append_subset_trans with L1 = L1, L1' = L1, L2 = LT', L2' = LT.
Subgoal 2.4.1:

Variables: LT FVs LT' L3 L1 L5 T X1 T'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
H12 : member (of X1 T') L5
============================
 is_list LT

Subgoal 2.4.2 is:
 subset L1 L1

Subgoal 2.4.3 is:
 subset LT' LT

ctx_prune_tail < backchain append_arg2_islist with L1 = L1, L = L3.
Subgoal 2.4.1:

Variables: LT FVs LT' L3 L1 L5 T X1 T'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
H12 : member (of X1 T') L5
============================
 is_list L3

Subgoal 2.4.2 is:
 subset L1 L1

Subgoal 2.4.3 is:
 subset LT' LT

ctx_prune_tail < backchain ctx_islist.
Subgoal 2.4.2:

Variables: LT FVs LT' L3 L1 L5 T X1 T'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
H12 : member (of X1 T') L5
============================
 subset L1 L1

Subgoal 2.4.3 is:
 subset LT' LT

ctx_prune_tail < backchain subset_refl.
Subgoal 2.4.2:

Variables: LT FVs LT' L3 L1 L5 T X1 T'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
H12 : member (of X1 T') L5
============================
 is_list L1

Subgoal 2.4.3 is:
 subset LT' LT

ctx_prune_tail < backchain append_arg1_islist.
Subgoal 2.4.3:

Variables: LT FVs LT' L3 L1 L5 T X1 T'
IH : forall L LH LT FVs LT' L', ctx L -> append LH LT L * ->
       prune_ctx FVs LT LT' -> append LH LT' L' -> ctx L'
H3 : prune_ctx FVs LT LT'
H5 : append L1 LT L3 *
H6 : append L1 LT' L5
H7 : ctx L3
H8 : name X1
H9 : {is_sty T}
H10 : forall T', member (of X1 T') L3 -> T = T'
H11 : ctx L5
H12 : member (of X1 T') L5
============================
 subset LT' LT

ctx_prune_tail < backchain prune_ctx_rsl_subset.
Proof completed.
Abella < Theorem combine_prune_tail_ctx : 
forall L LH LT FVs1 LT1 FVs2 LT2 FVs, ctx L -> append LH LT L ->
  prune_ctx FVs1 LT LT1 -> prune_ctx FVs2 LT LT2 ->
  {combine FVs1 FVs2 FVs} ->
  (exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF).


============================
 forall L LH LT FVs1 LT1 FVs2 LT2 FVs, ctx L -> append LH LT L ->
   prune_ctx FVs1 LT LT1 -> prune_ctx FVs2 LT LT2 ->
   {combine FVs1 FVs2 FVs} ->
   (exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF)

combine_prune_tail_ctx < intros.

Variables: L LH LT FVs1 LT1 FVs2 LT2 FVs
H1 : ctx L
H2 : append LH LT L
H3 : prune_ctx FVs1 LT LT1
H4 : prune_ctx FVs2 LT LT2
H5 : {combine FVs1 FVs2 FVs}
============================
 exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF

combine_prune_tail_ctx < assert exists LT', prune_ctx FVs LT LT'.
Subgoal 1:

Variables: L LH LT FVs1 LT1 FVs2 LT2 FVs
H1 : ctx L
H2 : append LH LT L
H3 : prune_ctx FVs1 LT LT1
H4 : prune_ctx FVs2 LT LT2
H5 : {combine FVs1 FVs2 FVs}
============================
 exists LT', prune_ctx FVs LT LT'

Subgoal is:
 exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF

combine_prune_tail_ctx < backchain prune_ctx_combine with Vs1 = FVs1, Vs2 = FVs2.

Variables: L LH LT FVs1 LT1 FVs2 LT2 FVs
H1 : ctx L
H2 : append LH LT L
H3 : prune_ctx FVs1 LT LT1
H4 : prune_ctx FVs2 LT LT2
H5 : {combine FVs1 FVs2 FVs}
H6 : exists LT', prune_ctx FVs LT LT'
============================
 exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF

combine_prune_tail_ctx < case H6.

Variables: L LH LT FVs1 LT1 FVs2 LT2 FVs LT'
H1 : ctx L
H2 : append LH LT L
H3 : prune_ctx FVs1 LT LT1
H4 : prune_ctx FVs2 LT LT2
H5 : {combine FVs1 FVs2 FVs}
H7 : prune_ctx FVs LT LT'
============================
 exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF

combine_prune_tail_ctx < assert exists LF, append LH LT' LF.
Subgoal 2:

Variables: L LH LT FVs1 LT1 FVs2 LT2 FVs LT'
H1 : ctx L
H2 : append LH LT L
H3 : prune_ctx FVs1 LT LT1
H4 : prune_ctx FVs2 LT LT2
H5 : {combine FVs1 FVs2 FVs}
H7 : prune_ctx FVs LT LT'
============================
 exists LF, append LH LT' LF

Subgoal is:
 exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF

combine_prune_tail_ctx < backchain append_exists[o].
Subgoal 2:

Variables: L LH LT FVs1 LT1 FVs2 LT2 FVs LT'
H1 : ctx L
H2 : append LH LT L
H3 : prune_ctx FVs1 LT LT1
H4 : prune_ctx FVs2 LT LT2
H5 : {combine FVs1 FVs2 FVs}
H7 : prune_ctx FVs LT LT'
============================
 is_list LH

Subgoal is:
 exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF

combine_prune_tail_ctx < backchain append_arg1_islist.

Variables: L LH LT FVs1 LT1 FVs2 LT2 FVs LT'
H1 : ctx L
H2 : append LH LT L
H3 : prune_ctx FVs1 LT LT1
H4 : prune_ctx FVs2 LT LT2
H5 : {combine FVs1 FVs2 FVs}
H7 : prune_ctx FVs LT LT'
H8 : exists LF, append LH LT' LF
============================
 exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF

combine_prune_tail_ctx < case H8.

Variables: L LH LT FVs1 LT1 FVs2 LT2 FVs LT' LF
H1 : ctx L
H2 : append LH LT L
H3 : prune_ctx FVs1 LT LT1
H4 : prune_ctx FVs2 LT LT2
H5 : {combine FVs1 FVs2 FVs}
H7 : prune_ctx FVs LT LT'
H9 : append LH LT' LF
============================
 exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF

combine_prune_tail_ctx < assert ctx LF.
Subgoal 3:

Variables: L LH LT FVs1 LT1 FVs2 LT2 FVs LT' LF
H1 : ctx L
H2 : append LH LT L
H3 : prune_ctx FVs1 LT LT1
H4 : prune_ctx FVs2 LT LT2
H5 : {combine FVs1 FVs2 FVs}
H7 : prune_ctx FVs LT LT'
H9 : append LH LT' LF
============================
 ctx LF

Subgoal is:
 exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF

combine_prune_tail_ctx < backchain ctx_prune_tail with L = L, LH = LH, LT = LT, LT' = LT'.

Variables: L LH LT FVs1 LT1 FVs2 LT2 FVs LT' LF
H1 : ctx L
H2 : append LH LT L
H3 : prune_ctx FVs1 LT LT1
H4 : prune_ctx FVs2 LT LT2
H5 : {combine FVs1 FVs2 FVs}
H7 : prune_ctx FVs LT LT'
H9 : append LH LT' LF
H10 : ctx LF
============================
 exists LF LT', prune_ctx FVs LT LT' /\ append LH LT' LF /\ ctx LF

combine_prune_tail_ctx < search.
Proof completed.
Abella < Theorem prune_typing_weakening : 
forall FVs1 FVs2 LT LT1 LT2 LH LF1 LF2 M T, ctx LT -> ctx LF1 ->
  ssubset FVs1 FVs2 -> prune_ctx FVs1 LT LT1 -> prune_ctx FVs2 LT LT2 ->
  append LH LT1 LF1 -> {LF1 |- of M T} -> append LH LT2 LF2 ->
  {LF2 |- of M T}.


============================
 forall FVs1 FVs2 LT LT1 LT2 LH LF1 LF2 M T, ctx LT -> ctx LF1 ->
   ssubset FVs1 FVs2 -> prune_ctx FVs1 LT LT1 -> prune_ctx FVs2 LT LT2 ->
   append LH LT1 LF1 -> {LF1 |- of M T} -> append LH LT2 LF2 ->
   {LF2 |- of M T}

prune_typing_weakening < intros.

Variables: FVs1 FVs2 LT LT1 LT2 LH LF1 LF2 M T
H1 : ctx LT
H2 : ctx LF1
H3 : ssubset FVs1 FVs2
H4 : prune_ctx FVs1 LT LT1
H5 : prune_ctx FVs2 LT LT2
H6 : append LH LT1 LF1
H7 : {LF1 |- of M T}
H8 : append LH LT2 LF2
============================
 {LF2 |- of M T}

prune_typing_weakening < assert subset LT1 LT2.
Subgoal 1:

Variables: FVs1 FVs2 LT LT1 LT2 LH LF1 LF2 M T
H1 : ctx LT
H2 : ctx LF1
H3 : ssubset FVs1 FVs2
H4 : prune_ctx FVs1 LT LT1
H5 : prune_ctx FVs2 LT LT2
H6 : append LH LT1 LF1
H7 : {LF1 |- of M T}
H8 : append LH LT2 LF2
============================
 subset LT1 LT2

Subgoal is:
 {LF2 |- of M T}

prune_typing_weakening < backchain subset_prune_ctx_sim with Vs1 = FVs1, Vs2 = FVs2, L = LT.

Variables: FVs1 FVs2 LT LT1 LT2 LH LF1 LF2 M T
H1 : ctx LT
H2 : ctx LF1
H3 : ssubset FVs1 FVs2
H4 : prune_ctx FVs1 LT LT1
H5 : prune_ctx FVs2 LT LT2
H6 : append LH LT1 LF1
H7 : {LF1 |- of M T}
H8 : append LH LT2 LF2
H9 : subset LT1 LT2
============================
 {LF2 |- of M T}

prune_typing_weakening < assert subset LF1 LF2.
Subgoal 2:

Variables: FVs1 FVs2 LT LT1 LT2 LH LF1 LF2 M T
H1 : ctx LT
H2 : ctx LF1
H3 : ssubset FVs1 FVs2
H4 : prune_ctx FVs1 LT LT1
H5 : prune_ctx FVs2 LT LT2
H6 : append LH LT1 LF1
H7 : {LF1 |- of M T}
H8 : append LH LT2 LF2
H9 : subset LT1 LT2
============================
 subset LF1 LF2

Subgoal is:
 {LF2 |- of M T}

prune_typing_weakening < backchain append_append_subset_trans with L1 = LH, L1' = LH, L2 = LT1, L2' = LT2.
Subgoal 2.1:

Variables: FVs1 FVs2 LT LT1 LT2 LH LF1 LF2 M T
H1 : ctx LT
H2 : ctx LF1
H3 : ssubset FVs1 FVs2
H4 : prune_ctx FVs1 LT LT1
H5 : prune_ctx FVs2 LT LT2
H6 : append LH LT1 LF1
H7 : {LF1 |- of M T}
H8 : append LH LT2 LF2
H9 : subset LT1 LT2
============================
 is_list LT2

Subgoal 2.2 is:
 subset LH LH

Subgoal is:
 {LF2 |- of M T}

prune_typing_weakening < backchain prune_ctx_rsl_islist.
Subgoal 2.2:

Variables: FVs1 FVs2 LT LT1 LT2 LH LF1 LF2 M T
H1 : ctx LT
H2 : ctx LF1
H3 : ssubset FVs1 FVs2
H4 : prune_ctx FVs1 LT LT1
H5 : prune_ctx FVs2 LT LT2
H6 : append LH LT1 LF1
H7 : {LF1 |- of M T}
H8 : append LH LT2 LF2
H9 : subset LT1 LT2
============================
 subset LH LH

Subgoal is:
 {LF2 |- of M T}

prune_typing_weakening < backchain subset_refl.
Subgoal 2.2:

Variables: FVs1 FVs2 LT LT1 LT2 LH LF1 LF2 M T
H1 : ctx LT
H2 : ctx LF1
H3 : ssubset FVs1 FVs2
H4 : prune_ctx FVs1 LT LT1
H5 : prune_ctx FVs2 LT LT2
H6 : append LH LT1 LF1
H7 : {LF1 |- of M T}
H8 : append LH LT2 LF2
H9 : subset LT1 LT2
============================
 is_list LH

Subgoal is:
 {LF2 |- of M T}

prune_typing_weakening < backchain append_arg1_islist.

Variables: FVs1 FVs2 LT LT1 LT2 LH LF1 LF2 M T
H1 : ctx LT
H2 : ctx LF1
H3 : ssubset FVs1 FVs2
H4 : prune_ctx FVs1 LT LT1
H5 : prune_ctx FVs2 LT LT2
H6 : append LH LT1 LF1
H7 : {LF1 |- of M T}
H8 : append LH LT2 LF2
H9 : subset LT1 LT2
H10 : subset LF1 LF2
============================
 {LF2 |- of M T}

prune_typing_weakening < backchain of_weakening with L = LF1.
Proof completed.
Abella < Theorem prune_typing_pres : 
forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L -> ctx_bvars L1 Ps ->
  vars_of_ctx L2 Vs -> bvars Ps -> {Ps |- fvars M Vs FVs} -> {L |- of M T} ->
  (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
       {L' |- of M T}).


============================
 forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L -> ctx_bvars L1 Ps ->
   vars_of_ctx L2 Vs -> bvars Ps -> {Ps |- fvars M Vs FVs} ->
   {L |- of M T} ->
   (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
        {L' |- of M T})

prune_typing_pres < induction on 6.

IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
============================
 forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L -> ctx_bvars L1 Ps ->
   vars_of_ctx L2 Vs -> bvars Ps -> {Ps |- fvars M Vs FVs}@ ->
   {L |- of M T} ->
   (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
        {L' |- of M T})

prune_typing_pres < intros.

Variables: L L1 L2 Ps Vs FVs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H6 : {Ps |- fvars M Vs FVs}@
H7 : {L |- of M T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H6.
Subgoal 1:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- notfree M}*
============================
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < exists L1.
Subgoal 1:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- notfree M}*
============================
 exists L2', prune_ctx nil L2 L2' /\ append L1 L2' L1 /\ ctx L1 /\
   {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < exists nil.
Subgoal 1:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- notfree M}*
============================
 prune_ctx nil L2 nil /\ append L1 nil L1 /\ ctx L1 /\ {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < split.
Subgoal 1.1:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- notfree M}*
============================
 prune_ctx nil L2 nil

Subgoal 1.2 is:
 append L1 nil L1

Subgoal 1.3 is:
 ctx L1

Subgoal 1.4 is:
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 1.2:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- notfree M}*
============================
 append L1 nil L1

Subgoal 1.3 is:
 ctx L1

Subgoal 1.4 is:
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_refl.
Subgoal 1.2:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- notfree M}*
============================
 is_list L1

Subgoal 1.3 is:
 ctx L1

Subgoal 1.4 is:
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg1_islist.
Subgoal 1.3:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- notfree M}*
============================
 ctx L1

Subgoal 1.4 is:
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset.
Subgoal 1.3:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- notfree M}*
============================
 subset L1 L

Subgoal 1.4 is:
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub1.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- notfree M}*
============================
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H8.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs M T F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H9 : {Ps, [F] |- notfree M}*
H10 : member F Ps
============================
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply bvars_mem to _ H10.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs M T X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H9 : {Ps, [notfree X] |- notfree M}*
H10 : member (notfree X) Ps
H11 : name X
============================
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H9.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H10 : member (notfree M) Ps
H11 : name M
============================
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_bvars_sync to _ H10.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs M T T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H10 : member (notfree M) Ps
H11 : name M
H12 : member (of M T1) L1
============================
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply append_sub1 to H2.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs M T T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H10 : member (notfree M) Ps
H11 : name M
H12 : member (of M T1) L1
H13 : subset L1 L
============================
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply subset_mem_trans to H13 H12.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs M T T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H10 : member (notfree M) Ps
H11 : name M
H12 : member (of M T1) L1
H13 : subset L1 L
H14 : member (of M T1) L
============================
 {L1 |- of M T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H11.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs T T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H7 : {L n1 |- of n1 T}
H10 : member (notfree n1) (Ps n1)
H12 : member (of n1 T1) (L1 n1)
H13 : subset (L1 n1) (L n1)
H14 : member (of n1 T1) (L n1)
============================
 {L1 n1 |- of n1 T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs T T1 F1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H10 : member (notfree n1) (Ps n1)
H12 : member (of n1 T1) (L1 n1)
H13 : subset (L1 n1) (L n1)
H14 : member (of n1 T1) (L n1)
H15 : {L n1, [F1 n1] |- of n1 T}
H16 : member (F1 n1) (L n1)
============================
 {L1 n1 |- of n1 T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_mem to _ H16.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs T T1 X1 T2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H10 : member (notfree n1) (Ps n1)
H12 : member (of n1 T1) (L1 n1)
H13 : subset (L1 n1) (L n1)
H14 : member (of n1 T1) (L n1)
H15 : {L n1, [of (X1 n1) T2] |- of n1 T}
H16 : member (of (X1 n1) T2) (L n1)
H17 : name (X1 n1)
H18 : {is_sty T2}
============================
 {L1 n1 |- of n1 T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H15.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs T T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H10 : member (notfree n1) (Ps n1)
H12 : member (of n1 T1) (L1 n1)
H13 : subset (L1 n1) (L n1)
H14 : member (of n1 T1) (L n1)
H16 : member (of n1 T) (L n1)
H17 : name n1
H18 : {is_sty T}
============================
 {L1 n1 |- of n1 T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_mem_sync to _ H14 H16.
Subgoal 1.4:

Variables: L L1 L2 Ps Vs T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H10 : member (notfree n1) (Ps n1)
H12 : member (of n1 T) (L1 n1)
H13 : subset (L1 n1) (L n1)
H14 : member (of n1 T) (L n1)
H16 : member (of n1 T) (L n1)
H17 : name n1
H18 : {is_sty T}
============================
 {L1 n1 |- of n1 T}

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 2:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
============================
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply memb_bvars_strengthening to _ H8.
Subgoal 2:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
============================
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_vars_of_ctx_sync to _ H4 _.
Subgoal 2.1:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
============================
 ctx L2

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset with L = L.
Subgoal 2.1:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
============================
 subset L2 L

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub2.
Subgoal 2.1:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
============================
 is_list L2

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg2_islist with L1 = L1, L = L.
Subgoal 2.1:

Variables: L L1 L2 Ps Vs M T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
============================
 is_list L

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_islist.
Subgoal 2:

Variables: L L1 L2 Ps Vs M T T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
============================
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L', append L1 (of M T1 :: nil) L'.
Subgoal 2.2:

Variables: L L1 L2 Ps Vs M T T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
============================
 exists L', append L1 (of M T1 :: nil) L'

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_exists[o].
Subgoal 2.2:

Variables: L L1 L2 Ps Vs M T T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
============================
 is_list L1

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg1_islist.
Subgoal 2:

Variables: L L1 L2 Ps Vs M T T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H11 : exists L', append L1 (of M T1 :: nil) L'
============================
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H11.
Subgoal 2:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
============================
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert subset L2 L.
Subgoal 2.3:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
============================
 subset L2 L

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub2.
Subgoal 2.3:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
============================
 is_list L2

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg2_islist with L1 = L1, L = L.
Subgoal 2.3:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
============================
 is_list L

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_islist.
Subgoal 2:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
============================
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert member (of M T1) L.
Subgoal 2.4:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
============================
 member (of M T1) L

Subgoal 2 is:
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain subset_mem_trans with L1 = L2.
Subgoal 2:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
============================
 exists L' L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < exists L'.
Subgoal 2:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
============================
 exists L2', prune_ctx (M :: nil) L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < exists of M T1 :: nil.
Subgoal 2:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
============================
 prune_ctx (M :: nil) L2 (of M T1 :: nil) /\ append L1 (of M T1 :: nil) L' /\
   ctx L' /\ {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < split.
Subgoal 2.5:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
============================
 prune_ctx (M :: nil) L2 (of M T1 :: nil)

Subgoal 2.6 is:
 append L1 (of M T1 :: nil) L'

Subgoal 2.7 is:
 ctx L'

Subgoal 2.8 is:
 {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 2.6:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
============================
 append L1 (of M T1 :: nil) L'

Subgoal 2.7 is:
 ctx L'

Subgoal 2.8 is:
 {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 2.7:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
============================
 ctx L'

Subgoal 2.8 is:
 {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset with L = L.
Subgoal 2.7:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
============================
 subset L' L

Subgoal 2.8 is:
 {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_subset_trans with L1 = L1, L2 = of M T1 :: nil.
Subgoal 2.7:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
============================
 subset L1 L

Subgoal 2.8 is:
 {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub1.
Subgoal 2.8:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
============================
 {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_name to _ _ H9.
Subgoal 2.8.1:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
============================
 ctx L2

Subgoal 2.8 is:
 {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset with L = L.
Subgoal 2.8:

Variables: L L1 L2 Ps Vs M T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps |- memb M Vs}*
H9 : {memb M Vs}
H10 : member (of M T1) L2
H12 : append L1 (of M T1 :: nil) L'
H13 : subset L2 L
H14 : member (of M T1) L
H15 : name M
============================
 {L' |- of M T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H15.
Subgoal 2.8:

Variables: L L1 L2 Ps Vs T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H7 : {L n1 |- of n1 T}
H8 : {Ps n1 |- memb n1 (Vs n1)}*
H9 : {memb n1 (Vs n1)}
H10 : member (of n1 T1) (L2 n1)
H12 : append (L1 n1) (of n1 T1 :: nil) (L' n1)
H13 : subset (L2 n1) (L n1)
H14 : member (of n1 T1) (L n1)
============================
 {L' n1 |- of n1 T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 2.8:

Variables: L L1 L2 Ps Vs T T1 L' F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H8 : {Ps n1 |- memb n1 (Vs n1)}*
H9 : {memb n1 (Vs n1)}
H10 : member (of n1 T1) (L2 n1)
H12 : append (L1 n1) (of n1 T1 :: nil) (L' n1)
H13 : subset (L2 n1) (L n1)
H14 : member (of n1 T1) (L n1)
H16 : {L n1, [F n1] |- of n1 T}
H17 : member (F n1) (L n1)
============================
 {L' n1 |- of n1 T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_mem to _ H17.
Subgoal 2.8:

Variables: L L1 L2 Ps Vs T T1 L' X T2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H8 : {Ps n1 |- memb n1 (Vs n1)}*
H9 : {memb n1 (Vs n1)}
H10 : member (of n1 T1) (L2 n1)
H12 : append (L1 n1) (of n1 T1 :: nil) (L' n1)
H13 : subset (L2 n1) (L n1)
H14 : member (of n1 T1) (L n1)
H16 : {L n1, [of (X n1) T2] |- of n1 T}
H17 : member (of (X n1) T2) (L n1)
H18 : name (X n1)
H19 : {is_sty T2}
============================
 {L' n1 |- of n1 T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H16.
Subgoal 2.8:

Variables: L L1 L2 Ps Vs T T1 L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H8 : {Ps n1 |- memb n1 (Vs n1)}*
H9 : {memb n1 (Vs n1)}
H10 : member (of n1 T1) (L2 n1)
H12 : append (L1 n1) (of n1 T1 :: nil) (L' n1)
H13 : subset (L2 n1) (L n1)
H14 : member (of n1 T1) (L n1)
H17 : member (of n1 T) (L n1)
H18 : name n1
H19 : {is_sty T}
============================
 {L' n1 |- of n1 T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_mem_sync to _ H14 H17.
Subgoal 2.8:

Variables: L L1 L2 Ps Vs T L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H8 : {Ps n1 |- memb n1 (Vs n1)}*
H9 : {memb n1 (Vs n1)}
H10 : member (of n1 T) (L2 n1)
H12 : append (L1 n1) (of n1 T :: nil) (L' n1)
H13 : subset (L2 n1) (L n1)
H14 : member (of n1 T) (L n1)
H17 : member (of n1 T) (L n1)
H18 : name n1
H19 : {is_sty T}
============================
 {L' n1 |- of n1 T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply append_sub2 to _ H12.
Subgoal 2.8:

Variables: L L1 L2 Ps Vs T L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H8 : {Ps n1 |- memb n1 (Vs n1)}*
H9 : {memb n1 (Vs n1)}
H10 : member (of n1 T) (L2 n1)
H12 : append (L1 n1) (of n1 T :: nil) (L' n1)
H13 : subset (L2 n1) (L n1)
H14 : member (of n1 T) (L n1)
H17 : member (of n1 T) (L n1)
H18 : name n1
H19 : {is_sty T}
H20 : subset (of n1 T :: nil) (L' n1)
============================
 {L' n1 |- of n1 T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H20.
Subgoal 2.8:

Variables: L L1 L2 Ps Vs T L'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx (L n1)
H2 : append (L1 n1) (L2 n1) (L n1)
H3 : ctx_bvars (L1 n1) (Ps n1)
H4 : vars_of_ctx (L2 n1) (Vs n1)
H5 : bvars (Ps n1)
H8 : {Ps n1 |- memb n1 (Vs n1)}*
H9 : {memb n1 (Vs n1)}
H10 : member (of n1 T) (L2 n1)
H12 : append (L1 n1) (of n1 T :: nil) (L' n1)
H13 : subset (L2 n1) (L n1)
H14 : member (of n1 T) (L n1)
H17 : member (of n1 T) (L n1)
H18 : name n1
H19 : {is_sty T}
H21 : member (of n1 T) (L' n1)
H22 : subset nil (L' n1)
============================
 {L' n1 |- of n1 T}

Subgoal 3 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 3:

Variables: L L1 L2 Ps Vs T X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of (nat X) T}
============================
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 3.1:

Variables: L L1 L2 Ps Vs X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) tnat}

Subgoal 3.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < exists L1.
Subgoal 3.1:

Variables: L L1 L2 Ps Vs X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 exists L2', prune_ctx nil L2 L2' /\ append L1 L2' L1 /\ ctx L1 /\
   {L1 |- of (nat X) tnat}

Subgoal 3.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < exists nil.
Subgoal 3.1:

Variables: L L1 L2 Ps Vs X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 prune_ctx nil L2 nil /\ append L1 nil L1 /\ ctx L1 /\
   {L1 |- of (nat X) tnat}

Subgoal 3.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < split.
Subgoal 3.1.1:

Variables: L L1 L2 Ps Vs X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 prune_ctx nil L2 nil

Subgoal 3.1.2 is:
 append L1 nil L1

Subgoal 3.1.3 is:
 ctx L1

Subgoal 3.1.4 is:
 {L1 |- of (nat X) tnat}

Subgoal 3.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 3.1.2:

Variables: L L1 L2 Ps Vs X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 append L1 nil L1

Subgoal 3.1.3 is:
 ctx L1

Subgoal 3.1.4 is:
 {L1 |- of (nat X) tnat}

Subgoal 3.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_refl.
Subgoal 3.1.2:

Variables: L L1 L2 Ps Vs X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 is_list L1

Subgoal 3.1.3 is:
 ctx L1

Subgoal 3.1.4 is:
 {L1 |- of (nat X) tnat}

Subgoal 3.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg1_islist.
Subgoal 3.1.3:

Variables: L L1 L2 Ps Vs X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 ctx L1

Subgoal 3.1.4 is:
 {L1 |- of (nat X) tnat}

Subgoal 3.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset.
Subgoal 3.1.3:

Variables: L L1 L2 Ps Vs X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 subset L1 L

Subgoal 3.1.4 is:
 {L1 |- of (nat X) tnat}

Subgoal 3.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub1.
Subgoal 3.1.4:

Variables: L L1 L2 Ps Vs X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 {L1 |- of (nat X) tnat}

Subgoal 3.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 3.2:

Variables: L L1 L2 Ps Vs T X F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {L, [F] |- of (nat X) T}
H9 : member F L
============================
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H9 H8.
Subgoal 3.2:

Variables: L L1 L2 Ps Vs X F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {L, [F] |- of (nat X) T1}
H9 : member F L
H10 : name (nat X)
============================
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (nat X) T1}

Subgoal 4 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H10.
Subgoal 4:

Variables: L L1 L2 Ps Vs FVs T M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of (pred M1) T}
H8 : {Ps |- fvars M1 Vs FVs}*
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 4.1:

Variables: L L1 L2 Ps Vs FVs M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L |- of M1 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) tnat}

Subgoal 4.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply IH to _ _ _ _ _ H8 H9.
Subgoal 4.1:

Variables: L L1 L2 Ps Vs FVs M1 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L |- of M1 tnat}
H10 : prune_ctx FVs L2 L2'
H11 : append L1 L2' L'
H12 : ctx L'
H13 : {L' |- of M1 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) tnat}

Subgoal 4.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 4.2:

Variables: L L1 L2 Ps Vs FVs T M1 F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L, [F] |- of (pred M1) T}
H10 : member F L
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H10 H9.
Subgoal 4.2:

Variables: L L1 L2 Ps Vs FVs M1 F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L, [F] |- of (pred M1) T1}
H10 : member F L
H11 : name (pred M1)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pred M1) T1}

Subgoal 5 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H11.
Subgoal 5:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of (plus M1 M2) T}
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\ ctx L'1 /\
  {L'1 |- of M1 tnat}.
Subgoal 5.1.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
============================
 exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\ ctx L'1 /\
   {L'1 |- of M1 tnat}

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain IH.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H13 : exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\
        ctx L'1 /\ {L'1 |- of M1 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H13.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\ ctx L'2 /\
  {L'2 |- of M2 tnat}.
Subgoal 5.1.2:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
============================
 exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\ ctx L'2 /\
   {L'2 |- of M2 tnat}

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain IH.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H18 : exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\
        ctx L'2 /\ {L'2 |- of M2 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H18.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {combine FVs1 FVs2 FVs}.
Subgoal 5.1.3:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
============================
 {combine FVs1 FVs2 FVs}

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_bvars_strengthening.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'.
Subgoal 5.1.4:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_prune_tail_ctx with FVs2 = FVs2.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H24 : exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H24.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert ctx L2.
Subgoal 5.1.5:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 ctx L2

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset.
Subgoal 5.1.5:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 subset L2 L

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub2.
Subgoal 5.1.5:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 is_list L2

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg2_islist with L1 = L1, L = L.
Subgoal 5.1.5:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 is_list L

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_islist.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L' |- of M1 tnat}.
Subgoal 5.1.6:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 {L' |- of M1 tnat}

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs1, FVs2 = FVs, LT = L2, LT1 = L2'1, LT2 = L2', LH = L1, LF1 = L'1.
Subgoal 5.1.6:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 ssubset FVs1 FVs

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub1.
Subgoal 5.1.6:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 is_list FVs

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L' |- of M2 tnat}.
Subgoal 5.1.7:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 tnat}
============================
 {L' |- of M2 tnat}

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs2, FVs2 = FVs, LT = L2, LT1 = L2'2, LT2 = L2', LH = L1, LF1 = L'2.
Subgoal 5.1.7:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 tnat}
============================
 ssubset FVs2 FVs

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub2.
Subgoal 5.1.7:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 tnat}
============================
 is_list FVs

Subgoal 5.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 5.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 tnat}
H12 : {L |- of M2 tnat}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 tnat}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 tnat}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 tnat}
H30 : {L' |- of M2 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) tnat}

Subgoal 5.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 5.2:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L, [F] |- of (plus M1 M2) T}
H12 : member F L
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H12 H11.
Subgoal 5.2:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L, [F] |- of (plus M1 M2) T1}
H12 : member F L
H13 : name (plus M1 M2)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (plus M1 M2) T1}

Subgoal 6 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H13.
Subgoal 6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of (ifz M3 M1 M2) T}
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'3 L2'3, prune_ctx FVs3 L2 L2'3 /\ append L1 L2'3 L'3 /\ ctx L'3 /\
  {L'3 |- of M3 tnat}.
Subgoal 6.1.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
============================
 exists L'3 L2'3, prune_ctx FVs3 L2 L2'3 /\ append L1 L2'3 L'3 /\ ctx L'3 /\
   {L'3 |- of M3 tnat}

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain IH.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H16 : exists L'3 L2'3, prune_ctx FVs3 L2 L2'3 /\ append L1 L2'3 L'3 /\
        ctx L'3 /\ {L'3 |- of M3 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H16.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\ ctx L'1 /\
  {L'1 |- of M1 T}.
Subgoal 6.1.2:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
============================
 exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\ ctx L'1 /\
   {L'1 |- of M1 T}

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain IH.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H21 : exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\
        ctx L'1 /\ {L'1 |- of M1 T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H21.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\ ctx L'2 /\
  {L'2 |- of M2 T}.
Subgoal 6.1.3:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
============================
 exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\ ctx L'2 /\
   {L'2 |- of M2 T}

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain IH.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H26 : exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\
        ctx L'2 /\ {L'2 |- of M2 T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H26.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {combine FVs3 FVs1 FVs1'}.
Subgoal 6.1.4:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
============================
 {combine FVs3 FVs1 FVs1'}

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_bvars_strengthening.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L' L2', prune_ctx FVs1' L2 L2' /\ append L1 L2' L' /\ ctx L'.
Subgoal 6.1.5:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
============================
 exists L' L2', prune_ctx FVs1' L2 L2' /\ append L1 L2' L' /\ ctx L'

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_prune_tail_ctx with FVs2 = FVs1.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H32 : exists L' L2', prune_ctx FVs1' L2 L2' /\ append L1 L2' L' /\ ctx L'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H32.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert ctx L2.
Subgoal 6.1.6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
============================
 ctx L2

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset.
Subgoal 6.1.6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
============================
 subset L2 L

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub2.
Subgoal 6.1.6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
============================
 is_list L2

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg2_islist with L1 = L1, L = L.
Subgoal 6.1.6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
============================
 is_list L

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_islist.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L' |- of M3 tnat}.
Subgoal 6.1.7:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
============================
 {L' |- of M3 tnat}

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs3, FVs2 = FVs1', LT = L2, LT1 = L2'3, LT2 = L2', LH = L1, LF1 = L'3.
Subgoal 6.1.7:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
============================
 ssubset FVs3 FVs1'

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub1.
Subgoal 6.1.7:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
============================
 is_list FVs1'

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L' |- of M1 T}.
Subgoal 6.1.8:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
============================
 {L' |- of M1 T}

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs1, FVs2 = FVs1', LT = L2, LT1 = L2'1, LT2 = L2', LH = L1, LF1 = L'1.
Subgoal 6.1.8:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
============================
 ssubset FVs1 FVs1'

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub2.
Subgoal 6.1.8:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
============================
 is_list FVs1'

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {combine FVs1' FVs2 FVs}.
Subgoal 6.1.9:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
============================
 {combine FVs1' FVs2 FVs}

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_bvars_strengthening.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'' L2'', prune_ctx FVs L2 L2'' /\ append L1 L2'' L'' /\ ctx L''.
Subgoal 6.1.10:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
============================
 exists L'' L2'', prune_ctx FVs L2 L2'' /\ append L1 L2'' L'' /\ ctx L''

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_prune_tail_ctx with FVs1 = FVs1', FVs2 = FVs2.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H40 : exists L'' L2'', prune_ctx FVs L2 L2'' /\ append L1 L2'' L'' /\ ctx L''
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H40.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L'' |- of M3 tnat}.
Subgoal 6.1.11:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
============================
 {L'' |- of M3 tnat}

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs1', FVs2 = FVs, LT = L2, LT1 = L2', LT2 = L2'', LH = L1, LF1 = L'.
Subgoal 6.1.11:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
============================
 ssubset FVs1' FVs

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub1.
Subgoal 6.1.11:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
============================
 is_list FVs

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
H44 : {L'' |- of M3 tnat}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L'' |- of M1 T}.
Subgoal 6.1.12:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
H44 : {L'' |- of M3 tnat}
============================
 {L'' |- of M1 T}

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs1', FVs2 = FVs, LT = L2, LT1 = L2', LT2 = L2'', LH = L1, LF1 = L'.
Subgoal 6.1.12:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
H44 : {L'' |- of M3 tnat}
============================
 ssubset FVs1' FVs

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub1.
Subgoal 6.1.12:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
H44 : {L'' |- of M3 tnat}
============================
 is_list FVs

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
H44 : {L'' |- of M3 tnat}
H45 : {L'' |- of M1 T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L'' |- of M2 T}.
Subgoal 6.1.13:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
H44 : {L'' |- of M3 tnat}
H45 : {L'' |- of M1 T}
============================
 {L'' |- of M2 T}

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs2, FVs2 = FVs, LT = L2, LT1 = L2'2, LT2 = L2'', LH = L1, LF1 = L'2.
Subgoal 6.1.13:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
H44 : {L'' |- of M3 tnat}
H45 : {L'' |- of M1 T}
============================
 ssubset FVs2 FVs

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub2.
Subgoal 6.1.13:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
H44 : {L'' |- of M3 tnat}
H45 : {L'' |- of M1 T}
============================
 is_list FVs

Subgoal 6.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 6.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 L'3 L2'3 L'1
           L2'1 L'2 L2'2 L' L2' L'' L2''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L |- of M3 tnat}
H14 : {L |- of M1 T}
H15 : {L |- of M2 T}
H17 : prune_ctx FVs3 L2 L2'3
H18 : append L1 L2'3 L'3
H19 : ctx L'3
H20 : {L'3 |- of M3 tnat}
H22 : prune_ctx FVs1 L2 L2'1
H23 : append L1 L2'1 L'1
H24 : ctx L'1
H25 : {L'1 |- of M1 T}
H27 : prune_ctx FVs2 L2 L2'2
H28 : append L1 L2'2 L'2
H29 : ctx L'2
H30 : {L'2 |- of M2 T}
H31 : {combine FVs3 FVs1 FVs1'}
H33 : prune_ctx FVs1' L2 L2'
H34 : append L1 L2' L'
H35 : ctx L'
H36 : ctx L2
H37 : {L' |- of M3 tnat}
H38 : {L' |- of M1 T}
H39 : {combine FVs1' FVs2 FVs}
H41 : prune_ctx FVs L2 L2''
H42 : append L1 L2'' L''
H43 : ctx L''
H44 : {L'' |- of M3 tnat}
H45 : {L'' |- of M1 T}
H46 : {L'' |- of M2 T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 6.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 6.2:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1' FVs1 FVs3 M2 M1 M3 F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L, [F] |- of (ifz M3 M1 M2) T}
H14 : member F L
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H14 H13.
Subgoal 6.2:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1' FVs1 FVs3 M2 M1 M3 F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M3 Vs FVs3}*
H9 : {Ps |- fvars M1 Vs FVs1}*
H10 : {Ps |- fvars M2 Vs FVs2}*
H11 : {Ps |- combine FVs3 FVs1 FVs1'}*
H12 : {Ps |- combine FVs1' FVs2 FVs}*
H13 : {L, [F] |- of (ifz M3 M1 M2) T1}
H14 : member F L
H15 : name (ifz M3 M1 M2)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (ifz M3 M1 M2) T1}

Subgoal 7 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H15.
Subgoal 7:

Variables: L L1 L2 Ps Vs T
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of unit T}
============================
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 7.1:

Variables: L L1 L2 Ps Vs
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit tunit}

Subgoal 7.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < exists L1.
Subgoal 7.1:

Variables: L L1 L2 Ps Vs
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 exists L2', prune_ctx nil L2 L2' /\ append L1 L2' L1 /\ ctx L1 /\
   {L1 |- of unit tunit}

Subgoal 7.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < exists nil.
Subgoal 7.1:

Variables: L L1 L2 Ps Vs
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 prune_ctx nil L2 nil /\ append L1 nil L1 /\ ctx L1 /\ {L1 |- of unit tunit}

Subgoal 7.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < split.
Subgoal 7.1.1:

Variables: L L1 L2 Ps Vs
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 prune_ctx nil L2 nil

Subgoal 7.1.2 is:
 append L1 nil L1

Subgoal 7.1.3 is:
 ctx L1

Subgoal 7.1.4 is:
 {L1 |- of unit tunit}

Subgoal 7.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 7.1.2:

Variables: L L1 L2 Ps Vs
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 append L1 nil L1

Subgoal 7.1.3 is:
 ctx L1

Subgoal 7.1.4 is:
 {L1 |- of unit tunit}

Subgoal 7.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_refl.
Subgoal 7.1.2:

Variables: L L1 L2 Ps Vs
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 is_list L1

Subgoal 7.1.3 is:
 ctx L1

Subgoal 7.1.4 is:
 {L1 |- of unit tunit}

Subgoal 7.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg1_islist.
Subgoal 7.1.3:

Variables: L L1 L2 Ps Vs
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 ctx L1

Subgoal 7.1.4 is:
 {L1 |- of unit tunit}

Subgoal 7.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset with L = L.
Subgoal 7.1.3:

Variables: L L1 L2 Ps Vs
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 subset L1 L

Subgoal 7.1.4 is:
 {L1 |- of unit tunit}

Subgoal 7.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub1.
Subgoal 7.1.4:

Variables: L L1 L2 Ps Vs
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
============================
 {L1 |- of unit tunit}

Subgoal 7.2 is:
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 7.2:

Variables: L L1 L2 Ps Vs T F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {L, [F] |- of unit T}
H9 : member F L
============================
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H9 H8.
Subgoal 7.2:

Variables: L L1 L2 Ps Vs F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {L, [F] |- of unit T1}
H9 : member F L
H10 : name unit
============================
 exists L' L2', prune_ctx nil L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of unit T1}

Subgoal 8 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H10.
Subgoal 8:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of (pair M1 M2) T}
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\ ctx L'1 /\
  {L'1 |- of M1 T1}.
Subgoal 8.1.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
============================
 exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\ ctx L'1 /\
   {L'1 |- of M1 T1}

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain IH.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H13 : exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\
        ctx L'1 /\ {L'1 |- of M1 T1}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H13.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\ ctx L'2 /\
  {L'2 |- of M2 T2}.
Subgoal 8.1.2:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
============================
 exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\ ctx L'2 /\
   {L'2 |- of M2 T2}

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain IH.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\
        ctx L'2 /\ {L'2 |- of M2 T2}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H18.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {combine FVs1 FVs2 FVs}.
Subgoal 8.1.3:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
============================
 {combine FVs1 FVs2 FVs}

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_bvars_strengthening.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'.
Subgoal 8.1.4:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_prune_tail_ctx with FVs2 = FVs2.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H24 : exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H24.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert ctx L2.
Subgoal 8.1.5:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 ctx L2

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset.
Subgoal 8.1.5:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 subset L2 L

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub2.
Subgoal 8.1.5:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 is_list L2

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg2_islist with L1 = L1, L = L.
Subgoal 8.1.5:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 is_list L

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_islist.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L' |- of M1 T1}.
Subgoal 8.1.6:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 {L' |- of M1 T1}

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs1, FVs2 = FVs, LT = L2, LT1 = L2'1, LT2 = L2', LH = L1, LF1 = L'1.
Subgoal 8.1.6:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 ssubset FVs1 FVs

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub1.
Subgoal 8.1.6:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 is_list FVs

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 T1}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L' |- of M2 T2}.
Subgoal 8.1.7:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 T1}
============================
 {L' |- of M2 T2}

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs2, FVs2 = FVs, LT = L2, LT1 = L2'2, LT2 = L2', LH = L1, LF1 = L'2.
Subgoal 8.1.7:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 T1}
============================
 ssubset FVs2 FVs

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub2.
Subgoal 8.1.7:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 T1}
============================
 is_list FVs

Subgoal 8.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 8.1:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 T2 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L |- of M2 T2}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T2}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 T1}
H30 : {L' |- of M2 T2}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) (prod T1 T2)}

Subgoal 8.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 8.2:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L, [F] |- of (pair M1 M2) T}
H12 : member F L
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H12 H11.
Subgoal 8.2:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L, [F] |- of (pair M1 M2) T1}
H12 : member F L
H13 : name (pair M1 M2)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (pair M1 M2) T1}

Subgoal 9 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H13.
Subgoal 9:

Variables: L L1 L2 Ps Vs FVs T M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of (fst M1) T}
H8 : {Ps |- fvars M1 Vs FVs}*
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 9.1:

Variables: L L1 L2 Ps Vs FVs T M1 T2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L |- of M1 (prod T T2)}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 9.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply IH to _ _ _ _ _ H8 H9.
Subgoal 9.1:

Variables: L L1 L2 Ps Vs FVs T M1 T2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L |- of M1 (prod T T2)}
H10 : prune_ctx FVs L2 L2'
H11 : append L1 L2' L'
H12 : ctx L'
H13 : {L' |- of M1 (prod T T2)}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 9.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 9.2:

Variables: L L1 L2 Ps Vs FVs T M1 F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L, [F] |- of (fst M1) T}
H10 : member F L
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H10 H9.
Subgoal 9.2:

Variables: L L1 L2 Ps Vs FVs M1 F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L, [F] |- of (fst M1) T1}
H10 : member F L
H11 : name (fst M1)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fst M1) T1}

Subgoal 10 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H11.
Subgoal 10:

Variables: L L1 L2 Ps Vs FVs T M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of (snd M1) T}
H8 : {Ps |- fvars M1 Vs FVs}*
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 10.1:

Variables: L L1 L2 Ps Vs FVs T M1 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L |- of M1 (prod T1 T)}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 10.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply IH to _ _ _ _ _ H8 H9.
Subgoal 10.1:

Variables: L L1 L2 Ps Vs FVs T M1 T1 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L |- of M1 (prod T1 T)}
H10 : prune_ctx FVs L2 L2'
H11 : append L1 L2' L'
H12 : ctx L'
H13 : {L' |- of M1 (prod T1 T)}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 10.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 10.2:

Variables: L L1 L2 Ps Vs FVs T M1 F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L, [F] |- of (snd M1) T}
H10 : member F L
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H10 H9.
Subgoal 10.2:

Variables: L L1 L2 Ps Vs FVs M1 F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs}*
H9 : {L, [F] |- of (snd M1) T1}
H10 : member F L
H11 : name (snd M1)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (snd M1) T1}

Subgoal 11 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H11.
Subgoal 11:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of (let M1 R) T}
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 11.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\ ctx L'1 /\
  {L'1 |- of M1 T1}.
Subgoal 11.1.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
============================
 exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\ ctx L'1 /\
   {L'1 |- of M1 T1}

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain IH.
Subgoal 11.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H13 : exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\
        ctx L'1 /\ {L'1 |- of M1 T1}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H13.
Subgoal 11.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply IH to _ _ _ _ _ H9 H12.
Subgoal 11.1.2:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
============================
 ctx (of n1 T1 :: L)

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_extend.
Subgoal 11.1.2:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
============================
 {is_sty T1}

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain of_is_sty.
Subgoal 11.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {combine FVs1 FVs2 FVs}.
Subgoal 11.1.3:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
============================
 {combine FVs1 FVs2 FVs}

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_bvars_strengthening.
Subgoal 11.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'.
Subgoal 11.1.4:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_prune_tail_ctx with FVs1 = FVs1, FVs2 = FVs2, LT1 = L2'1, LT2 = L2' n1.
Subgoal 11.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H23 : exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H23.
Subgoal 11.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert ctx L2.
Subgoal 11.1.5:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
============================
 ctx L2

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset.
Subgoal 11.1.5:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
============================
 subset L2 L

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub2.
Subgoal 11.1.5:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
============================
 is_list L2

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg2_islist with L1 = L1, L = L.
Subgoal 11.1.5:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
============================
 is_list L

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_islist.
Subgoal 11.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
H27 : ctx L2
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L'2 |- of M1 T1}.
Subgoal 11.1.6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
H27 : ctx L2
============================
 {L'2 |- of M1 T1}

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs1, FVs2 = FVs, LT = L2, LT1 = L2'1, LT2 = L2'2, LH = L1, LF1 = L'1.
Subgoal 11.1.6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
H27 : ctx L2
============================
 ssubset FVs1 FVs

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub1.
Subgoal 11.1.6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
H27 : ctx L2
============================
 is_list FVs

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 11.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
H27 : ctx L2
H28 : {L'2 |- of M1 T1}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply prune_typing_weakening to _ _ _ H18 H24 H19 H21 _.
Subgoal 11.1.7:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
H27 : ctx L2
H28 : {L'2 |- of M1 T1}
============================
 ssubset FVs2 FVs

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub2.
Subgoal 11.1.7:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
H27 : ctx L2
H28 : {L'2 |- of M1 T1}
============================
 is_list FVs

Subgoal 11.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 11.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 T1 L'1 L2'1 L' L2' L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 T1}
H12 : {L, of n1 T1 |- of (R n1) T}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 T1}
H18 : prune_ctx FVs2 L2 (L2' n1)
H19 : append (of n1 T1 :: L1) (L2' n1) (L' n1)
H20 : ctx (L' n1)
H21 : {L' n1 |- of (R n1) T}
H22 : {combine FVs1 FVs2 FVs}
H24 : prune_ctx FVs L2 L2'2
H25 : append L1 L2'2 L'2
H26 : ctx L'2
H27 : ctx L2
H28 : {L'2 |- of M1 T1}
H29 : {L'2, of n1 T1 |- of (R n1) T}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 11.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 11.2:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 R M1 F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L, [F] |- of (let M1 R) T}
H12 : member F L
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H12 H11.
Subgoal 11.2:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 R M1 F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps, notfree n1 |- fvars (R n1) Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L, [F] |- of (let M1 R) T1}
H12 : member F L
H13 : name (let M1 R)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (let M1 R) T1}

Subgoal 12 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H13.
Subgoal 12:

Variables: L L1 L2 Ps Vs FVs T R
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of (fix R) T}
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 12.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply IH to _ _ _ _ _ H8 H9.
Subgoal 12.1.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
============================
 ctx (of n2 T1 :: of n1 (arr T1 T2) :: L)

Subgoal 12.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply is_sty_str to _ H10.
Subgoal 12.1.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H11 : {is_sty (arr T1 T2)}
============================
 ctx (of n2 T1 :: of n1 (arr T1 T2) :: L)

Subgoal 12.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H11.
Subgoal 12.1.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H12 : {is_sty T1}
H13 : {is_sty T2}
============================
 ctx (of n2 T1 :: of n1 (arr T1 T2) :: L)

Subgoal 12.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_extend.
Subgoal 12.1.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H12 : {is_sty T1}
H13 : {is_sty T2}
============================
 ctx (of n1 (arr T1 T2) :: L)

Subgoal 12.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_extend.
Subgoal 12.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H11 : prune_ctx FVs L2 (L2' n1 n2)
H12 : append (of n2 T1 :: of n1 (arr T1 T2) :: L1) (L2' n1 n2) (L' n1 n2)
H13 : ctx (L' n1 n2)
H14 : {L' n1 n2 |- of (R n1 n2) T2}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H12.
Subgoal 12.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1 L2' L5
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H11 : prune_ctx FVs L2 (L2' n1 n2)
H13 : ctx (of n2 T1 :: L5 n2 n1)
H14 : {L5 n2 n1, of n2 T1 |- of (R n1 n2) T2}
H15 : append (of n1 (arr T1 T2) :: L1) (L2' n1 n2) (L5 n2 n1)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H15.
Subgoal 12.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1 L2' L6
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H11 : prune_ctx FVs L2 (L2' n1 n2)
H13 : ctx (of n2 T1 :: of n1 (arr T1 T2) :: L6 n1 n2)
H14 : {L6 n1 n2, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H16 : append L1 (L2' n1 n2) (L6 n1 n2)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply prune_ctx_prune_tm to H11.
Subgoal 12.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1 L6 L''
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H11 : prune_ctx FVs L2 (L'' n2)
H13 : ctx (of n2 T1 :: of n1 (arr T1 T2) :: L6 n1 n2)
H14 : {L6 n1 n2, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H16 : append L1 (L'' n2) (L6 n1 n2)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply prune_ctx_prune_tm to H11.
Subgoal 12.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1 L6 L''1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H11 : prune_ctx FVs L2 L''1
H13 : ctx (of n2 T1 :: of n1 (arr T1 T2) :: L6 n1 n2)
H14 : {L6 n1 n2, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H16 : append L1 L''1 (L6 n1 n2)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply append_prune to H16.
Subgoal 12.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1 L''1 L3'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H11 : prune_ctx FVs L2 L''1
H13 : ctx (of n2 T1 :: of n1 (arr T1 T2) :: L3' n2)
H14 : {L3' n2, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H16 : append L1 L''1 (L3' n2)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply append_prune to H16.
Subgoal 12.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1 L''1 L3'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H11 : prune_ctx FVs L2 L''1
H13 : ctx (of n2 T1 :: of n1 (arr T1 T2) :: L3'1)
H14 : {L3'1, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H16 : append L1 L''1 L3'1
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H13.
Subgoal 12.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1 L''1 L3'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H11 : prune_ctx FVs L2 L''1
H14 : {L3'1, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H16 : append L1 L''1 L3'1
H17 : ctx (of n1 (arr T1 T2) :: L3'1)
H18 : name n2
H19 : {is_sty T1}
H20 : forall T', member (of n2 T') (of n1 (arr T1 T2) :: L3'1) -> T1 = T'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H17.
Subgoal 12.1:

Variables: L L1 L2 Ps Vs FVs R T2 T1 L''1 L3'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H10 : {L |- is_sty (arr T1 T2)}
H11 : prune_ctx FVs L2 L''1
H14 : {L3'1, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H16 : append L1 L''1 L3'1
H18 : name n2
H19 : {is_sty T1}
H20 : forall T', member (of n2 T') (of n1 (arr T1 T2) :: L3'1) -> T1 = T'
H21 : ctx L3'1
H22 : name n1
H23 : {is_sty (arr T1 T2)}
H24 : forall T', member (of n1 T') L3'1 -> arr T1 T2 = T'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) (arr T1 T2)}

Subgoal 12.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 12.2:

Variables: L L1 L2 Ps Vs FVs T R F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, [F] |- of (fix R) T}
H10 : member F L
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H10 H9.
Subgoal 12.2:

Variables: L L1 L2 Ps Vs FVs R F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps, notfree n1, notfree n2 |- fvars (R n1 n2) Vs FVs}*
H9 : {L, [F] |- of (fix R) T1}
H10 : member F L
H11 : name (fix R)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (fix R) T1}

Subgoal 13 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H11.
Subgoal 13:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of (app M1 M2) T}
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H7.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\ ctx L'1 /\
  {L'1 |- of M1 (arr T1 T)}.
Subgoal 13.1.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
============================
 exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\ ctx L'1 /\
   {L'1 |- of M1 (arr T1 T)}

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain IH.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H13 : exists L'1 L2'1, prune_ctx FVs1 L2 L2'1 /\ append L1 L2'1 L'1 /\
        ctx L'1 /\ {L'1 |- of M1 (arr T1 T)}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H13.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\ ctx L'2 /\
  {L'2 |- of M2 T1}.
Subgoal 13.1.2:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
============================
 exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\ ctx L'2 /\
   {L'2 |- of M2 T1}

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain IH.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H18 : exists L'2 L2'2, prune_ctx FVs2 L2 L2'2 /\ append L1 L2'2 L'2 /\
        ctx L'2 /\ {L'2 |- of M2 T1}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H18.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {combine FVs1 FVs2 FVs}.
Subgoal 13.1.3:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
============================
 {combine FVs1 FVs2 FVs}

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_bvars_strengthening.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'.
Subgoal 13.1.4:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_prune_tail_ctx with FVs2 = FVs2.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H24 : exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H24.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert ctx L2.
Subgoal 13.1.5:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 ctx L2

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_subset.
Subgoal 13.1.5:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 subset L2 L

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_sub2.
Subgoal 13.1.5:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 is_list L2

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain append_arg2_islist with L1 = L1, L = L.
Subgoal 13.1.5:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
============================
 is_list L

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain ctx_islist.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L' |- of M1 (arr T1 T)}.
Subgoal 13.1.6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 {L' |- of M1 (arr T1 T)}

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs1, FVs2 = FVs, LT = L2, LT1 = L2'1, LT2 = L2', LH = L1, LF1 = L'1.
Subgoal 13.1.6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 ssubset FVs1 FVs

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub1.
Subgoal 13.1.6:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
============================
 is_list FVs

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 (arr T1 T)}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < assert {L' |- of M2 T1}.
Subgoal 13.1.7:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 (arr T1 T)}
============================
 {L' |- of M2 T1}

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_typing_weakening with FVs1 = FVs2, FVs2 = FVs, LT = L2, LT1 = L2'2, LT2 = L2', LH = L1, LF1 = L'2.
Subgoal 13.1.7:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 (arr T1 T)}
============================
 ssubset FVs2 FVs

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain combine_sub2.
Subgoal 13.1.7:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 (arr T1 T)}
============================
 is_list FVs

Subgoal 13.1 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < backchain prune_ctx_input_islist.
Subgoal 13.1:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 T1 L'1 L2'1 L'2 L2'2 L' L2'
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L |- of M1 (arr T1 T)}
H12 : {L |- of M2 T1}
H14 : prune_ctx FVs1 L2 L2'1
H15 : append L1 L2'1 L'1
H16 : ctx L'1
H17 : {L'1 |- of M1 (arr T1 T)}
H19 : prune_ctx FVs2 L2 L2'2
H20 : append L1 L2'2 L'2
H21 : ctx L'2
H22 : {L'2 |- of M2 T1}
H23 : {combine FVs1 FVs2 FVs}
H25 : prune_ctx FVs L2 L2'
H26 : append L1 L2' L'
H27 : ctx L'
H28 : ctx L2
H29 : {L' |- of M1 (arr T1 T)}
H30 : {L' |- of M2 T1}
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 13.2 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < search.
Subgoal 13.2:

Variables: L L1 L2 Ps Vs FVs T FVs2 FVs1 M2 M1 F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L, [F] |- of (app M1 M2) T}
H12 : member F L
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply ctx_focus_inv to _ H12 H11.
Subgoal 13.2:

Variables: L L1 L2 Ps Vs FVs FVs2 FVs1 M2 M1 F T1
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H8 : {Ps |- fvars M1 Vs FVs1}*
H9 : {Ps |- fvars M2 Vs FVs2}*
H10 : {Ps |- combine FVs1 FVs2 FVs}*
H11 : {L, [F] |- of (app M1 M2) T1}
H12 : member F L
H13 : name (app M1 M2)
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of (app M1 M2) T1}

Subgoal 14 is:
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H13.
Subgoal 14:

Variables: L L1 L2 Ps Vs FVs M T F
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps, [F] |- fvars M Vs FVs}*
H9 : member F Ps
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < apply bvars_mem to _ H9.
Subgoal 14:

Variables: L L1 L2 Ps Vs FVs M T X
IH : forall L L1 L2 Ps Vs FVs M T, ctx L -> append L1 L2 L ->
       ctx_bvars L1 Ps -> vars_of_ctx L2 Vs -> bvars Ps ->
       {Ps |- fvars M Vs FVs}* -> {L |- of M T} ->
       (exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
            {L' |- of M T})
H1 : ctx L
H2 : append L1 L2 L
H3 : ctx_bvars L1 Ps
H4 : vars_of_ctx L2 Vs
H5 : bvars Ps
H7 : {L |- of M T}
H8 : {Ps, [notfree X] |- fvars M Vs FVs}*
H9 : member (notfree X) Ps
H10 : name X
============================
 exists L' L2', prune_ctx FVs L2 L2' /\ append L1 L2' L' /\ ctx L' /\
   {L' |- of M T}

prune_typing_pres < case H8.
Proof completed.
Abella < Theorem fvars_typing_pres : 
forall L Vs M T FVs, ctx L -> vars_of_ctx L Vs -> {L |- of M T} ->
  {fvars M Vs FVs} -> (exists L', prune_ctx FVs L L' /\ {L' |- of M T}).


============================
 forall L Vs M T FVs, ctx L -> vars_of_ctx L Vs -> {L |- of M T} ->
   {fvars M Vs FVs} -> (exists L', prune_ctx FVs L L' /\ {L' |- of M T})

fvars_typing_pres < intros.

Variables: L Vs M T FVs
H1 : ctx L
H2 : vars_of_ctx L Vs
H3 : {L |- of M T}
H4 : {fvars M Vs FVs}
============================
 exists L', prune_ctx FVs L L' /\ {L' |- of M T}

fvars_typing_pres < apply prune_typing_pres to _ _ _ _ _ H4 H3.

Variables: L Vs M T FVs L' L2'
H1 : ctx L
H2 : vars_of_ctx L Vs
H3 : {L |- of M T}
H4 : {fvars M Vs FVs}
H5 : prune_ctx FVs L L2'
H6 : append nil L2' L'
H7 : ctx L'
H8 : {L' |- of M T}
============================
 exists L', prune_ctx FVs L L' /\ {L' |- of M T}

fvars_typing_pres < case H6.

Variables: L Vs M T FVs L'
H1 : ctx L
H2 : vars_of_ctx L Vs
H3 : {L |- of M T}
H4 : {fvars M Vs FVs}
H5 : prune_ctx FVs L L'
H7 : ctx L'
H8 : {L' |- of M T}
============================
 exists L', prune_ctx FVs L L' /\ {L' |- of M T}

fvars_typing_pres < search.
Proof completed.
Abella < Define good_map : (list o) -> (list (map tm tm')) -> (list o) -> prop by 
good_map CL nil nil;
good_map CL (map X M :: ML) (of X T :: SL) := name X /\ {CL |- of' M T} /\ good_map CL ML SL.

Abella < Theorem good_map_name : 
forall CL Map SL X M, good_map CL Map SL -> {memb (map X M) Map} -> name X.


============================
 forall CL Map SL X M, good_map CL Map SL -> {memb (map X M) Map} -> name X

good_map_name < induction on 2.

IH : forall CL Map SL X M, good_map CL Map SL -> {memb (map X M) Map}* ->
       name X
============================
 forall CL Map SL X M, good_map CL Map SL -> {memb (map X M) Map}@ -> name X

good_map_name < intros.

Variables: CL Map SL X M
IH : forall CL Map SL X M, good_map CL Map SL -> {memb (map X M) Map}* ->
       name X
H1 : good_map CL Map SL
H2 : {memb (map X M) Map}@
============================
 name X

good_map_name < case H2.
Subgoal 1:

Variables: CL SL X M L
IH : forall CL Map SL X M, good_map CL Map SL -> {memb (map X M) Map}* ->
       name X
H1 : good_map CL (map X M :: L) SL
============================
 name X

Subgoal 2 is:
 name X

good_map_name < case H1.
Subgoal 1:

Variables: CL X M L SL1 T
IH : forall CL Map SL X M, good_map CL Map SL -> {memb (map X M) Map}* ->
       name X
H3 : name X
H4 : {CL |- of' M T}
H5 : good_map CL L SL1
============================
 name X

Subgoal 2 is:
 name X

good_map_name < search.
Subgoal 2:

Variables: CL SL X M L X1
IH : forall CL Map SL X M, good_map CL Map SL -> {memb (map X M) Map}* ->
       name X
H1 : good_map CL (X1 :: L) SL
H3 : {memb (map X M) L}*
============================
 name X

good_map_name < case H1.
Subgoal 2:

Variables: CL X M L SL1 T X2 M1
IH : forall CL Map SL X M, good_map CL Map SL -> {memb (map X M) Map}* ->
       name X
H3 : {memb (map X M) L}*
H4 : name X2
H5 : {CL |- of' M1 T}
H6 : good_map CL L SL1
============================
 name X

good_map_name < apply IH to _ H3.
Subgoal 2:

Variables: CL X M L SL1 T X2 M1
IH : forall CL Map SL X M, good_map CL Map SL -> {memb (map X M) Map}* ->
       name X
H3 : {memb (map X M) L}*
H4 : name X2
H5 : {CL |- of' M1 T}
H6 : good_map CL L SL1
H7 : name X
============================
 name X

good_map_name < search.
Proof completed.
Abella < Theorem good_map_of' : 
forall CL Map SL M X, good_map CL Map SL -> {memb (map X M) Map} ->
  (exists T, member (of X T) SL /\ {CL |- of' M T}).


============================
 forall CL Map SL M X, good_map CL Map SL -> {memb (map X M) Map} ->
   (exists T, member (of X T) SL /\ {CL |- of' M T})

good_map_of' < induction on 2.

IH : forall CL Map SL M X, good_map CL Map SL -> {memb (map X M) Map}* ->
       (exists T, member (of X T) SL /\ {CL |- of' M T})
============================
 forall CL Map SL M X, good_map CL Map SL -> {memb (map X M) Map}@ ->
   (exists T, member (of X T) SL /\ {CL |- of' M T})

good_map_of' < intros.

Variables: CL Map SL M X
IH : forall CL Map SL M X, good_map CL Map SL -> {memb (map X M) Map}* ->
       (exists T, member (of X T) SL /\ {CL |- of' M T})
H1 : good_map CL Map SL
H2 : {memb (map X M) Map}@
============================
 exists T, member (of X T) SL /\ {CL |- of' M T}

good_map_of' < case H2.
Subgoal 1:

Variables: CL SL M X L
IH : forall CL Map SL M X, good_map CL Map SL -> {memb (map X M) Map}* ->
       (exists T, member (of X T) SL /\ {CL |- of' M T})
H1 : good_map CL (map X M :: L) SL
============================
 exists T, member (of X T) SL /\ {CL |- of' M T}

Subgoal 2 is:
 exists T, member (of X T) SL /\ {CL |- of' M T}

good_map_of' < case H1.
Subgoal 1:

Variables: CL M X L SL1 T
IH : forall CL Map SL M X, good_map CL Map SL -> {memb (map X M) Map}* ->
       (exists T, member (of X T) SL /\ {CL |- of' M T})
H3 : name X
H4 : {CL |- of' M T}
H5 : good_map CL L SL1
============================
 exists T1, member (of X T1) (of X T :: SL1) /\ {CL |- of' M T1}

Subgoal 2 is:
 exists T, member (of X T) SL /\ {CL |- of' M T}

good_map_of' < search.
Subgoal 2:

Variables: CL SL M X L X1
IH : forall CL Map SL M X, good_map CL Map SL -> {memb (map X M) Map}* ->
       (exists T, member (of X T) SL /\ {CL |- of' M T})
H1 : good_map CL (X1 :: L) SL
H3 : {memb (map X M) L}*
============================
 exists T, member (of X T) SL /\ {CL |- of' M T}

good_map_of' < case H1.
Subgoal 2:

Variables: CL M X L SL1 T X2 M1
IH : forall CL Map SL M X, good_map CL Map SL -> {memb (map X M) Map}* ->
       (exists T, member (of X T) SL /\ {CL |- of' M T})
H3 : {memb (map X M) L}*
H4 : name X2
H5 : {CL |- of' M1 T}
H6 : good_map CL L SL1
============================
 exists T1, member (of X T1) (of X2 T :: SL1) /\ {CL |- of' M T1}

good_map_of' < apply IH to _ H3.
Subgoal 2:

Variables: CL M X L SL1 T X2 M1 T1
IH : forall CL Map SL M X, good_map CL Map SL -> {memb (map X M) Map}* ->
       (exists T, member (of X T) SL /\ {CL |- of' M T})
H3 : {memb (map X M) L}*
H4 : name X2
H5 : {CL |- of' M1 T}
H6 : good_map CL L SL1
H7 : member (of X T1) SL1
H8 : {CL |- of' M T1}
============================
 exists T1, member (of X T1) (of X2 T :: SL1) /\ {CL |- of' M T1}

good_map_of' < search.
Proof completed.
Abella < Theorem good_map_extend_ctx' : 
forall SL CL Map Y T, good_map CL Map SL -> good_map (of' Y T :: CL) Map SL.


============================
 forall SL CL Map Y T, good_map CL Map SL -> good_map (of' Y T :: CL) Map SL

good_map_extend_ctx' < induction on 1.

IH : forall SL CL Map Y T, good_map CL Map SL * ->
       good_map (of' Y T :: CL) Map SL
============================
 forall SL CL Map Y T, good_map CL Map SL @ ->
   good_map (of' Y T :: CL) Map SL

good_map_extend_ctx' < intros.

Variables: SL CL Map Y T
IH : forall SL CL Map Y T, good_map CL Map SL * ->
       good_map (of' Y T :: CL) Map SL
H1 : good_map CL Map SL @
============================
 good_map (of' Y T :: CL) Map SL

good_map_extend_ctx' < case H1.
Subgoal 1:

Variables: CL Y T
IH : forall SL CL Map Y T, good_map CL Map SL * ->
       good_map (of' Y T :: CL) Map SL
============================
 good_map (of' Y T :: CL) nil nil

Subgoal 2 is:
 good_map (of' Y T :: CL) (map X M :: ML) (of X T1 :: SL1)

good_map_extend_ctx' < search.
Subgoal 2:

Variables: CL Y T SL1 T1 X ML M
IH : forall SL CL Map Y T, good_map CL Map SL * ->
       good_map (of' Y T :: CL) Map SL
H2 : name X
H3 : {CL |- of' M T1}
H4 : good_map CL ML SL1 *
============================
 good_map (of' Y T :: CL) (map X M :: ML) (of X T1 :: SL1)

good_map_extend_ctx' < unfold.
Subgoal 2.1:

Variables: CL Y T SL1 T1 X ML M
IH : forall SL CL Map Y T, good_map CL Map SL * ->
       good_map (of' Y T :: CL) Map SL
H2 : name X
H3 : {CL |- of' M T1}
H4 : good_map CL ML SL1 *
============================
 name X

Subgoal 2.2 is:
 {CL, of' Y T |- of' M T1}

Subgoal 2.3 is:
 good_map (of' Y T :: CL) ML SL1

good_map_extend_ctx' < search.
Subgoal 2.2:

Variables: CL Y T SL1 T1 X ML M
IH : forall SL CL Map Y T, good_map CL Map SL * ->
       good_map (of' Y T :: CL) Map SL
H2 : name X
H3 : {CL |- of' M T1}
H4 : good_map CL ML SL1 *
============================
 {CL, of' Y T |- of' M T1}

Subgoal 2.3 is:
 good_map (of' Y T :: CL) ML SL1

good_map_extend_ctx' < search.
Subgoal 2.3:

Variables: CL Y T SL1 T1 X ML M
IH : forall SL CL Map Y T, good_map CL Map SL * ->
       good_map (of' Y T :: CL) Map SL
H2 : name X
H3 : {CL |- of' M T1}
H4 : good_map CL ML SL1 *
============================
 good_map (of' Y T :: CL) ML SL1

good_map_extend_ctx' < backchain IH.
Proof completed.
Abella < Theorem good_map_extend_map : 
forall CL Map SL X Y T, good_map CL Map SL -> name X ->
  good_map (of' Y T :: CL) (map X Y :: Map) (of X T :: SL).


============================
 forall CL Map SL X Y T, good_map CL Map SL -> name X ->
   good_map (of' Y T :: CL) (map X Y :: Map) (of X T :: SL)

good_map_extend_map < intros.

Variables: CL Map SL X Y T
H1 : good_map CL Map SL
H2 : name X
============================
 good_map (of' Y T :: CL) (map X Y :: Map) (of X T :: SL)

good_map_extend_map < unfold.
Subgoal 1:

Variables: CL Map SL X Y T
H1 : good_map CL Map SL
H2 : name X
============================
 name X

Subgoal 2 is:
 {CL, of' Y T |- of' Y T}

Subgoal 3 is:
 good_map (of' Y T :: CL) Map SL

good_map_extend_map < search.
Subgoal 2:

Variables: CL Map SL X Y T
H1 : good_map CL Map SL
H2 : name X
============================
 {CL, of' Y T |- of' Y T}

Subgoal 3 is:
 good_map (of' Y T :: CL) Map SL

good_map_extend_map < search.
Subgoal 3:

Variables: CL Map SL X Y T
H1 : good_map CL Map SL
H2 : name X
============================
 good_map (of' Y T :: CL) Map SL

good_map_extend_map < backchain good_map_extend_ctx'.
Proof completed.
Abella < Theorem good_map_csnd : 
forall M SL X T RT, good_map (of' (snd' X) RT :: nil) M SL ->
  good_map (of' X (prod T RT) :: nil) M SL.


============================
 forall M SL X T RT, good_map (of' (snd' X) RT :: nil) M SL ->
   good_map (of' X (prod T RT) :: nil) M SL

good_map_csnd < induction on 1.

IH : forall M SL X T RT, good_map (of' (snd' X) RT :: nil) M SL * ->
       good_map (of' X (prod T RT) :: nil) M SL
============================
 forall M SL X T RT, good_map (of' (snd' X) RT :: nil) M SL @ ->
   good_map (of' X (prod T RT) :: nil) M SL

good_map_csnd < intros.

Variables: M SL X T RT
IH : forall M SL X T RT, good_map (of' (snd' X) RT :: nil) M SL * ->
       good_map (of' X (prod T RT) :: nil) M SL
H1 : good_map (of' (snd' X) RT :: nil) M SL @
============================
 good_map (of' X (prod T RT) :: nil) M SL

good_map_csnd < case H1.
Subgoal 1:

Variables: X T RT
IH : forall M SL X T RT, good_map (of' (snd' X) RT :: nil) M SL * ->
       good_map (of' X (prod T RT) :: nil) M SL
============================
 good_map (of' X (prod T RT) :: nil) nil nil

Subgoal 2 is:
 good_map (of' X (prod T RT) :: nil) (map X1 M1 :: ML) (of X1 T1 :: SL1)

good_map_csnd < search.
Subgoal 2:

Variables: X T RT SL1 T1 X1 ML M1
IH : forall M SL X T RT, good_map (of' (snd' X) RT :: nil) M SL * ->
       good_map (of' X (prod T RT) :: nil) M SL
H2 : name X1
H3 : {of' (snd' X) RT |- of' M1 T1}
H4 : good_map (of' (snd' X) RT :: nil) ML SL1 *
============================
 good_map (of' X (prod T RT) :: nil) (map X1 M1 :: ML) (of X1 T1 :: SL1)

good_map_csnd < assert {of' X (prod T RT) |- of' (snd' X) RT}.
Subgoal 2:

Variables: X T RT SL1 T1 X1 ML M1
IH : forall M SL X T RT, good_map (of' (snd' X) RT :: nil) M SL * ->
       good_map (of' X (prod T RT) :: nil) M SL
H2 : name X1
H3 : {of' (snd' X) RT |- of' M1 T1}
H4 : good_map (of' (snd' X) RT :: nil) ML SL1 *
H5 : {of' X (prod T RT) |- of' (snd' X) RT}
============================
 good_map (of' X (prod T RT) :: nil) (map X1 M1 :: ML) (of X1 T1 :: SL1)

good_map_csnd < cut H3 with H5.
Subgoal 2:

Variables: X T RT SL1 T1 X1 ML M1
IH : forall M SL X T RT, good_map (of' (snd' X) RT :: nil) M SL * ->
       good_map (of' X (prod T RT) :: nil) M SL
H2 : name X1
H3 : {of' (snd' X) RT |- of' M1 T1}
H4 : good_map (of' (snd' X) RT :: nil) ML SL1 *
H5 : {of' X (prod T RT) |- of' (snd' X) RT}
H6 : {of' X (prod T RT) |- of' M1 T1}
============================
 good_map (of' X (prod T RT) :: nil) (map X1 M1 :: ML) (of X1 T1 :: SL1)

good_map_csnd < apply IH to H4 with T = T.
Subgoal 2:

Variables: X T RT SL1 T1 X1 ML M1
IH : forall M SL X T RT, good_map (of' (snd' X) RT :: nil) M SL * ->
       good_map (of' X (prod T RT) :: nil) M SL
H2 : name X1
H3 : {of' (snd' X) RT |- of' M1 T1}
H4 : good_map (of' (snd' X) RT :: nil) ML SL1 *
H5 : {of' X (prod T RT) |- of' (snd' X) RT}
H6 : {of' X (prod T RT) |- of' M1 T1}
H7 : good_map (of' X (prod T RT) :: nil) ML SL1
============================
 good_map (of' X (prod T RT) :: nil) (map X1 M1 :: ML) (of X1 T1 :: SL1)

good_map_csnd < search.
Proof completed.
Abella < Define reified_env : (list o) -> ty -> prop by 
reified_env nil tunit;
reified_env (of X T :: SL) (prod T RT) := reified_env SL RT.

Abella < Theorem reified_env_sty : 
forall L T, ctx L -> reified_env L T -> {is_sty T}.


============================
 forall L T, ctx L -> reified_env L T -> {is_sty T}

reified_env_sty < induction on 2.

IH : forall L T, ctx L -> reified_env L T * -> {is_sty T}
============================
 forall L T, ctx L -> reified_env L T @ -> {is_sty T}

reified_env_sty < intros.

Variables: L T
IH : forall L T, ctx L -> reified_env L T * -> {is_sty T}
H1 : ctx L
H2 : reified_env L T @
============================
 {is_sty T}

reified_env_sty < case H2.
Subgoal 1:

IH : forall L T, ctx L -> reified_env L T * -> {is_sty T}
H1 : ctx nil
============================
 {is_sty tunit}

Subgoal 2 is:
 {is_sty (prod T1 RT)}

reified_env_sty < search.
Subgoal 2:

Variables: RT T1 SL X
IH : forall L T, ctx L -> reified_env L T * -> {is_sty T}
H1 : ctx (of X T1 :: SL)
H3 : reified_env SL RT *
============================
 {is_sty (prod T1 RT)}

reified_env_sty < case H1.
Subgoal 2:

Variables: RT T1 SL X
IH : forall L T, ctx L -> reified_env L T * -> {is_sty T}
H3 : reified_env SL RT *
H4 : ctx SL
H5 : name X
H6 : {is_sty T1}
H7 : forall T', member (of X T') SL -> T1 = T'
============================
 {is_sty (prod T1 RT)}

reified_env_sty < apply IH to _ H3.
Subgoal 2:

Variables: RT T1 SL X
IH : forall L T, ctx L -> reified_env L T * -> {is_sty T}
H3 : reified_env SL RT *
H4 : ctx SL
H5 : name X
H6 : {is_sty T1}
H7 : forall T', member (of X T') SL -> T1 = T'
H8 : {is_sty RT}
============================
 {is_sty (prod T1 RT)}

reified_env_sty < search.
Proof completed.
Abella < Theorem reified_env_exists : 
forall SL, ctx SL -> (exists Ty, reified_env SL Ty).


============================
 forall SL, ctx SL -> (exists Ty, reified_env SL Ty)

reified_env_exists < induction on 1.

IH : forall SL, ctx SL * -> (exists Ty, reified_env SL Ty)
============================
 forall SL, ctx SL @ -> (exists Ty, reified_env SL Ty)

reified_env_exists < intros.

Variables: SL
IH : forall SL, ctx SL * -> (exists Ty, reified_env SL Ty)
H1 : ctx SL @
============================
 exists Ty, reified_env SL Ty

reified_env_exists < case H1.
Subgoal 1:

IH : forall SL, ctx SL * -> (exists Ty, reified_env SL Ty)
============================
 exists Ty, reified_env nil Ty

Subgoal 2 is:
 exists Ty, reified_env (of X T :: L) Ty

reified_env_exists < search.
Subgoal 2:

Variables: L T X
IH : forall SL, ctx SL * -> (exists Ty, reified_env SL Ty)
H2 : ctx L *
H3 : name X
H4 : {is_sty T}
H5 : forall T', member (of X T') L -> T = T'
============================
 exists Ty, reified_env (of X T :: L) Ty

reified_env_exists < apply IH to H2.
Subgoal 2:

Variables: L T X Ty
IH : forall SL, ctx SL * -> (exists Ty, reified_env SL Ty)
H2 : ctx L *
H3 : name X
H4 : {is_sty T}
H5 : forall T', member (of X T') L -> T = T'
H6 : reified_env L Ty
============================
 exists Ty, reified_env (of X T :: L) Ty

reified_env_exists < search.
Proof completed.
Abella < Theorem reify_mapvar_env : 
forall FVs SL RTy Map X, vars_of_ctx SL FVs -> ctx SL -> {mapvar FVs Map} ->
  reified_env SL RTy -> good_map (of' X RTy :: nil) (Map X) SL.


============================
 forall FVs SL RTy Map X, vars_of_ctx SL FVs -> ctx SL -> {mapvar FVs Map} ->
   reified_env SL RTy -> good_map (of' X RTy :: nil) (Map X) SL

reify_mapvar_env < induction on 1.

IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
============================
 forall FVs SL RTy Map X, vars_of_ctx SL FVs @ -> ctx SL ->
   {mapvar FVs Map} -> reified_env SL RTy ->
   good_map (of' X RTy :: nil) (Map X) SL

reify_mapvar_env < intros.

Variables: FVs SL RTy Map X
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H1 : vars_of_ctx SL FVs @
H2 : ctx SL
H3 : {mapvar FVs Map}
H4 : reified_env SL RTy
============================
 good_map (of' X RTy :: nil) (Map X) SL

reify_mapvar_env < case H1.
Subgoal 1:

Variables: RTy Map X
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H2 : ctx nil
H3 : {mapvar nil Map}
H4 : reified_env nil RTy
============================
 good_map (of' X RTy :: nil) (Map X) nil

Subgoal 2 is:
 good_map (of' X RTy :: nil) (Map X) (of X1 T :: L)

reify_mapvar_env < case H3.
Subgoal 1:

Variables: RTy X
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H2 : ctx nil
H4 : reified_env nil RTy
============================
 good_map (of' X RTy :: nil) nil nil

Subgoal 2 is:
 good_map (of' X RTy :: nil) (Map X) (of X1 T :: L)

reify_mapvar_env < search.
Subgoal 2:

Variables: RTy Map X Vs X1 L T
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H2 : ctx (of X1 T :: L)
H3 : {mapvar (X1 :: Vs) Map}
H4 : reified_env (of X1 T :: L) RTy
H5 : vars_of_ctx L Vs *
============================
 good_map (of' X RTy :: nil) (Map X) (of X1 T :: L)

reify_mapvar_env < case H3.
Subgoal 2:

Variables: RTy X Vs X1 L T Map1
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H2 : ctx (of X1 T :: L)
H4 : reified_env (of X1 T :: L) RTy
H5 : vars_of_ctx L Vs *
H6 : {mapvar Vs Map1}
============================
 good_map (of' X RTy :: nil) (map X1 (fst' X) :: Map1 (snd' X))
   (of X1 T :: L)

reify_mapvar_env < case H4.
Subgoal 2:

Variables: X Vs X1 L T Map1 RT
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H2 : ctx (of X1 T :: L)
H5 : vars_of_ctx L Vs *
H6 : {mapvar Vs Map1}
H7 : reified_env L RT
============================
 good_map (of' X (prod T RT) :: nil) (map X1 (fst' X) :: Map1 (snd' X))
   (of X1 T :: L)

reify_mapvar_env < unfold.
Subgoal 2.1:

Variables: X Vs X1 L T Map1 RT
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H2 : ctx (of X1 T :: L)
H5 : vars_of_ctx L Vs *
H6 : {mapvar Vs Map1}
H7 : reified_env L RT
============================
 name X1

Subgoal 2.2 is:
 {of' X (prod T RT) |- of' (fst' X) T}

Subgoal 2.3 is:
 good_map (of' X (prod T RT) :: nil) (Map1 (snd' X)) L

reify_mapvar_env < case H2.
Subgoal 2.1:

Variables: X Vs X1 L T Map1 RT
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H5 : vars_of_ctx L Vs *
H6 : {mapvar Vs Map1}
H7 : reified_env L RT
H8 : ctx L
H9 : name X1
H10 : {is_sty T}
H11 : forall T', member (of X1 T') L -> T = T'
============================
 name X1

Subgoal 2.2 is:
 {of' X (prod T RT) |- of' (fst' X) T}

Subgoal 2.3 is:
 good_map (of' X (prod T RT) :: nil) (Map1 (snd' X)) L

reify_mapvar_env < search.
Subgoal 2.2:

Variables: X Vs X1 L T Map1 RT
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H2 : ctx (of X1 T :: L)
H5 : vars_of_ctx L Vs *
H6 : {mapvar Vs Map1}
H7 : reified_env L RT
============================
 {of' X (prod T RT) |- of' (fst' X) T}

Subgoal 2.3 is:
 good_map (of' X (prod T RT) :: nil) (Map1 (snd' X)) L

reify_mapvar_env < search.
Subgoal 2.3:

Variables: X Vs X1 L T Map1 RT
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H2 : ctx (of X1 T :: L)
H5 : vars_of_ctx L Vs *
H6 : {mapvar Vs Map1}
H7 : reified_env L RT
============================
 good_map (of' X (prod T RT) :: nil) (Map1 (snd' X)) L

reify_mapvar_env < case H2.
Subgoal 2.3:

Variables: X Vs X1 L T Map1 RT
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H5 : vars_of_ctx L Vs *
H6 : {mapvar Vs Map1}
H7 : reified_env L RT
H8 : ctx L
H9 : name X1
H10 : {is_sty T}
H11 : forall T', member (of X1 T') L -> T = T'
============================
 good_map (of' X (prod T RT) :: nil) (Map1 (snd' X)) L

reify_mapvar_env < apply IH to H5 _ H6 _ with X = snd' X.
Subgoal 2.3:

Variables: X Vs X1 L T Map1 RT
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H5 : vars_of_ctx L Vs *
H6 : {mapvar Vs Map1}
H7 : reified_env L RT
H8 : ctx L
H9 : name X1
H10 : {is_sty T}
H11 : forall T', member (of X1 T') L -> T = T'
H12 : good_map (of' (snd' X) RT :: nil) (Map1 (snd' X)) L
============================
 good_map (of' X (prod T RT) :: nil) (Map1 (snd' X)) L

reify_mapvar_env < apply good_map_csnd to H12 with T = T.
Subgoal 2.3:

Variables: X Vs X1 L T Map1 RT
IH : forall FVs SL RTy Map X, vars_of_ctx SL FVs * -> ctx SL ->
       {mapvar FVs Map} -> reified_env SL RTy ->
       good_map (of' X RTy :: nil) (Map X) SL
H5 : vars_of_ctx L Vs *
H6 : {mapvar Vs Map1}
H7 : reified_env L RT
H8 : ctx L
H9 : name X1
H10 : {is_sty T}
H11 : forall T', member (of X1 T') L -> T = T'
H12 : good_map (of' (snd' X) RT :: nil) (Map1 (snd' X)) L
H13 : good_map (of' X (prod T RT) :: nil) (Map1 (snd' X)) L
============================
 good_map (of' X (prod T RT) :: nil) (Map1 (snd' X)) L

reify_mapvar_env < search.
Proof completed.
Abella < Theorem pruned_env_reification_env : 
forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
  prune_ctx FVs SL SL' -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
  {CL |- of' PE Ty}.


============================
 forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
   prune_ctx FVs SL SL' -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
   {CL |- of' PE Ty}

pruned_env_reification_env < induction on 3.

IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
============================
 forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
   prune_ctx FVs SL SL' @ -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
   {CL |- of' PE Ty}

pruned_env_reification_env < intros.

Variables: CL Map SL SL' Ty PE FVs
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H3 : prune_ctx FVs SL SL' @
H4 : reified_env SL' Ty
H5 : {mapenv FVs Map PE}
============================
 {CL |- of' PE Ty}

pruned_env_reification_env < case H3.
Subgoal 1:

Variables: CL Map SL Ty PE
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H4 : reified_env nil Ty
H5 : {mapenv nil Map PE}
============================
 {CL |- of' PE Ty}

Subgoal 2 is:
 {CL |- of' PE Ty}

pruned_env_reification_env < case H4.
Subgoal 1:

Variables: CL Map SL PE
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H5 : {mapenv nil Map PE}
============================
 {CL |- of' PE tunit}

Subgoal 2 is:
 {CL |- of' PE Ty}

pruned_env_reification_env < case H5.
Subgoal 1:

Variables: CL Map SL
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
============================
 {CL |- of' unit' tunit}

Subgoal 2 is:
 {CL |- of' PE Ty}

pruned_env_reification_env < search.
Subgoal 2:

Variables: CL Map SL Ty PE L' T X Vs
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H4 : reified_env (of X T :: L') Ty
H5 : {mapenv (X :: Vs) Map PE}
H6 : member (of X T) SL
H7 : prune_ctx Vs SL L' *
============================
 {CL |- of' PE Ty}

pruned_env_reification_env < case H4.
Subgoal 2:

Variables: CL Map SL PE L' T X Vs RT
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H5 : {mapenv (X :: Vs) Map PE}
H6 : member (of X T) SL
H7 : prune_ctx Vs SL L' *
H8 : reified_env L' RT
============================
 {CL |- of' PE (prod T RT)}

pruned_env_reification_env < case H5.
Subgoal 2:

Variables: CL Map SL L' T X Vs RT ML M
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H6 : member (of X T) SL
H7 : prune_ctx Vs SL L' *
H8 : reified_env L' RT
H9 : {memb (map X M) Map}
H10 : {mapenv Vs Map ML}
============================
 {CL |- of' (pair' M ML) (prod T RT)}

pruned_env_reification_env < assert {CL |- of' M T}.
Subgoal 2.1:

Variables: CL Map SL L' T X Vs RT ML M
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H6 : member (of X T) SL
H7 : prune_ctx Vs SL L' *
H8 : reified_env L' RT
H9 : {memb (map X M) Map}
H10 : {mapenv Vs Map ML}
============================
 {CL |- of' M T}

Subgoal 2 is:
 {CL |- of' (pair' M ML) (prod T RT)}

pruned_env_reification_env < apply good_map_of' to H2 H9.
Subgoal 2.1:

Variables: CL Map SL L' T X Vs RT ML M T1
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H6 : member (of X T) SL
H7 : prune_ctx Vs SL L' *
H8 : reified_env L' RT
H9 : {memb (map X M) Map}
H10 : {mapenv Vs Map ML}
H11 : member (of X T1) SL
H12 : {CL |- of' M T1}
============================
 {CL |- of' M T}

Subgoal 2 is:
 {CL |- of' (pair' M ML) (prod T RT)}

pruned_env_reification_env < apply ctx_mem_sync to _ H6 H11.
Subgoal 2.1:

Variables: CL Map SL L' X Vs RT ML M T1
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H6 : member (of X T1) SL
H7 : prune_ctx Vs SL L' *
H8 : reified_env L' RT
H9 : {memb (map X M) Map}
H10 : {mapenv Vs Map ML}
H11 : member (of X T1) SL
H12 : {CL |- of' M T1}
============================
 {CL |- of' M T1}

Subgoal 2 is:
 {CL |- of' (pair' M ML) (prod T RT)}

pruned_env_reification_env < search.
Subgoal 2:

Variables: CL Map SL L' T X Vs RT ML M
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H6 : member (of X T) SL
H7 : prune_ctx Vs SL L' *
H8 : reified_env L' RT
H9 : {memb (map X M) Map}
H10 : {mapenv Vs Map ML}
H11 : {CL |- of' M T}
============================
 {CL |- of' (pair' M ML) (prod T RT)}

pruned_env_reification_env < assert {CL |- of' ML RT}.
Subgoal 2.2:

Variables: CL Map SL L' T X Vs RT ML M
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H6 : member (of X T) SL
H7 : prune_ctx Vs SL L' *
H8 : reified_env L' RT
H9 : {memb (map X M) Map}
H10 : {mapenv Vs Map ML}
H11 : {CL |- of' M T}
============================
 {CL |- of' ML RT}

Subgoal 2 is:
 {CL |- of' (pair' M ML) (prod T RT)}

pruned_env_reification_env < backchain IH.
Subgoal 2:

Variables: CL Map SL L' T X Vs RT ML M
IH : forall CL Map SL SL' Ty PE FVs, ctx SL -> good_map CL Map SL ->
       prune_ctx FVs SL SL' * -> reified_env SL' Ty -> {mapenv FVs Map PE} ->
       {CL |- of' PE Ty}
H1 : ctx SL
H2 : good_map CL Map SL
H6 : member (of X T) SL
H7 : prune_ctx Vs SL L' *
H8 : reified_env L' RT
H9 : {memb (map X M) Map}
H10 : {mapenv Vs Map ML}
H11 : {CL |- of' M T}
H12 : {CL |- of' ML RT}
============================
 {CL |- of' (pair' M ML) (prod T RT)}

pruned_env_reification_env < search.
Proof completed.
Abella < Theorem cc_typ_pres : 
forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
  {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'} -> {CL |- of' M' T}.


============================
 forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
   {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'} ->
   {CL |- of' M' T}

cc_typ_pres < induction on 6.

IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
============================
 forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
   {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}@ ->
   {CL |- of' M' T}

cc_typ_pres < intros.

Variables: SL CL Map M Vs M' T
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of M T}
H5 : vars_of_ctx SL Vs
H6 : {cc Map Vs M M'}@
============================
 {CL |- of' M' T}

cc_typ_pres < case H6.
Subgoal 1:

Variables: SL CL Map Vs T N
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (nat N) T}
H5 : vars_of_ctx SL Vs
============================
 {CL |- of' (nat' N) T}

Subgoal 2 is:
 {CL |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 1.1:

Variables: SL CL Map Vs N
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
============================
 {CL |- of' (nat' N) tnat}

Subgoal 1.2 is:
 {CL |- of' (nat' N) T}

Subgoal 2 is:
 {CL |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 1.2:

Variables: SL CL Map Vs T N F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {SL, [F] |- of (nat N) T}
H8 : member F SL
============================
 {CL |- of' (nat' N) T}

Subgoal 2 is:
 {CL |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H8 H7.
Subgoal 1.2:

Variables: SL CL Map Vs N F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {SL, [F] |- of (nat N) T1}
H8 : member F SL
H9 : name (nat N)
============================
 {CL |- of' (nat' N) T1}

Subgoal 2 is:
 {CL |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H9.
Subgoal 2:

Variables: SL CL Map M Vs M' T
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of M T}
H5 : vars_of_ctx SL Vs
H7 : {memb (map M M') Map}*
============================
 {CL |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply good_map_of' to _ H7.
Subgoal 2:

Variables: SL CL Map M Vs M' T T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of M T}
H5 : vars_of_ctx SL Vs
H7 : {memb (map M M') Map}*
H8 : member (of M T1) SL
H9 : {CL |- of' M' T1}
============================
 {CL |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply good_map_name to _ H7.
Subgoal 2:

Variables: SL CL Map M Vs M' T T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of M T}
H5 : vars_of_ctx SL Vs
H7 : {memb (map M M') Map}*
H8 : member (of M T1) SL
H9 : {CL |- of' M' T1}
H10 : name M
============================
 {CL |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H10.
Subgoal 2:

Variables: SL CL Map Vs M' T T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx (SL n1)
H2 : ctx' (CL n1)
H3 : good_map (CL n1) (Map n1) (SL n1)
H4 : {SL n1 |- of n1 T}
H5 : vars_of_ctx (SL n1) (Vs n1)
H7 : {memb (map n1 M') (Map n1)}*
H8 : member (of n1 T1) (SL n1)
H9 : {CL n1 |- of' M' T1}
============================
 {CL n1 |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 2:

Variables: SL CL Map Vs M' T T1 F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx (SL n1)
H2 : ctx' (CL n1)
H3 : good_map (CL n1) (Map n1) (SL n1)
H5 : vars_of_ctx (SL n1) (Vs n1)
H7 : {memb (map n1 M') (Map n1)}*
H8 : member (of n1 T1) (SL n1)
H9 : {CL n1 |- of' M' T1}
H11 : {SL n1, [F n1] |- of n1 T}
H12 : member (F n1) (SL n1)
============================
 {CL n1 |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_mem to _ H12.
Subgoal 2:

Variables: SL CL Map Vs M' T T1 X T2
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx (SL n1)
H2 : ctx' (CL n1)
H3 : good_map (CL n1) (Map n1) (SL n1)
H5 : vars_of_ctx (SL n1) (Vs n1)
H7 : {memb (map n1 M') (Map n1)}*
H8 : member (of n1 T1) (SL n1)
H9 : {CL n1 |- of' M' T1}
H11 : {SL n1, [of (X n1) T2] |- of n1 T}
H12 : member (of (X n1) T2) (SL n1)
H13 : name (X n1)
H14 : {is_sty T2}
============================
 {CL n1 |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H11.
Subgoal 2:

Variables: SL CL Map Vs M' T T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx (SL n1)
H2 : ctx' (CL n1)
H3 : good_map (CL n1) (Map n1) (SL n1)
H5 : vars_of_ctx (SL n1) (Vs n1)
H7 : {memb (map n1 M') (Map n1)}*
H8 : member (of n1 T1) (SL n1)
H9 : {CL n1 |- of' M' T1}
H12 : member (of n1 T) (SL n1)
H13 : name n1
H14 : {is_sty T}
============================
 {CL n1 |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_mem_sync to _ H8 H12.
Subgoal 2:

Variables: SL CL Map Vs M' T
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx (SL n1)
H2 : ctx' (CL n1)
H3 : good_map (CL n1) (Map n1) (SL n1)
H5 : vars_of_ctx (SL n1) (Vs n1)
H7 : {memb (map n1 M') (Map n1)}*
H8 : member (of n1 T) (SL n1)
H9 : {CL n1 |- of' M' T}
H12 : member (of n1 T) (SL n1)
H13 : name n1
H14 : {is_sty T}
============================
 {CL n1 |- of' M' T}

Subgoal 3 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 3:

Variables: SL CL Map Vs T M'1 M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (pred M1) T}
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
============================
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 3.1:

Variables: SL CL Map Vs M'1 M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL |- of M1 tnat}
============================
 {CL |- of' (pred' M'1) tnat}

Subgoal 3.2 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M'1 tnat}.
Subgoal 3.1.1:

Variables: SL CL Map Vs M'1 M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL |- of M1 tnat}
============================
 {CL |- of' M'1 tnat}

Subgoal 3.1 is:
 {CL |- of' (pred' M'1) tnat}

Subgoal 3.2 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH.
Subgoal 3.1:

Variables: SL CL Map Vs M'1 M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL |- of M1 tnat}
H9 : {CL |- of' M'1 tnat}
============================
 {CL |- of' (pred' M'1) tnat}

Subgoal 3.2 is:
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 3.2:

Variables: SL CL Map Vs T M'1 M1 F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL, [F] |- of (pred M1) T}
H9 : member F SL
============================
 {CL |- of' (pred' M'1) T}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H9 H8.
Subgoal 3.2:

Variables: SL CL Map Vs M'1 M1 F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL, [F] |- of (pred M1) T1}
H9 : member F SL
H10 : name (pred M1)
============================
 {CL |- of' (pred' M'1) T1}

Subgoal 4 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H10.
Subgoal 4:

Variables: SL CL Map Vs T M2' M2 M1' M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (plus M1 M2) T}
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
============================
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 4.1:

Variables: SL CL Map Vs M2' M2 M1' M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 tnat}
H10 : {SL |- of M2 tnat}
============================
 {CL |- of' (plus' M1' M2') tnat}

Subgoal 4.2 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M1' tnat}.
Subgoal 4.1.1:

Variables: SL CL Map Vs M2' M2 M1' M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 tnat}
H10 : {SL |- of M2 tnat}
============================
 {CL |- of' M1' tnat}

Subgoal 4.1 is:
 {CL |- of' (plus' M1' M2') tnat}

Subgoal 4.2 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH.
Subgoal 4.1:

Variables: SL CL Map Vs M2' M2 M1' M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 tnat}
H10 : {SL |- of M2 tnat}
H11 : {CL |- of' M1' tnat}
============================
 {CL |- of' (plus' M1' M2') tnat}

Subgoal 4.2 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M2' tnat}.
Subgoal 4.1.2:

Variables: SL CL Map Vs M2' M2 M1' M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 tnat}
H10 : {SL |- of M2 tnat}
H11 : {CL |- of' M1' tnat}
============================
 {CL |- of' M2' tnat}

Subgoal 4.1 is:
 {CL |- of' (plus' M1' M2') tnat}

Subgoal 4.2 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH with M = M2.
Subgoal 4.1:

Variables: SL CL Map Vs M2' M2 M1' M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 tnat}
H10 : {SL |- of M2 tnat}
H11 : {CL |- of' M1' tnat}
H12 : {CL |- of' M2' tnat}
============================
 {CL |- of' (plus' M1' M2') tnat}

Subgoal 4.2 is:
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 4.2:

Variables: SL CL Map Vs T M2' M2 M1' M1 F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL, [F] |- of (plus M1 M2) T}
H10 : member F SL
============================
 {CL |- of' (plus' M1' M2') T}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H10 H9.
Subgoal 4.2:

Variables: SL CL Map Vs M2' M2 M1' M1 F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL, [F] |- of (plus M1 M2) T1}
H10 : member F SL
H11 : name (plus M1 M2)
============================
 {CL |- of' (plus' M1' M2') T1}

Subgoal 5 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H11.
Subgoal 5:

Variables: SL CL Map Vs T M2' M2 M1' M1 M'1 M3
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (ifz M3 M1 M2) T}
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M3 M'1}*
H8 : {cc Map Vs M1 M1'}*
H9 : {cc Map Vs M2 M2'}*
============================
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 5.1:

Variables: SL CL Map Vs T M2' M2 M1' M1 M'1 M3
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M3 M'1}*
H8 : {cc Map Vs M1 M1'}*
H9 : {cc Map Vs M2 M2'}*
H10 : {SL |- of M3 tnat}
H11 : {SL |- of M1 T}
H12 : {SL |- of M2 T}
============================
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 5.2 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M'1 tnat}.
Subgoal 5.1.1:

Variables: SL CL Map Vs T M2' M2 M1' M1 M'1 M3
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M3 M'1}*
H8 : {cc Map Vs M1 M1'}*
H9 : {cc Map Vs M2 M2'}*
H10 : {SL |- of M3 tnat}
H11 : {SL |- of M1 T}
H12 : {SL |- of M2 T}
============================
 {CL |- of' M'1 tnat}

Subgoal 5.1 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 5.2 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH.
Subgoal 5.1:

Variables: SL CL Map Vs T M2' M2 M1' M1 M'1 M3
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M3 M'1}*
H8 : {cc Map Vs M1 M1'}*
H9 : {cc Map Vs M2 M2'}*
H10 : {SL |- of M3 tnat}
H11 : {SL |- of M1 T}
H12 : {SL |- of M2 T}
H13 : {CL |- of' M'1 tnat}
============================
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 5.2 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M1' T}.
Subgoal 5.1.2:

Variables: SL CL Map Vs T M2' M2 M1' M1 M'1 M3
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M3 M'1}*
H8 : {cc Map Vs M1 M1'}*
H9 : {cc Map Vs M2 M2'}*
H10 : {SL |- of M3 tnat}
H11 : {SL |- of M1 T}
H12 : {SL |- of M2 T}
H13 : {CL |- of' M'1 tnat}
============================
 {CL |- of' M1' T}

Subgoal 5.1 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 5.2 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH with M = M1.
Subgoal 5.1:

Variables: SL CL Map Vs T M2' M2 M1' M1 M'1 M3
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M3 M'1}*
H8 : {cc Map Vs M1 M1'}*
H9 : {cc Map Vs M2 M2'}*
H10 : {SL |- of M3 tnat}
H11 : {SL |- of M1 T}
H12 : {SL |- of M2 T}
H13 : {CL |- of' M'1 tnat}
H14 : {CL |- of' M1' T}
============================
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 5.2 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M2' T}.
Subgoal 5.1.3:

Variables: SL CL Map Vs T M2' M2 M1' M1 M'1 M3
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M3 M'1}*
H8 : {cc Map Vs M1 M1'}*
H9 : {cc Map Vs M2 M2'}*
H10 : {SL |- of M3 tnat}
H11 : {SL |- of M1 T}
H12 : {SL |- of M2 T}
H13 : {CL |- of' M'1 tnat}
H14 : {CL |- of' M1' T}
============================
 {CL |- of' M2' T}

Subgoal 5.1 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 5.2 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH with M = M2.
Subgoal 5.1:

Variables: SL CL Map Vs T M2' M2 M1' M1 M'1 M3
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M3 M'1}*
H8 : {cc Map Vs M1 M1'}*
H9 : {cc Map Vs M2 M2'}*
H10 : {SL |- of M3 tnat}
H11 : {SL |- of M1 T}
H12 : {SL |- of M2 T}
H13 : {CL |- of' M'1 tnat}
H14 : {CL |- of' M1' T}
H15 : {CL |- of' M2' T}
============================
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 5.2 is:
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 5.2:

Variables: SL CL Map Vs T M2' M2 M1' M1 M'1 M3 F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M3 M'1}*
H8 : {cc Map Vs M1 M1'}*
H9 : {cc Map Vs M2 M2'}*
H10 : {SL, [F] |- of (ifz M3 M1 M2) T}
H11 : member F SL
============================
 {CL |- of' (ifz' M'1 M1' M2') T}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H11 H10.
Subgoal 5.2:

Variables: SL CL Map Vs M2' M2 M1' M1 M'1 M3 F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M3 M'1}*
H8 : {cc Map Vs M1 M1'}*
H9 : {cc Map Vs M2 M2'}*
H10 : {SL, [F] |- of (ifz M3 M1 M2) T1}
H11 : member F SL
H12 : name (ifz M3 M1 M2)
============================
 {CL |- of' (ifz' M'1 M1' M2') T1}

Subgoal 6 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H12.
Subgoal 6:

Variables: SL CL Map Vs T
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of unit T}
H5 : vars_of_ctx SL Vs
============================
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 6.1:

Variables: SL CL Map Vs
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
============================
 {CL |- of' unit' tunit}

Subgoal 6.2 is:
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 6.2:

Variables: SL CL Map Vs T F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {SL, [F] |- of unit T}
H8 : member F SL
============================
 {CL |- of' unit' T}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H8 H7.
Subgoal 6.2:

Variables: SL CL Map Vs F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {SL, [F] |- of unit T1}
H8 : member F SL
H9 : name unit
============================
 {CL |- of' unit' T1}

Subgoal 7 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H9.
Subgoal 7:

Variables: SL CL Map Vs T M2' M2 M1' M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (pair M1 M2) T}
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
============================
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 7.1:

Variables: SL CL Map Vs M2' M2 M1' M1 T2 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 T1}
H10 : {SL |- of M2 T2}
============================
 {CL |- of' (pair' M1' M2') (prod T1 T2)}

Subgoal 7.2 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M1' T1}.
Subgoal 7.1.1:

Variables: SL CL Map Vs M2' M2 M1' M1 T2 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 T1}
H10 : {SL |- of M2 T2}
============================
 {CL |- of' M1' T1}

Subgoal 7.1 is:
 {CL |- of' (pair' M1' M2') (prod T1 T2)}

Subgoal 7.2 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH.
Subgoal 7.1:

Variables: SL CL Map Vs M2' M2 M1' M1 T2 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 T1}
H10 : {SL |- of M2 T2}
H11 : {CL |- of' M1' T1}
============================
 {CL |- of' (pair' M1' M2') (prod T1 T2)}

Subgoal 7.2 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M2' T2}.
Subgoal 7.1.2:

Variables: SL CL Map Vs M2' M2 M1' M1 T2 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 T1}
H10 : {SL |- of M2 T2}
H11 : {CL |- of' M1' T1}
============================
 {CL |- of' M2' T2}

Subgoal 7.1 is:
 {CL |- of' (pair' M1' M2') (prod T1 T2)}

Subgoal 7.2 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH with M = M2.
Subgoal 7.1:

Variables: SL CL Map Vs M2' M2 M1' M1 T2 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 T1}
H10 : {SL |- of M2 T2}
H11 : {CL |- of' M1' T1}
H12 : {CL |- of' M2' T2}
============================
 {CL |- of' (pair' M1' M2') (prod T1 T2)}

Subgoal 7.2 is:
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 7.2:

Variables: SL CL Map Vs T M2' M2 M1' M1 F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL, [F] |- of (pair M1 M2) T}
H10 : member F SL
============================
 {CL |- of' (pair' M1' M2') T}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H10 H9.
Subgoal 7.2:

Variables: SL CL Map Vs M2' M2 M1' M1 F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL, [F] |- of (pair M1 M2) T1}
H10 : member F SL
H11 : name (pair M1 M2)
============================
 {CL |- of' (pair' M1' M2') T1}

Subgoal 8 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H11.
Subgoal 8:

Variables: SL CL Map Vs T M'1 M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fst M1) T}
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
============================
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 8.1:

Variables: SL CL Map Vs T M'1 M1 T2
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL |- of M1 (prod T T2)}
============================
 {CL |- of' (fst' M'1) T}

Subgoal 8.2 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M'1 (prod T T2)}.
Subgoal 8.1.1:

Variables: SL CL Map Vs T M'1 M1 T2
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL |- of M1 (prod T T2)}
============================
 {CL |- of' M'1 (prod T T2)}

Subgoal 8.1 is:
 {CL |- of' (fst' M'1) T}

Subgoal 8.2 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH.
Subgoal 8.1:

Variables: SL CL Map Vs T M'1 M1 T2
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL |- of M1 (prod T T2)}
H9 : {CL |- of' M'1 (prod T T2)}
============================
 {CL |- of' (fst' M'1) T}

Subgoal 8.2 is:
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 8.2:

Variables: SL CL Map Vs T M'1 M1 F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL, [F] |- of (fst M1) T}
H9 : member F SL
============================
 {CL |- of' (fst' M'1) T}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H9 H8.
Subgoal 8.2:

Variables: SL CL Map Vs M'1 M1 F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL, [F] |- of (fst M1) T1}
H9 : member F SL
H10 : name (fst M1)
============================
 {CL |- of' (fst' M'1) T1}

Subgoal 9 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H10.
Subgoal 9:

Variables: SL CL Map Vs T M'1 M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (snd M1) T}
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
============================
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 9.1:

Variables: SL CL Map Vs T M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL |- of M1 (prod T1 T)}
============================
 {CL |- of' (snd' M'1) T}

Subgoal 9.2 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M'1 (prod T1 T)}.
Subgoal 9.1.1:

Variables: SL CL Map Vs T M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL |- of M1 (prod T1 T)}
============================
 {CL |- of' M'1 (prod T1 T)}

Subgoal 9.1 is:
 {CL |- of' (snd' M'1) T}

Subgoal 9.2 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH.
Subgoal 9.1:

Variables: SL CL Map Vs T M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL |- of M1 (prod T1 T)}
H9 : {CL |- of' M'1 (prod T1 T)}
============================
 {CL |- of' (snd' M'1) T}

Subgoal 9.2 is:
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 9.2:

Variables: SL CL Map Vs T M'1 M1 F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL, [F] |- of (snd M1) T}
H9 : member F SL
============================
 {CL |- of' (snd' M'1) T}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H9 H8.
Subgoal 9.2:

Variables: SL CL Map Vs M'1 M1 F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {SL, [F] |- of (snd M1) T1}
H9 : member F SL
H10 : name (snd M1)
============================
 {CL |- of' (snd' M'1) T1}

Subgoal 10 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H10.
Subgoal 10:

Variables: SL CL Map Vs T R' R M'1 M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (let M1 R) T}
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
============================
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 10.1:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
============================
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M'1 T1}.
Subgoal 10.1.1:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
============================
 {CL |- of' M'1 T1}

Subgoal 10.1 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH.
Subgoal 10.1:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
H11 : {CL |- of' M'1 T1}
============================
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL, of' n2 T1 |- of' (R' n2) T}.
Subgoal 10.1.2:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
H11 : {CL |- of' M'1 T1}
============================
 {CL, of' n2 T1 |- of' (R' n2) T}

Subgoal 10.1 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH with M = R n1, SL = of n1 T1 :: SL, Map = map n1 n2 :: Map, Vs = n1 :: Vs.
Subgoal 10.1.2.1:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
H11 : {CL |- of' M'1 T1}
============================
 ctx (of n1 T1 :: SL)

Subgoal 10.1.2.2 is:
 ctx' (of' n2 T1 :: CL)

Subgoal 10.1.2.3 is:
 good_map (of' n2 T1 :: CL) (map n1 n2 :: Map) (of n1 T1 :: SL)

Subgoal 10.1 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain ctx_extend.
Subgoal 10.1.2.1:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
H11 : {CL |- of' M'1 T1}
============================
 {is_sty T1}

Subgoal 10.1.2.2 is:
 ctx' (of' n2 T1 :: CL)

Subgoal 10.1.2.3 is:
 good_map (of' n2 T1 :: CL) (map n1 n2 :: Map) (of n1 T1 :: SL)

Subgoal 10.1 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain of_is_sty.
Subgoal 10.1.2.2:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
H11 : {CL |- of' M'1 T1}
============================
 ctx' (of' n2 T1 :: CL)

Subgoal 10.1.2.3 is:
 good_map (of' n2 T1 :: CL) (map n1 n2 :: Map) (of n1 T1 :: SL)

Subgoal 10.1 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply of_is_sty to _ H9.
Subgoal 10.1.2.2:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
H11 : {CL |- of' M'1 T1}
H12 : {is_sty T1}
============================
 ctx' (of' n2 T1 :: CL)

Subgoal 10.1.2.3 is:
 good_map (of' n2 T1 :: CL) (map n1 n2 :: Map) (of n1 T1 :: SL)

Subgoal 10.1 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply sty_to_cty to H12.
Subgoal 10.1.2.2:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
H11 : {CL |- of' M'1 T1}
H12 : {is_sty T1}
H13 : {is_cty T1}
============================
 ctx' (of' n2 T1 :: CL)

Subgoal 10.1.2.3 is:
 good_map (of' n2 T1 :: CL) (map n1 n2 :: Map) (of n1 T1 :: SL)

Subgoal 10.1 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 10.1.2.3:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
H11 : {CL |- of' M'1 T1}
============================
 good_map (of' n2 T1 :: CL) (map n1 n2 :: Map) (of n1 T1 :: SL)

Subgoal 10.1 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain good_map_extend_map.
Subgoal 10.1:

Variables: SL CL Map Vs T R' R M'1 M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL |- of M1 T1}
H10 : {SL, of n1 T1 |- of (R n1) T}
H11 : {CL |- of' M'1 T1}
H12 : {CL, of' n2 T1 |- of' (R' n2) T}
============================
 {CL |- of' (let' M'1 R') T}

Subgoal 10.2 is:
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 10.2:

Variables: SL CL Map Vs T R' R M'1 M1 F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL, [F] |- of (let M1 R) T}
H10 : member F SL
============================
 {CL |- of' (let' M'1 R') T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H10 H9.
Subgoal 10.2:

Variables: SL CL Map Vs R' R M'1 M1 F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M'1}*
H8 : {cc (map n1 n2 :: Map) (n1 :: Vs) (R n1) (R' n2)}*
H9 : {SL, [F] |- of (let M1 R) T1}
H10 : member F SL
H11 : name (let M1 R)
============================
 {CL |- of' (let' M'1 R') T1}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H11.
Subgoal 11:

Variables: SL CL Map Vs T R' R FVs NMap E
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) T}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert exists SL', prune_ctx FVs SL SL' /\ {SL' |- of M T}.
Subgoal 11.1:

Variables: SL CL Map Vs T R' R FVs NMap E
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) T}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
============================
 exists SL', prune_ctx FVs SL SL' /\ {SL' |- of (fix R) T}

Subgoal 11 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain fvars_typing_pres.
Subgoal 11:

Variables: SL CL Map Vs T R' R FVs NMap E
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) T}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H11 : exists SL', prune_ctx FVs SL SL' /\ {SL' |- of (fix R) T}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H11.
Subgoal 11:

Variables: SL CL Map Vs T R' R FVs NMap E SL'
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) T}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H13 : {SL' |- of (fix R) T}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H13.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply prune_ctx_pres to _ H12.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply reified_env_exists to H16.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' E Ty}.
Subgoal 11.2.1:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
============================
 {CL |- of' E Ty}

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain pruned_env_reification_env.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
  (map n2 n4 :: map n1 n3 :: NMap n5) (of n2 T1 :: of n1 (arr T1 T2) :: SL').
Subgoal 11.2.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
============================
 good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
   (map n2 n4 :: map n1 n3 :: NMap n5) (of n2 T1 :: of n1 (arr T1 T2) :: SL')

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain good_map_extend_map.
Subgoal 11.2.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
============================
 good_map (of' n3 (arr T1 T2) :: of' n5 Ty :: nil) (map n1 n3 :: NMap n5)
   (of n1 (arr T1 T2) :: SL')

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain good_map_extend_map.
Subgoal 11.2.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
============================
 good_map (of' n5 Ty :: nil) (NMap n5) SL'

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain reify_mapvar_env with Map = NMap.
Subgoal 11.2.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
============================
 vars_of_ctx SL' FVs

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain prune_ctx_vars_of.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply is_sty_str to _ H15.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H20 : {is_sty (arr T1 T2)}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H20.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}.
Subgoal 11.2.3:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
============================
 {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH with SL = of n2 T1 :: of n1 (arr T1 T2) :: SL', M = R n1 n2, Map = map n2 n4 :: map n1 n3 :: NMap n5, Vs = n2 :: n1 :: FVs.
Subgoal 11.2.3.1:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
============================
 ctx (of n2 T1 :: of n1 (arr T1 T2) :: SL')

Subgoal 11.2.3.2 is:
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.2.3.3 is:
 vars_of_ctx (of n2 T1 :: of n1 (arr T1 T2) :: SL') (n2 :: n1 :: FVs)

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain ctx_extend.
Subgoal 11.2.3.1:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
============================
 ctx (of n1 (arr T1 T2) :: SL')

Subgoal 11.2.3.2 is:
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.2.3.3 is:
 vars_of_ctx (of n2 T1 :: of n1 (arr T1 T2) :: SL') (n2 :: n1 :: FVs)

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain ctx_extend.
Subgoal 11.2.3.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.2.3.3 is:
 vars_of_ctx (of n2 T1 :: of n1 (arr T1 T2) :: SL') (n2 :: n1 :: FVs)

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply sty_to_cty to H21.
Subgoal 11.2.3.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {is_cty T1}
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.2.3.3 is:
 vars_of_ctx (of n2 T1 :: of n1 (arr T1 T2) :: SL') (n2 :: n1 :: FVs)

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply sty_to_cty to H22.
Subgoal 11.2.3.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {is_cty T1}
H24 : {is_cty T2}
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.2.3.3 is:
 vars_of_ctx (of n2 T1 :: of n1 (arr T1 T2) :: SL') (n2 :: n1 :: FVs)

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply reified_env_sty to _ H17.
Subgoal 11.2.3.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {is_cty T1}
H24 : {is_cty T2}
H25 : {is_sty Ty}
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.2.3.3 is:
 vars_of_ctx (of n2 T1 :: of n1 (arr T1 T2) :: SL') (n2 :: n1 :: FVs)

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply sty_to_cty to H25.
Subgoal 11.2.3.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {is_cty T1}
H24 : {is_cty T2}
H25 : {is_sty Ty}
H26 : {is_cty Ty}
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

Subgoal 11.2.3.3 is:
 vars_of_ctx (of n2 T1 :: of n1 (arr T1 T2) :: SL') (n2 :: n1 :: FVs)

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 11.2.3.3:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
============================
 vars_of_ctx (of n2 T1 :: of n1 (arr T1 T2) :: SL') (n2 :: n1 :: FVs)

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < unfold.
Subgoal 11.2.3.3:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
============================
 vars_of_ctx (of n1 (arr T1 T2) :: SL') (n1 :: FVs)

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < unfold.
Subgoal 11.2.3.3:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
============================
 vars_of_ctx SL' FVs

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain prune_ctx_vars_of.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply sty_to_cty to H21.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H24 : {is_cty T1}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply sty_to_cty to H22.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H24 : {is_cty T1}
H25 : {is_cty T2}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply reified_env_sty to _ H17.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H24 : {is_cty T1}
H25 : {is_cty T2}
H26 : {is_sty Ty}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply sty_to_cty to H26.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H24 : {is_cty T1}
H25 : {is_cty T2}
H26 : {is_sty Ty}
H27 : {is_cty Ty}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {of'
   (abs'
      (p\let' (fst' p)
           (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
   (arr' (prod (arr T1 T2) (prod T1 Ty)) T2)}.
Subgoal 11.2.4:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H24 : {is_cty T1}
H25 : {is_cty T2}
H26 : {is_sty Ty}
H27 : {is_cty Ty}
============================
 {of'
    (abs'
       (p\let' (fst' p)
            (g\let' (fst' (snd' p)) (y\let' (snd' (snd' p)) (e\R' g y e)))))
    (arr' (prod (arr T1 T2) (prod T1 Ty)) T2)}

Subgoal 11.2 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search 7.
Subgoal 11.2:

Variables: SL CL Map Vs R' R FVs NMap E SL' T2 T1 Ty
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) (arr T1 T2)}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H15 : {SL' |- is_sty (arr T1 T2)}
H16 : ctx SL'
H17 : reified_env SL' Ty
H18 : {CL |- of' E Ty}
H19 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
        (map n2 n4 :: map n1 n3 :: NMap n5)
        (of n2 T1 :: of n1 (arr T1 T2) :: SL')
H21 : {is_sty T1}
H22 : {is_sty T2}
H23 : {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}
H24 : {is_cty T1}
H25 : {is_cty T2}
H26 : {is_sty Ty}
H27 : {is_cty Ty}
H28 : {of'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         (arr' (prod (arr T1 T2) (prod T1 Ty)) T2)}
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      (arr T1 T2)}

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 11.3:

Variables: SL CL Map Vs T R' R FVs NMap E SL' F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) T}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', [F] |- of (fix R) T}
H15 : member F SL'
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert ctx SL'.
Subgoal 11.3.1:

Variables: SL CL Map Vs T R' R FVs NMap E SL' F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) T}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', [F] |- of (fix R) T}
H15 : member F SL'
============================
 ctx SL'

Subgoal 11.3 is:
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain prune_ctx_pres.
Subgoal 11.3:

Variables: SL CL Map Vs T R' R FVs NMap E SL' F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) T}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', [F] |- of (fix R) T}
H15 : member F SL'
H16 : ctx SL'
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H15 H14.
Subgoal 11.3:

Variables: SL CL Map Vs R' R FVs NMap E SL' F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (fix R) T1}
H5 : vars_of_ctx SL Vs
H7 : {fvars (fix R) Vs FVs}*
H8 : {mapenv FVs Map E}*
H9 : {mapvar FVs NMap}*
H10 : {cc (map n2 n4 :: map n1 n3 :: NMap n5) (n2 :: n1 :: FVs) (R n1 n2)
         (R' n3 n4 n5)}*
H12 : prune_ctx FVs SL SL'
H14 : {SL', [F] |- of (fix R) T1}
H15 : member F SL'
H16 : ctx SL'
H17 : name (fix R)
============================
 {CL |-
    of'
      (clos'
         (abs'
            (p\let' (fst' p)
                 (g\let' (fst' (snd' p))
                      (y\let' (snd' (snd' p)) (e\R' g y e)))))
         E)
      T1}

Subgoal 12 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H17.
Subgoal 12:

Variables: SL CL Map Vs T M2' M2 M1' M1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H4 : {SL |- of (app M1 M2) T}
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
============================
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < case H4.
Subgoal 12.1:

Variables: SL CL Map Vs T M2' M2 M1' M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 (arr T1 T)}
H10 : {SL |- of M2 T1}
============================
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

Subgoal 12.2 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M1' (arr T1 T)}.
Subgoal 12.1.1:

Variables: SL CL Map Vs T M2' M2 M1' M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 (arr T1 T)}
H10 : {SL |- of M2 T1}
============================
 {CL |- of' M1' (arr T1 T)}

Subgoal 12.1 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

Subgoal 12.2 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH.
Subgoal 12.1:

Variables: SL CL Map Vs T M2' M2 M1' M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 (arr T1 T)}
H10 : {SL |- of M2 T1}
H11 : {CL |- of' M1' (arr T1 T)}
============================
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

Subgoal 12.2 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < assert {CL |- of' M2' T1}.
Subgoal 12.1.2:

Variables: SL CL Map Vs T M2' M2 M1' M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 (arr T1 T)}
H10 : {SL |- of M2 T1}
H11 : {CL |- of' M1' (arr T1 T)}
============================
 {CL |- of' M2' T1}

Subgoal 12.1 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

Subgoal 12.2 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < backchain IH.
Subgoal 12.1:

Variables: SL CL Map Vs T M2' M2 M1' M1 T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL |- of M1 (arr T1 T)}
H10 : {SL |- of M2 T1}
H11 : {CL |- of' M1' (arr T1 T)}
H12 : {CL |- of' M2' T1}
============================
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

Subgoal 12.2 is:
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < search.
Subgoal 12.2:

Variables: SL CL Map Vs T M2' M2 M1' M1 F
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL, [F] |- of (app M1 M2) T}
H10 : member F SL
============================
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T}

cc_typ_pres < apply ctx_focus_inv to _ H10 H9.
Subgoal 12.2:

Variables: SL CL Map Vs M2' M2 M1' M1 F T1
IH : forall SL CL Map M Vs M' T, ctx SL -> ctx' CL -> good_map CL Map SL ->
       {SL |- of M T} -> vars_of_ctx SL Vs -> {cc Map Vs M M'}* ->
       {CL |- of' M' T}
H1 : ctx SL
H2 : ctx' CL
H3 : good_map CL Map SL
H5 : vars_of_ctx SL Vs
H7 : {cc Map Vs M1 M1'}*
H8 : {cc Map Vs M2 M2'}*
H9 : {SL, [F] |- of (app M1 M2) T1}
H10 : member F SL
H11 : name (app M1 M2)
============================
 {CL |- of' (let' M1' (g\open' g (f\e\app' f (pair' g (pair' M2' e))))) T1}

cc_typ_pres < case H11.
Proof completed.
Abella < Theorem cc_clos_code_typ_pres : 
forall SL Ty T1 T2 R FVs Map R', nabla f x g y e, ctx SL ->
  reified_env SL Ty -> {is_sty (arr T1 T2)} ->
  {SL, of f (arr T1 T2), of x T1 |- of (R f x) T2} -> vars_of_ctx SL FVs ->
  {mapvar FVs Map} ->
  {cc (map x y :: map f g :: Map e) (x :: f :: FVs) (R f x) (R' g y e)} ->
  {of' e Ty, of' g (arr T1 T2), of' y T1 |- of' (R' g y e) T2}.


============================
 forall SL Ty T1 T2 R FVs Map R', nabla f x g y e, ctx SL ->
   reified_env SL Ty -> {is_sty (arr T1 T2)} ->
   {SL, of f (arr T1 T2), of x T1 |- of (R f x) T2} -> vars_of_ctx SL FVs ->
   {mapvar FVs Map} ->
   {cc (map x y :: map f g :: Map e) (x :: f :: FVs) (R f x) (R' g y e)} ->
   {of' e Ty, of' g (arr T1 T2), of' y T1 |- of' (R' g y e) T2}

cc_clos_code_typ_pres < intros.

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H3 : {is_sty (arr T1 T2)}
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
============================
 {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}

cc_clos_code_typ_pres < assert good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
  (map n2 n4 :: map n1 n3 :: Map n5) (of n2 T1 :: of n1 (arr T1 T2) :: SL).
Subgoal 1:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H3 : {is_sty (arr T1 T2)}
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
============================
 good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
   (map n2 n4 :: map n1 n3 :: Map n5) (of n2 T1 :: of n1 (arr T1 T2) :: SL)

Subgoal is:
 {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}

cc_clos_code_typ_pres < backchain good_map_extend_map.
Subgoal 1:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H3 : {is_sty (arr T1 T2)}
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
============================
 good_map (of' n3 (arr T1 T2) :: of' n5 Ty :: nil) (map n1 n3 :: Map n5)
   (of n1 (arr T1 T2) :: SL)

Subgoal is:
 {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}

cc_clos_code_typ_pres < backchain good_map_extend_map.
Subgoal 1:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H3 : {is_sty (arr T1 T2)}
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
============================
 good_map (of' n5 Ty :: nil) (Map n5) SL

Subgoal is:
 {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}

cc_clos_code_typ_pres < backchain reify_mapvar_env with Map = Map.

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H3 : {is_sty (arr T1 T2)}
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
============================
 {of' n5 Ty, of' n3 (arr T1 T2), of' n4 T1 |- of' (R' n3 n4 n5) T2}

cc_clos_code_typ_pres < backchain cc_typ_pres with SL = of n2 T1 :: of n1 (arr T1 T2) :: SL, M = R n1 n2, Map = map n2 n4 :: map n1 n3 :: Map n5, Vs = n2 :: n1 :: FVs.
Subgoal 2:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H3 : {is_sty (arr T1 T2)}
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
============================
 ctx (of n2 T1 :: of n1 (arr T1 T2) :: SL)

Subgoal 3 is:
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

cc_clos_code_typ_pres < backchain ctx_extend.
Subgoal 2.1:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H3 : {is_sty (arr T1 T2)}
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
============================
 ctx (of n1 (arr T1 T2) :: SL)

Subgoal 2.2 is:
 {is_sty T1}

Subgoal 3 is:
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

cc_clos_code_typ_pres < backchain ctx_extend.
Subgoal 2.2:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H3 : {is_sty (arr T1 T2)}
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
============================
 {is_sty T1}

Subgoal 3 is:
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

cc_clos_code_typ_pres < case H3.
Subgoal 2.2:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
H9 : {is_sty T1}
H10 : {is_sty T2}
============================
 {is_sty T1}

Subgoal 3 is:
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

cc_clos_code_typ_pres < search.
Subgoal 3:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H3 : {is_sty (arr T1 T2)}
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

cc_clos_code_typ_pres < case H3.
Subgoal 3:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
H9 : {is_sty T1}
H10 : {is_sty T2}
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

cc_clos_code_typ_pres < apply sty_to_cty to H9.
Subgoal 3:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
H9 : {is_sty T1}
H10 : {is_sty T2}
H11 : {is_cty T1}
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

cc_clos_code_typ_pres < apply sty_to_cty to H10.
Subgoal 3:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
H9 : {is_sty T1}
H10 : {is_sty T2}
H11 : {is_cty T1}
H12 : {is_cty T2}
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

cc_clos_code_typ_pres < apply reified_env_sty to _ H2.
Subgoal 3:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
H9 : {is_sty T1}
H10 : {is_sty T2}
H11 : {is_cty T1}
H12 : {is_cty T2}
H13 : {is_sty Ty}
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

cc_clos_code_typ_pres < apply sty_to_cty to H13.
Subgoal 3:

Variables: SL Ty T1 T2 R FVs Map R'
H1 : ctx SL
H2 : reified_env SL Ty
H4 : {SL, of n1 (arr T1 T2), of n2 T1 |- of (R n1 n2) T2}
H5 : vars_of_ctx SL FVs
H6 : {mapvar FVs Map}
H7 : {cc (map n2 n4 :: map n1 n3 :: Map n5) (n2 :: n1 :: FVs) (R n1 n2)
        (R' n3 n4 n5)}
H8 : good_map (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)
       (map n2 n4 :: map n1 n3 :: Map n5)
       (of n2 T1 :: of n1 (arr T1 T2) :: SL)
H9 : {is_sty T1}
H10 : {is_sty T2}
H11 : {is_cty T1}
H12 : {is_cty T2}
H13 : {is_sty Ty}
H14 : {is_cty Ty}
============================
 ctx' (of' n4 T1 :: of' n3 (arr T1 T2) :: of' n5 Ty :: nil)

cc_clos_code_typ_pres < search.
Proof completed.
Abella < Theorem cc_typ_pres_closed : 
forall M M' T, {of M T} -> {cc' M M'} -> {of' M' T}.


============================
 forall M M' T, {of M T} -> {cc' M M'} -> {of' M' T}

cc_typ_pres_closed < intros.

Variables: M M' T
H1 : {of M T}
H2 : {cc' M M'}
============================
 {of' M' T}

cc_typ_pres_closed < case H2.

Variables: M M' T
H1 : {of M T}
H3 : {cc nil nil M M'}
============================
 {of' M' T}

cc_typ_pres_closed < apply cc_typ_pres to _ _ _ H1 _ H3.

Variables: M M' T
H1 : {of M T}
H3 : {cc nil nil M M'}
H4 : {of' M' T}
============================
 {of' M' T}

cc_typ_pres_closed < search.
Proof completed.
Abella <