Welcome to Abella 2.0.5-dev
Abella < Specification "trans".
Reading specification "/home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/./trans" (from "/home/fac05/gopalan/test/sparrow/compiler-correctness/website/wang-phd-thesis/code/.")
Abella < Import "typing".
Importing from /home/fac05/gopalan/test/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 <