Welcome to Abella 1.1.3-dev2
Reading clauses from stlc-strong-norm.mod
Abella < Define sn M := forall N, {step M N} -> sn N.
Abella < Define neutral M := forall A R, M = abs A R -> false.
Abella < Define reduce M top := {of M top} /\ sn M.
Abella < Define reduce M (arrow A B) := {of M (arrow A B)} /\ (forall U, reduce U A -> reduce (app M U) B).
Warning: reduce/2 might not be stratified
Abella < Theorem reduce_of :
forall A M, reduce M A -> {of M A}.
1 subgoal(s).
============================
forall A M, reduce M A -> {of M A}
reduce_of < intros.
1 subgoal(s).
Variables: A, M
H1 : reduce M A
============================
{of M A}
reduce_of < case H1.
2 subgoal(s).
Variables: A, M
H2 : {of M top}
H3 : sn M
============================
{of M top}
subgoal 2 is:
{of M (arrow A1 B)}
reduce_of < search.
1 subgoal(s).
Variables: A, M, B, A1
H2 : {of M (arrow A1 B)}
H3 : forall U, reduce U A1 -> reduce (app M U) B
============================
{of M (arrow A1 B)}
reduce_of < search.
Proof completed.
Abella < Define ctx nil.
Abella < Define nabla x, ctx (of x A :: L) := {type A} /\ ctx L.
Abella < Define nabla x, name x.
Abella < Theorem ctx_member :
forall E L, ctx L -> member E L -> (exists X A, E = of X A /\ name X /\
{type A}).
1 subgoal(s).
============================
forall E L, ctx L -> member E L -> (exists X A, E = of X A /\ name X /\
{type A})
ctx_member < induction on 1.
1 subgoal(s).
IH : forall E L, ctx L * -> member E L -> (exists X A, E = of X A /\
name X /\ {type A})
============================
forall E L, ctx L @ -> member E L -> (exists X A, E = of X A /\ name X /\
{type A})
ctx_member < intros.
1 subgoal(s).
Variables: E, L
IH : forall E L, ctx L * -> member E L -> (exists X A, E = of X A /\
name X /\ {type A})
H1 : ctx L @
H2 : member E L
============================
exists X A, E = of X A /\ name X /\ {type A}
ctx_member < case H1.
2 subgoal(s).
Variables: E, L
IH : forall E L, ctx L * -> member E L -> (exists X A, E = of X A /\
name X /\ {type A})
H2 : member E nil
============================
exists X A, E = of X A /\ name X /\ {type A}
subgoal 2 is:
exists X A, E n1 = of X A /\ name X /\ {type A}
ctx_member < case H2.
1 subgoal(s).
Variables: E, L, L1, A
IH : forall E L, ctx L * -> member E L -> (exists X A, E = of X A /\
name X /\ {type A})
H2 : member (E n1) (of n1 A :: L1)
H3 : {type A}
H4 : ctx L1 *
============================
exists X A, E n1 = of X A /\ name X /\ {type A}
ctx_member < case H2.
2 subgoal(s).
Variables: E, L, L1, A
IH : forall E L, ctx L * -> member E L -> (exists X A, E = of X A /\
name X /\ {type A})
H3 : {type A}
H4 : ctx L1 *
============================
exists X A1, of n1 A = of X A1 /\ name X /\ {type A1}
subgoal 2 is:
exists X A, E n1 = of X A /\ name X /\ {type A}
ctx_member < search.
1 subgoal(s).
Variables: E, L, L1, A
IH : forall E L, ctx L * -> member E L -> (exists X A, E = of X A /\
name X /\ {type A})
H3 : {type A}
H4 : ctx L1 *
H5 : member (E n1) L1
============================
exists X A, E n1 = of X A /\ name X /\ {type A}
ctx_member < apply IH to H4 H5.
1 subgoal(s).
Variables: E, L, L1, A, X, A1
IH : forall E L, ctx L * -> member E L -> (exists X A, E = of X A /\
name X /\ {type A})
H3 : {type A}
H4 : ctx L1 *
H5 : member (of (X n1) (A1 n1)) L1
H6 : name (X n1)
H7 : {type (A1 n1)}
============================
exists X1 A, of (X n1) (A1 n1) = of X1 A /\ name X1 /\ {type A}
ctx_member < search.
Proof completed.
Abella < Theorem type_ignores_ctx :
forall L A, ctx L -> {L |- type A} -> {type A}.
1 subgoal(s).
============================
forall L A, ctx L -> {L |- type A} -> {type A}
type_ignores_ctx < induction on 2.
1 subgoal(s).
IH : forall L A, ctx L -> {L |- type A}* -> {type A}
============================
forall L A, ctx L -> {L |- type A}@ -> {type A}
type_ignores_ctx < intros.
1 subgoal(s).
Variables: L, A
IH : forall L A, ctx L -> {L |- type A}* -> {type A}
H1 : ctx L
H2 : {L |- type A}@
============================
{type A}
type_ignores_ctx < case H2.
3 subgoal(s).
Variables: L, A
IH : forall L A, ctx L -> {L |- type A}* -> {type A}
H1 : ctx L
H3 : member (type A) L
============================
{type A}
subgoal 2 is:
{type top}
subgoal 3 is:
{type (arrow A1 B)}
type_ignores_ctx < apply ctx_member to H1 H3.
2 subgoal(s).
Variables: L, A
IH : forall L A, ctx L -> {L |- type A}* -> {type A}
H1 : ctx L
============================
{type top}
subgoal 2 is:
{type (arrow A1 B)}
type_ignores_ctx < search.
1 subgoal(s).
Variables: L, A, B, A1
IH : forall L A, ctx L -> {L |- type A}* -> {type A}
H1 : ctx L
H3 : {L |- type A1}*
H4 : {L |- type B}*
============================
{type (arrow A1 B)}
type_ignores_ctx < apply IH to H1 H3.
1 subgoal(s).
Variables: L, A, B, A1
IH : forall L A, ctx L -> {L |- type A}* -> {type A}
H1 : ctx L
H3 : {L |- type A1}*
H4 : {L |- type B}*
H5 : {type A1}
============================
{type (arrow A1 B)}
type_ignores_ctx < apply IH to H1 H4.
1 subgoal(s).
Variables: L, A, B, A1
IH : forall L A, ctx L -> {L |- type A}* -> {type A}
H1 : ctx L
H3 : {L |- type A1}*
H4 : {L |- type B}*
H5 : {type A1}
H6 : {type B}
============================
{type (arrow A1 B)}
type_ignores_ctx < search.
Proof completed.
Abella < Theorem case_of_app :
forall L M N B, ctx L -> {L |- of (app M N) B} -> (exists A,
{L |- of M (arrow A B)} /\ {L |- of N A}).
1 subgoal(s).
============================
forall L M N B, ctx L -> {L |- of (app M N) B} -> (exists A,
{L |- of M (arrow A B)} /\ {L |- of N A})
case_of_app < intros.
1 subgoal(s).
Variables: L, M, N, B
H1 : ctx L
H2 : {L |- of (app M N) B}
============================
exists A, {L |- of M (arrow A B)} /\ {L |- of N A}
case_of_app < case H2.
2 subgoal(s).
Variables: L, M, N, B
H1 : ctx L
H3 : member (of (app M N) B) L
============================
exists A, {L |- of M (arrow A B)} /\ {L |- of N A}
subgoal 2 is:
exists A, {L |- of M (arrow A B)} /\ {L |- of N A}
case_of_app < apply ctx_member to H1 H3.
2 subgoal(s).
Variables: L, M, N, B, X, A
H1 : ctx L
H3 : member (of (app M N) A) L
H4 : name (app M N)
H5 : {type A}
============================
exists A1, {L |- of M (arrow A1 A)} /\ {L |- of N A1}
subgoal 2 is:
exists A, {L |- of M (arrow A B)} /\ {L |- of N A}
case_of_app < case H4.
1 subgoal(s).
Variables: L, M, N, B, A
H1 : ctx L
H3 : {L |- of M (arrow A B)}
H4 : {L |- of N A}
============================
exists A, {L |- of M (arrow A B)} /\ {L |- of N A}
case_of_app < search.
Proof completed.
Abella < Theorem case_of_abs :
forall L M A B, ctx L -> {L |- of (abs A M) B} -> (exists C, B = arrow A C /\
{type A} /\ (nabla x, {L, of x A |- of (M x) C})).
1 subgoal(s).
============================
forall L M A B, ctx L -> {L |- of (abs A M) B} -> (exists C,
B = arrow A C /\ {type A} /\ (nabla x, {L, of x A |- of (M x) C}))
case_of_abs < intros.
1 subgoal(s).
Variables: L, M, A, B
H1 : ctx L
H2 : {L |- of (abs A M) B}
============================
exists C, B = arrow A C /\ {type A} /\ (nabla x,
{L, of x A |- of (M x) C})
case_of_abs < case H2.
2 subgoal(s).
Variables: L, M, A, B
H1 : ctx L
H3 : member (of (abs A M) B) L
============================
exists C, B = arrow A C /\ {type A} /\ (nabla x,
{L, of x A |- of (M x) C})
subgoal 2 is:
exists C, arrow A B1 = arrow A C /\ {type A} /\ (nabla x,
{L, of x A |- of (M x) C})
case_of_abs < apply ctx_member to H1 H3.
2 subgoal(s).
Variables: L, M, A, B, X, A1
H1 : ctx L
H3 : member (of (abs A M) A1) L
H4 : name (abs A M)
H5 : {type A1}
============================
exists C, A1 = arrow A C /\ {type A} /\ (nabla x,
{L, of x A |- of (M x) C})
subgoal 2 is:
exists C, arrow A B1 = arrow A C /\ {type A} /\ (nabla x,
{L, of x A |- of (M x) C})
case_of_abs < case H4.
1 subgoal(s).
Variables: L, M, A, B, B1
H1 : ctx L
H3 : {L |- type A}
H4 : {L, of n1 A |- of (M n1) B1}
============================
exists C, arrow A B1 = arrow A C /\ {type A} /\ (nabla x,
{L, of x A |- of (M x) C})
case_of_abs < apply type_ignores_ctx to H1 H3.
1 subgoal(s).
Variables: L, M, A, B, B1
H1 : ctx L
H3 : {L |- type A}
H4 : {L, of n1 A |- of (M n1) B1}
H5 : {type A}
============================
exists C, arrow A B1 = arrow A C /\ {type A} /\ (nabla x,
{L, of x A |- of (M x) C})
case_of_abs < search.
Proof completed.
Abella < Theorem of_step_ext :
forall L M N A, ctx L -> {L |- of M A} -> {step M N} -> {L |- of N A}.
1 subgoal(s).
============================
forall L M N A, ctx L -> {L |- of M A} -> {step M N} -> {L |- of N A}
of_step_ext < induction on 3.
1 subgoal(s).
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
============================
forall L M N A, ctx L -> {L |- of M A} -> {step M N}@ -> {L |- of N A}
of_step_ext < intros.
1 subgoal(s).
Variables: L, M, N, A
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of M A}
H3 : {step M N}@
============================
{L |- of N A}
of_step_ext < case H3.
4 subgoal(s).
Variables: L, M, N, A, M', N1, M1
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app M1 N1) A}
H4 : {step M1 M'}*
============================
{L |- of (app M' N1) A}
subgoal 2 is:
{L |- of (app M1 N') A}
subgoal 3 is:
{L |- of (R M1) A}
subgoal 4 is:
{L |- of (abs A1 R') A}
of_step_ext < apply case_of_app to H1 H2.
4 subgoal(s).
Variables: L, M, N, A, M', N1, M1, A1
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app M1 N1) A}
H4 : {step M1 M'}*
H5 : {L |- of M1 (arrow A1 A)}
H6 : {L |- of N1 A1}
============================
{L |- of (app M' N1) A}
subgoal 2 is:
{L |- of (app M1 N') A}
subgoal 3 is:
{L |- of (R M1) A}
subgoal 4 is:
{L |- of (abs A1 R') A}
of_step_ext < apply IH to H1 H5 H4.
4 subgoal(s).
Variables: L, M, N, A, M', N1, M1, A1
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app M1 N1) A}
H4 : {step M1 M'}*
H5 : {L |- of M1 (arrow A1 A)}
H6 : {L |- of N1 A1}
H7 : {L |- of M' (arrow A1 A)}
============================
{L |- of (app M' N1) A}
subgoal 2 is:
{L |- of (app M1 N') A}
subgoal 3 is:
{L |- of (R M1) A}
subgoal 4 is:
{L |- of (abs A1 R') A}
of_step_ext < search.
3 subgoal(s).
Variables: L, M, N, A, N', N1, M1
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app M1 N1) A}
H4 : {step N1 N'}*
============================
{L |- of (app M1 N') A}
subgoal 2 is:
{L |- of (R M1) A}
subgoal 3 is:
{L |- of (abs A1 R') A}
of_step_ext < apply case_of_app to H1 H2.
3 subgoal(s).
Variables: L, M, N, A, N', N1, M1, A1
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app M1 N1) A}
H4 : {step N1 N'}*
H5 : {L |- of M1 (arrow A1 A)}
H6 : {L |- of N1 A1}
============================
{L |- of (app M1 N') A}
subgoal 2 is:
{L |- of (R M1) A}
subgoal 3 is:
{L |- of (abs A1 R') A}
of_step_ext < apply IH to H1 H6 H4.
3 subgoal(s).
Variables: L, M, N, A, N', N1, M1, A1
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app M1 N1) A}
H4 : {step N1 N'}*
H5 : {L |- of M1 (arrow A1 A)}
H6 : {L |- of N1 A1}
H7 : {L |- of N' A1}
============================
{L |- of (app M1 N') A}
subgoal 2 is:
{L |- of (R M1) A}
subgoal 3 is:
{L |- of (abs A1 R') A}
of_step_ext < search.
2 subgoal(s).
Variables: L, M, N, A, M1, R, A1
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app (abs A1 R) M1) A}
============================
{L |- of (R M1) A}
subgoal 2 is:
{L |- of (abs A1 R') A}
of_step_ext < apply case_of_app to H1 H2.
2 subgoal(s).
Variables: L, M, N, A, M1, R, A1, A2
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app (abs A1 R) M1) A}
H4 : {L |- of (abs A1 R) (arrow A2 A)}
H5 : {L |- of M1 A2}
============================
{L |- of (R M1) A}
subgoal 2 is:
{L |- of (abs A1 R') A}
of_step_ext < apply case_of_abs to H1 H4.
2 subgoal(s).
Variables: L, M, N, A, M1, R, A1, A2, C
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app (abs A1 R) M1) C}
H4 : {L |- of (abs A1 R) (arrow A1 C)}
H5 : {L |- of M1 A1}
H6 : {type A1}
H7 : {L, of n1 A1 |- of (R n1) C}
============================
{L |- of (R M1) C}
subgoal 2 is:
{L |- of (abs A1 R') A}
of_step_ext < inst H7 with n1 = M1.
2 subgoal(s).
Variables: L, M, N, A, M1, R, A1, A2, C
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app (abs A1 R) M1) C}
H4 : {L |- of (abs A1 R) (arrow A1 C)}
H5 : {L |- of M1 A1}
H6 : {type A1}
H7 : {L, of n1 A1 |- of (R n1) C}
H8 : {L, of M1 A1 |- of (R M1) C}
============================
{L |- of (R M1) C}
subgoal 2 is:
{L |- of (abs A1 R') A}
of_step_ext < cut H8 with H5.
2 subgoal(s).
Variables: L, M, N, A, M1, R, A1, A2, C
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (app (abs A1 R) M1) C}
H4 : {L |- of (abs A1 R) (arrow A1 C)}
H5 : {L |- of M1 A1}
H6 : {type A1}
H7 : {L, of n1 A1 |- of (R n1) C}
H8 : {L, of M1 A1 |- of (R M1) C}
H9 : {L |- of (R M1) C}
============================
{L |- of (R M1) C}
subgoal 2 is:
{L |- of (abs A1 R') A}
of_step_ext < search.
1 subgoal(s).
Variables: L, M, N, A, R', R, A1
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (abs A1 R) A}
H4 : {step (R n1) (R' n1)}*
============================
{L |- of (abs A1 R') A}
of_step_ext < apply case_of_abs to H1 H2.
1 subgoal(s).
Variables: L, M, N, A, R', R, A1, C
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (abs A1 R) (arrow A1 C)}
H4 : {step (R n1) (R' n1)}*
H5 : {type A1}
H6 : {L, of n1 A1 |- of (R n1) C}
============================
{L |- of (abs A1 R') (arrow A1 C)}
of_step_ext < apply IH to _ H6 H4.
1 subgoal(s).
Variables: L, M, N, A, R', R, A1, C
IH : forall L M N A, ctx L -> {L |- of M A} -> {step M N}* -> {L |- of N A}
H1 : ctx L
H2 : {L |- of (abs A1 R) (arrow A1 C)}
H4 : {step (R n1) (R' n1)}*
H5 : {type A1}
H6 : {L, of n1 A1 |- of (R n1) C}
H7 : {L, of n1 A1 |- of (R' n1) C}
============================
{L |- of (abs A1 R') (arrow A1 C)}
of_step_ext < search.
Proof completed.
Abella < Theorem of_step :
forall M N A, {of M A} -> {step M N} -> {of N A}.
1 subgoal(s).
============================
forall M N A, {of M A} -> {step M N} -> {of N A}
of_step < intros.
1 subgoal(s).
Variables: M, N, A
H1 : {of M A}
H2 : {step M N}
============================
{of N A}
of_step < apply of_step_ext to _ H1 H2.
1 subgoal(s).
Variables: M, N, A
H1 : {of M A}
H2 : {step M N}
H3 : {of N A}
============================
{of N A}
of_step < search.
Proof completed.
Abella < Theorem sn_step :
forall M N, sn M -> {step M N} -> sn N.
1 subgoal(s).
============================
forall M N, sn M -> {step M N} -> sn N
sn_step < intros.
1 subgoal(s).
Variables: M, N
H1 : sn M
H2 : {step M N}
============================
sn N
sn_step < case H1.
1 subgoal(s).
Variables: M, N
H2 : {step M N}
H3 : forall N, {step M N} -> sn N
============================
sn N
sn_step < apply H3 to H2.
1 subgoal(s).
Variables: M, N
H2 : {step M N}
H3 : forall N, {step M N} -> sn N
H4 : sn N
============================
sn N
sn_step < search.
Proof completed.
Abella < Theorem reduce_step :
forall M N A, reduce M A -> {step M N} -> reduce N A.
1 subgoal(s).
============================
forall M N A, reduce M A -> {step M N} -> reduce N A
reduce_step < induction on 1.
1 subgoal(s).
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
============================
forall M N A, reduce M A @ -> {step M N} -> reduce N A
reduce_step < intros.
1 subgoal(s).
Variables: M, N, A
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H1 : reduce M A @
H2 : {step M N}
============================
reduce N A
reduce_step < case H1.
2 subgoal(s).
Variables: M, N, A
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H2 : {step M N}
H3 : {of M top}
H4 : sn M
============================
reduce N top
subgoal 2 is:
reduce N (arrow A1 B)
reduce_step < apply of_step to H3 H2.
2 subgoal(s).
Variables: M, N, A
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H2 : {step M N}
H3 : {of M top}
H4 : sn M
H5 : {of N top}
============================
reduce N top
subgoal 2 is:
reduce N (arrow A1 B)
reduce_step < apply sn_step to H4 H2.
2 subgoal(s).
Variables: M, N, A
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H2 : {step M N}
H3 : {of M top}
H4 : sn M
H5 : {of N top}
H6 : sn N
============================
reduce N top
subgoal 2 is:
reduce N (arrow A1 B)
reduce_step < search.
1 subgoal(s).
Variables: M, N, A, B, A1
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H2 : {step M N}
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B *
============================
reduce N (arrow A1 B)
reduce_step < unfold.
2 subgoal(s).
Variables: M, N, A, B, A1
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H2 : {step M N}
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B *
============================
{of N (arrow A1 B)}
subgoal 2 is:
forall U, reduce U A1 -> reduce (app N U) B
reduce_step < apply of_step to H3 H2.
2 subgoal(s).
Variables: M, N, A, B, A1
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H2 : {step M N}
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B *
H5 : {of N (arrow A1 B)}
============================
{of N (arrow A1 B)}
subgoal 2 is:
forall U, reduce U A1 -> reduce (app N U) B
reduce_step < search.
1 subgoal(s).
Variables: M, N, A, B, A1
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H2 : {step M N}
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B *
============================
forall U, reduce U A1 -> reduce (app N U) B
reduce_step < intros.
1 subgoal(s).
Variables: M, N, A, B, A1, U
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H2 : {step M N}
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B *
H5 : reduce U A1
============================
reduce (app N U) B
reduce_step < apply H4 to H5.
1 subgoal(s).
Variables: M, N, A, B, A1, U
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H2 : {step M N}
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B *
H5 : reduce U A1
H6 : reduce (app M U) B *
============================
reduce (app N U) B
reduce_step < apply IH to H6 _.
1 subgoal(s).
Variables: M, N, A, B, A1, U
IH : forall M N A, reduce M A * -> {step M N} -> reduce N A
H2 : {step M N}
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B *
H5 : reduce U A1
H6 : reduce (app M U) B *
H7 : reduce (app N U) B
============================
reduce (app N U) B
reduce_step < search.
Proof completed.
Abella < Theorem sn_app_c :
forall M, sn (app M c) -> sn M.
1 subgoal(s).
============================
forall M, sn (app M c) -> sn M
sn_app_c < induction on 1.
1 subgoal(s).
IH : forall M, sn (app M c) * -> sn M
============================
forall M, sn (app M c) @ -> sn M
sn_app_c < intros.
1 subgoal(s).
Variables: M
IH : forall M, sn (app M c) * -> sn M
H1 : sn (app M c) @
============================
sn M
sn_app_c < case H1.
1 subgoal(s).
Variables: M
IH : forall M, sn (app M c) * -> sn M
H2 : forall N, {step (app M c) N} -> sn N *
============================
sn M
sn_app_c < unfold.
1 subgoal(s).
Variables: M
IH : forall M, sn (app M c) * -> sn M
H2 : forall N, {step (app M c) N} -> sn N *
============================
forall N, {step M N} -> sn N
sn_app_c < intros.
1 subgoal(s).
Variables: M, N
IH : forall M, sn (app M c) * -> sn M
H2 : forall N, {step (app M c) N} -> sn N *
H3 : {step M N}
============================
sn N
sn_app_c < assert {step (app M c) (app N c)}.
1 subgoal(s).
Variables: M, N
IH : forall M, sn (app M c) * -> sn M
H2 : forall N, {step (app M c) N} -> sn N *
H3 : {step M N}
H4 : {step (app M c) (app N c)}
============================
sn N
sn_app_c < apply H2 to H4.
1 subgoal(s).
Variables: M, N
IH : forall M, sn (app M c) * -> sn M
H2 : forall N, {step (app M c) N} -> sn N *
H3 : {step M N}
H4 : {step (app M c) (app N c)}
H5 : sn (app N c) *
============================
sn N
sn_app_c < apply IH to H5.
1 subgoal(s).
Variables: M, N
IH : forall M, sn (app M c) * -> sn M
H2 : forall N, {step (app M c) N} -> sn N *
H3 : {step M N}
H4 : {step (app M c) (app N c)}
H5 : sn (app N c) *
H6 : sn N
============================
sn N
sn_app_c < search.
Proof completed.
Abella < Theorem cr1_cr3 :
(forall A M, {type A} -> reduce M A -> sn M) /\ (forall A M, neutral M ->
{of M A} -> {type A} -> (forall P, {step M P} -> reduce P A) -> reduce M A).
1 subgoal(s).
============================
(forall A M, {type A} -> reduce M A -> sn M) /\ (forall A M, neutral M ->
{of M A} -> {type A} -> (forall P, {step M P} -> reduce P A) ->
reduce M A)
cr1_cr3 < induction on 1 3.
1 subgoal(s).
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
============================
(forall A M, {type A}@ -> reduce M A -> sn M) /\ (forall A M, neutral M ->
{of M A} -> {type A}@ -> (forall P, {step M P} -> reduce P A) ->
reduce M A)
cr1_cr3 < split*.
2 subgoal(s).
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
============================
forall A M, {type A}@ -> reduce M A -> sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < intros.
2 subgoal(s).
Variables: A, M
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : {type A}@
H2 : reduce M A
============================
sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < case H2.
3 subgoal(s).
Variables: A, M
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : {type top}@
H3 : {of M top}
H4 : sn M
============================
sn M
subgoal 2 is:
sn M
subgoal 3 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < search.
2 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : {type (arrow A1 B)}@
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
============================
sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < case H1.
2 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
============================
sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < assert neutral c.
3 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
============================
neutral c
subgoal 2 is:
sn M
subgoal 3 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < unfold.
3 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
============================
forall A R, c = abs A R -> false
subgoal 2 is:
sn M
subgoal 3 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < intros.
3 subgoal(s).
Variables: A, M, B, A1, A2, R
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
H7 : c = abs A2 R
============================
false
subgoal 2 is:
sn M
subgoal 3 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < case H7.
2 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
H7 : neutral c
============================
sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < assert {of c A1}.
2 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
H7 : neutral c
H8 : {of c A1}
============================
sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < assert forall P, {step c P} -> reduce P A1.
3 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
H7 : neutral c
H8 : {of c A1}
============================
forall P, {step c P} -> reduce P A1
subgoal 2 is:
sn M
subgoal 3 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < intros.
3 subgoal(s).
Variables: A, M, B, A1, P
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
H7 : neutral c
H8 : {of c A1}
H9 : {step c P}
============================
reduce P A1
subgoal 2 is:
sn M
subgoal 3 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < case H9.
2 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
H7 : neutral c
H8 : {of c A1}
H9 : forall P, {step c P} -> reduce P A1
============================
sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < apply IH1 to H7 H8 H5 H9.
2 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
H7 : neutral c
H8 : {of c A1}
H9 : forall P, {step c P} -> reduce P A1
H10 : reduce c A1
============================
sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < apply H4 to H10.
2 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
H7 : neutral c
H8 : {of c A1}
H9 : forall P, {step c P} -> reduce P A1
H10 : reduce c A1
H11 : reduce (app M c) B
============================
sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < apply IH to H6 H11.
2 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
H7 : neutral c
H8 : {of c A1}
H9 : forall P, {step c P} -> reduce P A1
H10 : reduce c A1
H11 : reduce (app M c) B
H12 : sn (app M c)
============================
sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < apply sn_app_c to H12.
2 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H3 : {of M (arrow A1 B)}
H4 : forall U, reduce U A1 -> reduce (app M U) B
H5 : {type A1}*
H6 : {type B}*
H7 : neutral c
H8 : {of c A1}
H9 : forall P, {step c P} -> reduce P A1
H10 : reduce c A1
H11 : reduce (app M c) B
H12 : sn (app M c)
H13 : sn M
============================
sn M
subgoal 2 is:
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < search.
1 subgoal(s).
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
============================
forall A M, neutral M -> {of M A} -> {type A}@ -> (forall P, {step M P} ->
reduce P A) -> reduce M A
cr1_cr3 < intros.
1 subgoal(s).
Variables: A, M
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M A}
H4 : {type A}@
H5 : forall P, {step M P} -> reduce P A
============================
reduce M A
cr1_cr3 < case H4 (keep).
2 subgoal(s).
Variables: A, M
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M top}
H4 : {type top}@
H5 : forall P, {step M P} -> reduce P top
============================
reduce M top
subgoal 2 is:
reduce M (arrow A1 B)
cr1_cr3 < unfold.
3 subgoal(s).
Variables: A, M
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M top}
H4 : {type top}@
H5 : forall P, {step M P} -> reduce P top
============================
{of M top}
subgoal 2 is:
sn M
subgoal 3 is:
reduce M (arrow A1 B)
cr1_cr3 < search.
2 subgoal(s).
Variables: A, M
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M top}
H4 : {type top}@
H5 : forall P, {step M P} -> reduce P top
============================
sn M
subgoal 2 is:
reduce M (arrow A1 B)
cr1_cr3 < unfold.
2 subgoal(s).
Variables: A, M
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M top}
H4 : {type top}@
H5 : forall P, {step M P} -> reduce P top
============================
forall N, {step M N} -> sn N
subgoal 2 is:
reduce M (arrow A1 B)
cr1_cr3 < intros.
2 subgoal(s).
Variables: A, M, N
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M top}
H4 : {type top}@
H5 : forall P, {step M P} -> reduce P top
H6 : {step M N}
============================
sn N
subgoal 2 is:
reduce M (arrow A1 B)
cr1_cr3 < apply H5 to H6.
2 subgoal(s).
Variables: A, M, N
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M top}
H4 : {type top}@
H5 : forall P, {step M P} -> reduce P top
H6 : {step M N}
H7 : reduce N top
============================
sn N
subgoal 2 is:
reduce M (arrow A1 B)
cr1_cr3 < apply H1 to H4 H7.
2 subgoal(s).
Variables: A, M, N
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M top}
H4 : {type top}@
H5 : forall P, {step M P} -> reduce P top
H6 : {step M N}
H7 : reduce N top
H8 : sn N
============================
sn N
subgoal 2 is:
reduce M (arrow A1 B)
cr1_cr3 < search.
1 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
============================
reduce M (arrow A1 B)
cr1_cr3 < unfold.
2 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
============================
{of M (arrow A1 B)}
subgoal 2 is:
forall U, reduce U A1 -> reduce (app M U) B
cr1_cr3 < search.
1 subgoal(s).
Variables: A, M, B, A1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
============================
forall U, reduce U A1 -> reduce (app M U) B
cr1_cr3 < intros.
1 subgoal(s).
Variables: A, M, B, A1, U
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
============================
reduce (app M U) B
cr1_cr3 < apply IH to H6 H8.
1 subgoal(s).
Variables: A, M, B, A1, U
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
============================
reduce (app M U) B
cr1_cr3 < assert forall U, sn U -> reduce U A1 -> reduce (app M U) B.
2 subgoal(s).
Variables: A, M, B, A1, U
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
============================
forall U, sn U -> reduce U A1 -> reduce (app M U) B
subgoal 2 is:
reduce (app M U) B
cr1_cr3 < induction on 1.
2 subgoal(s).
Variables: A, M, B, A1, U
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
============================
forall U, sn U @@ -> reduce U A1 -> reduce (app M U) B
subgoal 2 is:
reduce (app M U) B
cr1_cr3 < intros.
2 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H10 : sn U1 @@
H11 : reduce U1 A1
============================
reduce (app M U1) B
subgoal 2 is:
reduce (app M U) B
cr1_cr3 < case H10.
2 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
============================
reduce (app M U1) B
subgoal 2 is:
reduce (app M U) B
cr1_cr3 < assert forall P, {step (app M U1) P} -> reduce P B.
3 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
============================
forall P, {step (app M U1) P} -> reduce P B
subgoal 2 is:
reduce (app M U1) B
subgoal 3 is:
reduce (app M U) B
cr1_cr3 < intros.
3 subgoal(s).
Variables: A, M, B, A1, U, U1, P
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H13 : {step (app M U1) P}
============================
reduce P B
subgoal 2 is:
reduce (app M U1) B
subgoal 3 is:
reduce (app M U) B
cr1_cr3 < case H13.
5 subgoal(s).
Variables: A, M, B, A1, U, U1, P, M'
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H14 : {step M M'}
============================
reduce (app M' U1) B
subgoal 2 is:
reduce (app M N') B
subgoal 3 is:
reduce (R U1) B
subgoal 4 is:
reduce (app M U1) B
subgoal 5 is:
reduce (app M U) B
cr1_cr3 < apply H5 to H14.
5 subgoal(s).
Variables: A, M, B, A1, U, U1, P, M'
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H14 : {step M M'}
H15 : reduce M' (arrow A1 B)
============================
reduce (app M' U1) B
subgoal 2 is:
reduce (app M N') B
subgoal 3 is:
reduce (R U1) B
subgoal 4 is:
reduce (app M U1) B
subgoal 5 is:
reduce (app M U) B
cr1_cr3 < case H15.
5 subgoal(s).
Variables: A, M, B, A1, U, U1, P, M'
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H14 : {step M M'}
H16 : {of M' (arrow A1 B)}
H17 : forall U, reduce U A1 -> reduce (app M' U) B
============================
reduce (app M' U1) B
subgoal 2 is:
reduce (app M N') B
subgoal 3 is:
reduce (R U1) B
subgoal 4 is:
reduce (app M U1) B
subgoal 5 is:
reduce (app M U) B
cr1_cr3 < apply H17 to H11.
5 subgoal(s).
Variables: A, M, B, A1, U, U1, P, M'
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H14 : {step M M'}
H16 : {of M' (arrow A1 B)}
H17 : forall U, reduce U A1 -> reduce (app M' U) B
H18 : reduce (app M' U1) B
============================
reduce (app M' U1) B
subgoal 2 is:
reduce (app M N') B
subgoal 3 is:
reduce (R U1) B
subgoal 4 is:
reduce (app M U1) B
subgoal 5 is:
reduce (app M U) B
cr1_cr3 < search.
4 subgoal(s).
Variables: A, M, B, A1, U, U1, P, N'
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H14 : {step U1 N'}
============================
reduce (app M N') B
subgoal 2 is:
reduce (R U1) B
subgoal 3 is:
reduce (app M U1) B
subgoal 4 is:
reduce (app M U) B
cr1_cr3 < apply H12 to H14.
4 subgoal(s).
Variables: A, M, B, A1, U, U1, P, N'
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H14 : {step U1 N'}
H15 : sn N' **
============================
reduce (app M N') B
subgoal 2 is:
reduce (R U1) B
subgoal 3 is:
reduce (app M U1) B
subgoal 4 is:
reduce (app M U) B
cr1_cr3 < apply reduce_step to H11 H14.
4 subgoal(s).
Variables: A, M, B, A1, U, U1, P, N'
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H14 : {step U1 N'}
H15 : sn N' **
H16 : reduce N' A1
============================
reduce (app M N') B
subgoal 2 is:
reduce (R U1) B
subgoal 3 is:
reduce (app M U1) B
subgoal 4 is:
reduce (app M U) B
cr1_cr3 < apply IH2 to H15 H16.
4 subgoal(s).
Variables: A, M, B, A1, U, U1, P, N'
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H14 : {step U1 N'}
H15 : sn N' **
H16 : reduce N' A1
H17 : reduce (app M N') B
============================
reduce (app M N') B
subgoal 2 is:
reduce (R U1) B
subgoal 3 is:
reduce (app M U1) B
subgoal 4 is:
reduce (app M U) B
cr1_cr3 < search.
3 subgoal(s).
Variables: A, M, B, A1, U, U1, P, R, A2
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral (abs A2 R)
H3 : {of (abs A2 R) (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step (abs A2 R) P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app (abs A2 R) U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
============================
reduce (R U1) B
subgoal 2 is:
reduce (app M U1) B
subgoal 3 is:
reduce (app M U) B
cr1_cr3 < case H2.
3 subgoal(s).
Variables: A, M, B, A1, U, U1, P, R, A2
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H3 : {of (abs A2 R) (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step (abs A2 R) P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app (abs A2 R) U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H14 : forall A R1, abs A2 R = abs A R1 -> false
============================
reduce (R U1) B
subgoal 2 is:
reduce (app M U1) B
subgoal 3 is:
reduce (app M U) B
cr1_cr3 < apply H14 to _.
2 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H13 : forall P, {step (app M U1) P} -> reduce P B
============================
reduce (app M U1) B
subgoal 2 is:
reduce (app M U) B
cr1_cr3 < assert neutral (app M U1).
3 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H13 : forall P, {step (app M U1) P} -> reduce P B
============================
neutral (app M U1)
subgoal 2 is:
reduce (app M U1) B
subgoal 3 is:
reduce (app M U) B
cr1_cr3 < unfold.
3 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H13 : forall P, {step (app M U1) P} -> reduce P B
============================
forall A R, app M U1 = abs A R -> false
subgoal 2 is:
reduce (app M U1) B
subgoal 3 is:
reduce (app M U) B
cr1_cr3 < intros.
3 subgoal(s).
Variables: A, M, B, A1, U, U1, A2, R
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H13 : forall P, {step (app M U1) P} -> reduce P B
H14 : app M U1 = abs A2 R
============================
false
subgoal 2 is:
reduce (app M U1) B
subgoal 3 is:
reduce (app M U) B
cr1_cr3 < case H14.
2 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H13 : forall P, {step (app M U1) P} -> reduce P B
H14 : neutral (app M U1)
============================
reduce (app M U1) B
subgoal 2 is:
reduce (app M U) B
cr1_cr3 < assert {of (app M U1) B}.
3 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H13 : forall P, {step (app M U1) P} -> reduce P B
H14 : neutral (app M U1)
============================
{of (app M U1) B}
subgoal 2 is:
reduce (app M U1) B
subgoal 3 is:
reduce (app M U) B
cr1_cr3 < apply reduce_of to H11.
3 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H13 : forall P, {step (app M U1) P} -> reduce P B
H14 : neutral (app M U1)
H15 : {of U1 A1}
============================
{of (app M U1) B}
subgoal 2 is:
reduce (app M U1) B
subgoal 3 is:
reduce (app M U) B
cr1_cr3 < search.
2 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H13 : forall P, {step (app M U1) P} -> reduce P B
H14 : neutral (app M U1)
H15 : {of (app M U1) B}
============================
reduce (app M U1) B
subgoal 2 is:
reduce (app M U) B
cr1_cr3 < apply IH1 to H14 H15 H7 H13.
2 subgoal(s).
Variables: A, M, B, A1, U, U1
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
IH2 : forall U, sn U ** -> reduce U A1 -> reduce (app M U) B
H11 : reduce U1 A1
H12 : forall N, {step U1 N} -> sn N **
H13 : forall P, {step (app M U1) P} -> reduce P B
H14 : neutral (app M U1)
H15 : {of (app M U1) B}
H16 : reduce (app M U1) B
============================
reduce (app M U1) B
subgoal 2 is:
reduce (app M U) B
cr1_cr3 < search.
1 subgoal(s).
Variables: A, M, B, A1, U
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
H10 : forall U, sn U -> reduce U A1 -> reduce (app M U) B
============================
reduce (app M U) B
cr1_cr3 < apply H10 to H9 H8.
1 subgoal(s).
Variables: A, M, B, A1, U
IH : forall A M, {type A}* -> reduce M A -> sn M
IH1 : forall A M, neutral M -> {of M A} -> {type A}* -> (forall P,
{step M P} -> reduce P A) -> reduce M A
H1 : forall A M, {type A}@ -> reduce M A -> sn M
H2 : neutral M
H3 : {of M (arrow A1 B)}
H4 : {type (arrow A1 B)}@
H5 : forall P, {step M P} -> reduce P (arrow A1 B)
H6 : {type A1}*
H7 : {type B}*
H8 : reduce U A1
H9 : sn U
H10 : forall U, sn U -> reduce U A1 -> reduce (app M U) B
H11 : reduce (app M U) B
============================
reduce (app M U) B
cr1_cr3 < search.
Proof completed.
Abella < Theorem reduce_sn :
forall A M, {type A} -> reduce M A -> sn M.
1 subgoal(s).
============================
forall A M, {type A} -> reduce M A -> sn M
reduce_sn < apply cr1_cr3.
1 subgoal(s).
H1 : forall A M, {type A} -> reduce M A -> sn M
H2 : forall A M, neutral M -> {of M A} -> {type A} -> (forall P,
{step M P} -> reduce P A) -> reduce M A
============================
forall A M, {type A} -> reduce M A -> sn M
reduce_sn < search.
Proof completed.
Abella < Theorem neutral_step_reduce :
forall A M, neutral M -> {of M A} -> {type A} -> (forall P, {step M P} ->
reduce P A) -> reduce M A.
1 subgoal(s).
============================
forall A M, neutral M -> {of M A} -> {type A} -> (forall P, {step M P} ->
reduce P A) -> reduce M A
neutral_step_reduce < apply cr1_cr3.
1 subgoal(s).
H1 : forall A M, {type A} -> reduce M A -> sn M
H2 : forall A M, neutral M -> {of M A} -> {type A} -> (forall P,
{step M P} -> reduce P A) -> reduce M A
============================
forall A M, neutral M -> {of M A} -> {type A} -> (forall P, {step M P} ->
reduce P A) -> reduce M A
neutral_step_reduce < search.
Proof completed.
Abella < Theorem of_type_ext :
forall L M A, ctx L -> {L |- of M A} -> {type A}.
1 subgoal(s).
============================
forall L M A, ctx L -> {L |- of M A} -> {type A}
of_type_ext < induction on 2.
1 subgoal(s).
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
============================
forall L M A, ctx L -> {L |- of M A}@ -> {type A}
of_type_ext < intros.
1 subgoal(s).
Variables: L, M, A
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H2 : {L |- of M A}@
============================
{type A}
of_type_ext < case H2.
4 subgoal(s).
Variables: L, M, A
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H3 : member (of M A) L
============================
{type A}
subgoal 2 is:
{type A}
subgoal 3 is:
{type (arrow A1 B)}
subgoal 4 is:
{type A}
of_type_ext < apply ctx_member to H1 H3.
4 subgoal(s).
Variables: L, M, A, X, A1
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H3 : member (of X A1) L
H4 : name X
H5 : {type A1}
============================
{type A1}
subgoal 2 is:
{type A}
subgoal 3 is:
{type (arrow A1 B)}
subgoal 4 is:
{type A}
of_type_ext < search.
3 subgoal(s).
Variables: L, M, A, A1, N, M1
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H3 : {L |- of M1 (arrow A1 A)}*
H4 : {L |- of N A1}*
============================
{type A}
subgoal 2 is:
{type (arrow A1 B)}
subgoal 3 is:
{type A}
of_type_ext < apply IH to H1 H3.
3 subgoal(s).
Variables: L, M, A, A1, N, M1
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H3 : {L |- of M1 (arrow A1 A)}*
H4 : {L |- of N A1}*
H5 : {type (arrow A1 A)}
============================
{type A}
subgoal 2 is:
{type (arrow A1 B)}
subgoal 3 is:
{type A}
of_type_ext < case H5.
3 subgoal(s).
Variables: L, M, A, A1, N, M1
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H3 : {L |- of M1 (arrow A1 A)}*
H4 : {L |- of N A1}*
H6 : {type A1}
H7 : {type A}
============================
{type A}
subgoal 2 is:
{type (arrow A1 B)}
subgoal 3 is:
{type A}
of_type_ext < search.
2 subgoal(s).
Variables: L, M, A, B, R, A1
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H3 : {L |- type A1}*
H4 : {L, of n1 A1 |- of (R n1) B}*
============================
{type (arrow A1 B)}
subgoal 2 is:
{type A}
of_type_ext < apply type_ignores_ctx to H1 H3.
2 subgoal(s).
Variables: L, M, A, B, R, A1
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H3 : {L |- type A1}*
H4 : {L, of n1 A1 |- of (R n1) B}*
H5 : {type A1}
============================
{type (arrow A1 B)}
subgoal 2 is:
{type A}
of_type_ext < apply IH to _ H4.
2 subgoal(s).
Variables: L, M, A, B, R, A1
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H3 : {L |- type A1}*
H4 : {L, of n1 A1 |- of (R n1) B}*
H5 : {type A1}
H6 : {type B}
============================
{type (arrow A1 B)}
subgoal 2 is:
{type A}
of_type_ext < search.
1 subgoal(s).
Variables: L, M, A
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H3 : {L |- type A}*
============================
{type A}
of_type_ext < apply type_ignores_ctx to H1 H3.
1 subgoal(s).
Variables: L, M, A
IH : forall L M A, ctx L -> {L |- of M A}* -> {type A}
H1 : ctx L
H3 : {L |- type A}*
H4 : {type A}
============================
{type A}
of_type_ext < search.
Proof completed.
Abella < Theorem of_type :
forall M A, {of M A} -> {type A}.
1 subgoal(s).
============================
forall M A, {of M A} -> {type A}
of_type < intros.
1 subgoal(s).
Variables: M, A
H1 : {of M A}
============================
{type A}
of_type < apply of_type_ext to _ H1.
1 subgoal(s).
Variables: M, A
H1 : {of M A}
H2 : {type A}
============================
{type A}
of_type < search.
Proof completed.
Abella < Theorem reduce_const :
forall C, {type C} -> reduce c C.
1 subgoal(s).
============================
forall C, {type C} -> reduce c C
reduce_const < intros.
1 subgoal(s).
Variables: C
H1 : {type C}
============================
reduce c C
reduce_const < assert neutral c.
2 subgoal(s).
Variables: C
H1 : {type C}
============================
neutral c
subgoal 2 is:
reduce c C
reduce_const < unfold.
2 subgoal(s).
Variables: C
H1 : {type C}
============================
forall A R, c = abs A R -> false
subgoal 2 is:
reduce c C
reduce_const < intros.
2 subgoal(s).
Variables: C, A, R
H1 : {type C}
H2 : c = abs A R
============================
false
subgoal 2 is:
reduce c C
reduce_const < case H2.
1 subgoal(s).
Variables: C
H1 : {type C}
H2 : neutral c
============================
reduce c C
reduce_const < assert forall P, {step c P} -> reduce P C.
2 subgoal(s).
Variables: C
H1 : {type C}
H2 : neutral c
============================
forall P, {step c P} -> reduce P C
subgoal 2 is:
reduce c C
reduce_const < intros.
2 subgoal(s).
Variables: C, P
H1 : {type C}
H2 : neutral c
H3 : {step c P}
============================
reduce P C
subgoal 2 is:
reduce c C
reduce_const < case H3.
1 subgoal(s).
Variables: C
H1 : {type C}
H2 : neutral c
H3 : forall P, {step c P} -> reduce P C
============================
reduce c C
reduce_const < apply neutral_step_reduce to H2 _ H1 H3.
1 subgoal(s).
Variables: C
H1 : {type C}
H2 : neutral c
H3 : forall P, {step c P} -> reduce P C
H4 : reduce c C
============================
reduce c C
reduce_const < search.
Proof completed.
Abella < Theorem abs_step_reduce_lemma :
forall U M A B, sn U -> sn (M c) -> reduce U A -> (forall V, reduce V A ->
reduce (M V) B) -> {of (abs A M) (arrow A B)} -> reduce (app (abs A M) U) B.
1 subgoal(s).
============================
forall U M A B, sn U -> sn (M c) -> reduce U A -> (forall V, reduce V A ->
reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
abs_step_reduce_lemma < induction on 1.
1 subgoal(s).
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
============================
forall U M A B, sn U @ -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
abs_step_reduce_lemma < induction on 2.
1 subgoal(s).
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
============================
forall U M A B, sn U @ -> sn (M c) @@ -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
abs_step_reduce_lemma < intros.
1 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
============================
reduce (app (abs A M) U) B
abs_step_reduce_lemma < assert forall P, {step (app (abs A M) U) P} -> reduce P B.
2 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
============================
forall P, {step (app (abs A M) U) P} -> reduce P B
subgoal 2 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < intros.
2 subgoal(s).
Variables: U, M, A, B, P
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : {step (app (abs A M) U) P}
============================
reduce P B
subgoal 2 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < case H6.
4 subgoal(s).
Variables: U, M, A, B, P, M'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H7 : {step (abs A M) M'}
============================
reduce (app M' U) B
subgoal 2 is:
reduce (app (abs A M) N') B
subgoal 3 is:
reduce (M U) B
subgoal 4 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < case H7.
4 subgoal(s).
Variables: U, M, A, B, P, M', R'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
============================
reduce (app (abs A R') U) B
subgoal 2 is:
reduce (app (abs A M) N') B
subgoal 3 is:
reduce (M U) B
subgoal 4 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < inst H8 with n1 = c.
4 subgoal(s).
Variables: U, M, A, B, P, M', R'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
============================
reduce (app (abs A R') U) B
subgoal 2 is:
reduce (app (abs A M) N') B
subgoal 3 is:
reduce (M U) B
subgoal 4 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < case H2.
4 subgoal(s).
Variables: U, M, A, B, P, M', R'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
H10 : forall N, {step (M c) N} -> sn N **
============================
reduce (app (abs A R') U) B
subgoal 2 is:
reduce (app (abs A M) N') B
subgoal 3 is:
reduce (M U) B
subgoal 4 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply H10 to H9.
4 subgoal(s).
Variables: U, M, A, B, P, M', R'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
H10 : forall N, {step (M c) N} -> sn N **
H11 : sn (R' c) **
============================
reduce (app (abs A R') U) B
subgoal 2 is:
reduce (app (abs A M) N') B
subgoal 3 is:
reduce (M U) B
subgoal 4 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply IH1 to H1 H11 H3 _ _ with M = R', B = B.
6 subgoal(s).
Variables: U, M, A, B, P, M', R'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
H10 : forall N, {step (M c) N} -> sn N **
H11 : sn (R' c) **
============================
{of (abs A R') (arrow A B)}
subgoal 2 is:
forall V, reduce V A -> reduce (R' V) B
subgoal 3 is:
reduce (app (abs A R') U) B
subgoal 4 is:
reduce (app (abs A M) N') B
subgoal 5 is:
reduce (M U) B
subgoal 6 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply of_step to H5 _.
6 subgoal(s).
Variables: U, M, A, B, P, M', R'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
H10 : forall N, {step (M c) N} -> sn N **
H11 : sn (R' c) **
H12 : {of (abs A (x1\R' x1)) (arrow A B)}
============================
{of (abs A R') (arrow A B)}
subgoal 2 is:
forall V, reduce V A -> reduce (R' V) B
subgoal 3 is:
reduce (app (abs A R') U) B
subgoal 4 is:
reduce (app (abs A M) N') B
subgoal 5 is:
reduce (M U) B
subgoal 6 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < search.
5 subgoal(s).
Variables: U, M, A, B, P, M', R'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
H10 : forall N, {step (M c) N} -> sn N **
H11 : sn (R' c) **
============================
forall V, reduce V A -> reduce (R' V) B
subgoal 2 is:
reduce (app (abs A R') U) B
subgoal 3 is:
reduce (app (abs A M) N') B
subgoal 4 is:
reduce (M U) B
subgoal 5 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < intros.
5 subgoal(s).
Variables: U, M, A, B, P, M', R', V
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
H10 : forall N, {step (M c) N} -> sn N **
H11 : sn (R' c) **
H12 : reduce V A
============================
reduce (R' V) B
subgoal 2 is:
reduce (app (abs A R') U) B
subgoal 3 is:
reduce (app (abs A M) N') B
subgoal 4 is:
reduce (M U) B
subgoal 5 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply H4 to H12.
5 subgoal(s).
Variables: U, M, A, B, P, M', R', V
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
H10 : forall N, {step (M c) N} -> sn N **
H11 : sn (R' c) **
H12 : reduce V A
H13 : reduce (M V) B
============================
reduce (R' V) B
subgoal 2 is:
reduce (app (abs A R') U) B
subgoal 3 is:
reduce (app (abs A M) N') B
subgoal 4 is:
reduce (M U) B
subgoal 5 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < inst H8 with n1 = V.
5 subgoal(s).
Variables: U, M, A, B, P, M', R', V
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
H10 : forall N, {step (M c) N} -> sn N **
H11 : sn (R' c) **
H12 : reduce V A
H13 : reduce (M V) B
H14 : {step (M V) (R' V)}
============================
reduce (R' V) B
subgoal 2 is:
reduce (app (abs A R') U) B
subgoal 3 is:
reduce (app (abs A M) N') B
subgoal 4 is:
reduce (M U) B
subgoal 5 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply reduce_step to H13 H14.
5 subgoal(s).
Variables: U, M, A, B, P, M', R', V
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
H10 : forall N, {step (M c) N} -> sn N **
H11 : sn (R' c) **
H12 : reduce V A
H13 : reduce (M V) B
H14 : {step (M V) (R' V)}
H15 : reduce (R' V) B
============================
reduce (R' V) B
subgoal 2 is:
reduce (app (abs A R') U) B
subgoal 3 is:
reduce (app (abs A M) N') B
subgoal 4 is:
reduce (M U) B
subgoal 5 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < search.
4 subgoal(s).
Variables: U, M, A, B, P, M', R'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H8 : {step (M n1) (R' n1)}
H9 : {step (M c) (R' c)}
H10 : forall N, {step (M c) N} -> sn N **
H11 : sn (R' c) **
H12 : reduce (app (abs A R') U) B
============================
reduce (app (abs A R') U) B
subgoal 2 is:
reduce (app (abs A M) N') B
subgoal 3 is:
reduce (M U) B
subgoal 4 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < search.
3 subgoal(s).
Variables: U, M, A, B, P, N'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H7 : {step U N'}
============================
reduce (app (abs A M) N') B
subgoal 2 is:
reduce (M U) B
subgoal 3 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < case H1.
3 subgoal(s).
Variables: U, M, A, B, P, N'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H7 : {step U N'}
H8 : forall N, {step U N} -> sn N *
============================
reduce (app (abs A M) N') B
subgoal 2 is:
reduce (M U) B
subgoal 3 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply H8 to H7.
3 subgoal(s).
Variables: U, M, A, B, P, N'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H7 : {step U N'}
H8 : forall N, {step U N} -> sn N *
H9 : sn N' *
============================
reduce (app (abs A M) N') B
subgoal 2 is:
reduce (M U) B
subgoal 3 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply reduce_step to H3 H7.
3 subgoal(s).
Variables: U, M, A, B, P, N'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H7 : {step U N'}
H8 : forall N, {step U N} -> sn N *
H9 : sn N' *
H10 : reduce N' A
============================
reduce (app (abs A M) N') B
subgoal 2 is:
reduce (M U) B
subgoal 3 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply IH to H9 H2 H10 H4 H5 with M = M.
3 subgoal(s).
Variables: U, M, A, B, P, N'
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H7 : {step U N'}
H8 : forall N, {step U N} -> sn N *
H9 : sn N' *
H10 : reduce N' A
H11 : reduce (app (abs A M) N') B
============================
reduce (app (abs A M) N') B
subgoal 2 is:
reduce (M U) B
subgoal 3 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < search.
2 subgoal(s).
Variables: U, M, A, B, P
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
============================
reduce (M U) B
subgoal 2 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply H4 to H3.
2 subgoal(s).
Variables: U, M, A, B, P
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H7 : reduce (M U) B
============================
reduce (M U) B
subgoal 2 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < search.
1 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : forall P, {step (app (abs A M) U) P} -> reduce P B
============================
reduce (app (abs A M) U) B
abs_step_reduce_lemma < assert neutral (app (abs A M) U).
2 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : forall P, {step (app (abs A M) U) P} -> reduce P B
============================
neutral (app (abs A M) U)
subgoal 2 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < unfold.
2 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : forall P, {step (app (abs A M) U) P} -> reduce P B
============================
forall A1 R, app (abs A M) U = abs A1 R -> false
subgoal 2 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < intros.
2 subgoal(s).
Variables: U, M, A, B, A1, R
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : forall P, {step (app (abs A M) U) P} -> reduce P B
H7 : app (abs A M) U = abs A1 R
============================
false
subgoal 2 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < case H7.
1 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : forall P, {step (app (abs A M) U) P} -> reduce P B
H7 : neutral (app (abs A M) U)
============================
reduce (app (abs A M) U) B
abs_step_reduce_lemma < assert {of (app (abs A M) U) B}.
2 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : forall P, {step (app (abs A M) U) P} -> reduce P B
H7 : neutral (app (abs A M) U)
============================
{of (app (abs A M) U) B}
subgoal 2 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply reduce_of to H3.
2 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : forall P, {step (app (abs A M) U) P} -> reduce P B
H7 : neutral (app (abs A M) U)
H8 : {of U A}
============================
{of (app (abs A M) U) B}
subgoal 2 is:
reduce (app (abs A M) U) B
abs_step_reduce_lemma < search.
1 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : forall P, {step (app (abs A M) U) P} -> reduce P B
H7 : neutral (app (abs A M) U)
H8 : {of (app (abs A M) U) B}
============================
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply of_type to H8.
1 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : forall P, {step (app (abs A M) U) P} -> reduce P B
H7 : neutral (app (abs A M) U)
H8 : {of (app (abs A M) U) B}
H9 : {type B}
============================
reduce (app (abs A M) U) B
abs_step_reduce_lemma < apply neutral_step_reduce to H7 H8 H9 H6.
1 subgoal(s).
Variables: U, M, A, B
IH : forall U M A B, sn U * -> sn (M c) -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
IH1 : forall U M A B, sn U @ -> sn (M c) ** -> reduce U A -> (forall V,
reduce V A -> reduce (M V) B) -> {of (abs A M) (arrow A B)} ->
reduce (app (abs A M) U) B
H1 : sn U @
H2 : sn (M c) @@
H3 : reduce U A
H4 : forall V, reduce V A -> reduce (M V) B
H5 : {of (abs A M) (arrow A B)}
H6 : forall P, {step (app (abs A M) U) P} -> reduce P B
H7 : neutral (app (abs A M) U)
H8 : {of (app (abs A M) U) B}
H9 : {type B}
H10 : reduce (app (abs A M) U) B
============================
reduce (app (abs A M) U) B
abs_step_reduce_lemma < search.
Proof completed.
Abella < Theorem abs_step_reduce :
forall M A B, {of (abs A M) (arrow A B)} -> (forall V, reduce V A ->
reduce (M V) B) -> reduce (abs A M) (arrow A B).
1 subgoal(s).
============================
forall M A B, {of (abs A M) (arrow A B)} -> (forall V, reduce V A ->
reduce (M V) B) -> reduce (abs A M) (arrow A B)
abs_step_reduce < intros.
1 subgoal(s).
Variables: M, A, B
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
============================
reduce (abs A M) (arrow A B)
abs_step_reduce < unfold.
2 subgoal(s).
Variables: M, A, B
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
============================
{of (abs A M) (arrow A B)}
subgoal 2 is:
forall U, reduce U A -> reduce (app (abs A M) U) B
abs_step_reduce < search.
1 subgoal(s).
Variables: M, A, B
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
============================
forall U, reduce U A -> reduce (app (abs A M) U) B
abs_step_reduce < intros.
1 subgoal(s).
Variables: M, A, B, U
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
H3 : reduce U A
============================
reduce (app (abs A M) U) B
abs_step_reduce < apply of_type to H1.
1 subgoal(s).
Variables: M, A, B, U
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
H3 : reduce U A
H4 : {type (arrow A B)}
============================
reduce (app (abs A M) U) B
abs_step_reduce < case H4.
1 subgoal(s).
Variables: M, A, B, U
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
H3 : reduce U A
H5 : {type A}
H6 : {type B}
============================
reduce (app (abs A M) U) B
abs_step_reduce < apply reduce_const to H5.
1 subgoal(s).
Variables: M, A, B, U
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
H3 : reduce U A
H5 : {type A}
H6 : {type B}
H7 : reduce c A
============================
reduce (app (abs A M) U) B
abs_step_reduce < apply H2 to H7.
1 subgoal(s).
Variables: M, A, B, U
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
H3 : reduce U A
H5 : {type A}
H6 : {type B}
H7 : reduce c A
H8 : reduce (M c) B
============================
reduce (app (abs A M) U) B
abs_step_reduce < apply reduce_sn to H5 H3.
1 subgoal(s).
Variables: M, A, B, U
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
H3 : reduce U A
H5 : {type A}
H6 : {type B}
H7 : reduce c A
H8 : reduce (M c) B
H9 : sn U
============================
reduce (app (abs A M) U) B
abs_step_reduce < apply reduce_sn to H6 H8.
1 subgoal(s).
Variables: M, A, B, U
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
H3 : reduce U A
H5 : {type A}
H6 : {type B}
H7 : reduce c A
H8 : reduce (M c) B
H9 : sn U
H10 : sn (M c)
============================
reduce (app (abs A M) U) B
abs_step_reduce < apply abs_step_reduce_lemma to H9 H10 H3 H2 H1 with M = M.
1 subgoal(s).
Variables: M, A, B, U
H1 : {of (abs A M) (arrow A B)}
H2 : forall V, reduce V A -> reduce (M V) B
H3 : reduce U A
H5 : {type A}
H6 : {type B}
H7 : reduce c A
H8 : reduce (M c) B
H9 : sn U
H10 : sn (M c)
H11 : reduce (app (abs A M) U) B
============================
reduce (app (abs A M) U) B
abs_step_reduce < search.
Proof completed.
Abella < Define closed M := exists A, {of M A}.
Abella < Define nabla x, fresh x M.
Abella < Theorem member_fresh :
forall X L E, member E L -> fresh X L -> fresh X E.
1 subgoal(s).
============================
forall X L E, member E L -> fresh X L -> fresh X E
member_fresh < induction on 1.
1 subgoal(s).
IH : forall X L E, member E L * -> fresh X L -> fresh X E
============================
forall X L E, member E L @ -> fresh X L -> fresh X E
member_fresh < intros.
1 subgoal(s).
Variables: X, L, E
IH : forall X L E, member E L * -> fresh X L -> fresh X E
H1 : member E L @
H2 : fresh X L
============================
fresh X E
member_fresh < case H1.
2 subgoal(s).
Variables: X, L, E, L1
IH : forall X L E, member E L * -> fresh X L -> fresh X E
H2 : fresh X (E :: L1)
============================
fresh X E
subgoal 2 is:
fresh X E
member_fresh < case H2.
2 subgoal(s).
Variables: X, L, E, L1, M2, M1
IH : forall X L E, member E L * -> fresh X L -> fresh X E
============================
fresh n1 M1
subgoal 2 is:
fresh X E
member_fresh < search.
1 subgoal(s).
Variables: X, L, E, L1, B
IH : forall X L E, member E L * -> fresh X L -> fresh X E
H2 : fresh X (B :: L1)
H3 : member E L1 *
============================
fresh X E
member_fresh < assert fresh X L1.
2 subgoal(s).
Variables: X, L, E, L1, B
IH : forall X L E, member E L * -> fresh X L -> fresh X E
H2 : fresh X (B :: L1)
H3 : member E L1 *
============================
fresh X L1
subgoal 2 is:
fresh X E
member_fresh < case H2.
2 subgoal(s).
Variables: X, L, E, L1, B, M2, M1
IH : forall X L E, member E L * -> fresh X L -> fresh X E
H3 : member (E n1) M2 *
============================
fresh n1 M2
subgoal 2 is:
fresh X E
member_fresh < search.
1 subgoal(s).
Variables: X, L, E, L1, B
IH : forall X L E, member E L * -> fresh X L -> fresh X E
H2 : fresh X (B :: L1)
H3 : member E L1 *
H4 : fresh X L1
============================
fresh X E
member_fresh < apply IH to H3 H4.
1 subgoal(s).
Variables: X, L, E, L1, B
IH : forall X L E, member E L * -> fresh X L -> fresh X E
H2 : fresh X (B :: L1)
H3 : member E L1 *
H4 : fresh X L1
H5 : fresh X E
============================
fresh X E
member_fresh < search.
Proof completed.
Abella < Theorem prune_type :
forall A, nabla x, {type (A x)} -> (exists B, A = x1\B).
1 subgoal(s).
============================
forall A, nabla x, {type (A x)} -> (exists B, A = x1\B)
prune_type < induction on 1.
1 subgoal(s).
IH : forall A, nabla x, {type (A x)}* -> (exists B, A = x1\B)
============================
forall A, nabla x, {type (A x)}@ -> (exists B, A = x1\B)
prune_type < intros.
1 subgoal(s).
Variables: A
IH : forall A, nabla x, {type (A x)}* -> (exists B, A = x1\B)
H1 : {type (A n1)}@
============================
exists B, A = x1\B
prune_type < case H1.
2 subgoal(s).
Variables: A
IH : forall A, nabla x, {type (A x)}* -> (exists B, A = x1\B)
============================
exists B, x1\top = x1\B
subgoal 2 is:
exists B1, x1\arrow (A1 x1) (B x1) = x1\B1
prune_type < search.
1 subgoal(s).
Variables: A, B, A1
IH : forall A, nabla x, {type (A x)}* -> (exists B, A = x1\B)
H2 : {type (A1 n1)}*
H3 : {type (B n1)}*
============================
exists B1, x1\arrow (A1 x1) (B x1) = x1\B1
prune_type < apply IH to H2.
1 subgoal(s).
Variables: A, B, A1, B1
IH : forall A, nabla x, {type (A x)}* -> (exists B, A = x1\B)
H2 : {type B1}*
H3 : {type (B n1)}*
============================
exists B2, x1\arrow B1 (B x1) = x1\B2
prune_type < apply IH to H3.
1 subgoal(s).
Variables: A, B, A1, B1, B2
IH : forall A, nabla x, {type (A x)}* -> (exists B, A = x1\B)
H2 : {type B1}*
H3 : {type B2}*
============================
exists B3, x1\arrow B1 B2 = x1\B3
prune_type < search.
Proof completed.
Abella < Theorem prune_of :
forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)} -> (exists M, R = x1\M).
1 subgoal(s).
============================
forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)} -> (exists M,
R = x1\M)
prune_of < induction on 2.
1 subgoal(s).
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
============================
forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}@ -> (exists M,
R = x1\M)
prune_of < intros.
1 subgoal(s).
Variables: L, R, A
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H2 : {L |- of (R n1) (A n1)}@
============================
exists M, R = x1\M
prune_of < case H2.
4 subgoal(s).
Variables: L, R, A
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : member (of (R n1) (A n1)) L
============================
exists M, R = x1\M
subgoal 2 is:
exists M1, x1\app (M x1) (N x1) = x1\M1
subgoal 3 is:
exists M, x1\abs (A1 x1) (R1 x1) = x1\M
subgoal 4 is:
exists M, x1\c = x1\M
prune_of < apply member_fresh to H3 _.
4 subgoal(s).
Variables: L, R, A
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : member (of (R n1) (A n1)) L
H4 : fresh n1 (of (R n1) (A n1))
============================
exists M, R = x1\M
subgoal 2 is:
exists M1, x1\app (M x1) (N x1) = x1\M1
subgoal 3 is:
exists M, x1\abs (A1 x1) (R1 x1) = x1\M
subgoal 4 is:
exists M, x1\c = x1\M
prune_of < case H4.
4 subgoal(s).
Variables: L, R, A, M2, M1
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : member (of M1 M2) L
============================
exists M, x1\M1 = x1\M
subgoal 2 is:
exists M1, x1\app (M x1) (N x1) = x1\M1
subgoal 3 is:
exists M, x1\abs (A1 x1) (R1 x1) = x1\M
subgoal 4 is:
exists M, x1\c = x1\M
prune_of < search.
3 subgoal(s).
Variables: L, R, A, A1, N, M
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : {L |- of (M n1) (arrow (A1 n1) (A n1))}*
H4 : {L |- of (N n1) (A1 n1)}*
============================
exists M1, x1\app (M x1) (N x1) = x1\M1
subgoal 2 is:
exists M, x1\abs (A1 x1) (R1 x1) = x1\M
subgoal 3 is:
exists M, x1\c = x1\M
prune_of < apply IH to H1 H3.
3 subgoal(s).
Variables: L, R, A, A1, N, M, M1
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : {L |- of M1 (arrow (A1 n1) (A n1))}*
H4 : {L |- of (N n1) (A1 n1)}*
============================
exists M2, x1\app M1 (N x1) = x1\M2
subgoal 2 is:
exists M, x1\abs (A1 x1) (R1 x1) = x1\M
subgoal 3 is:
exists M, x1\c = x1\M
prune_of < apply IH to H1 H4.
3 subgoal(s).
Variables: L, R, A, A1, N, M, M1, M2
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : {L |- of M1 (arrow (A1 n1) (A n1))}*
H4 : {L |- of M2 (A1 n1)}*
============================
exists M3, x1\app M1 M2 = x1\M3
subgoal 2 is:
exists M, x1\abs (A1 x1) (R1 x1) = x1\M
subgoal 3 is:
exists M, x1\c = x1\M
prune_of < search.
2 subgoal(s).
Variables: L, R, A, B, R1, A1
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : {L |- type (A1 n1)}*
H4 : {L, of n2 (A1 n1) |- of (R1 n1 n2) (B n1)}*
============================
exists M, x1\abs (A1 x1) (R1 x1) = x1\M
subgoal 2 is:
exists M, x1\c = x1\M
prune_of < apply type_ignores_ctx to H1 H3.
2 subgoal(s).
Variables: L, R, A, B, R1, A1
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : {L |- type (A1 n1)}*
H4 : {L, of n2 (A1 n1) |- of (R1 n1 n2) (B n1)}*
H5 : {type (A1 n1)}
============================
exists M, x1\abs (A1 x1) (R1 x1) = x1\M
subgoal 2 is:
exists M, x1\c = x1\M
prune_of < apply prune_type to H5.
2 subgoal(s).
Variables: L, R, A, B, R1, A1, B1
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : {L |- type B1}*
H4 : {L, of n2 B1 |- of (R1 n1 n2) (B n1)}*
H5 : {type B1}
============================
exists M, x1\abs B1 (R1 x1) = x1\M
subgoal 2 is:
exists M, x1\c = x1\M
prune_of < apply IH to _ H4.
2 subgoal(s).
Variables: L, R, A, B, R1, A1, B1, M
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : {L |- type B1}*
H4 : {L, of n2 B1 |- of (M n2) (B n1)}*
H5 : {type B1}
============================
exists M1, x1\abs B1 (x2\M x2) = x1\M1
subgoal 2 is:
exists M, x1\c = x1\M
prune_of < search.
1 subgoal(s).
Variables: L, R, A
IH : forall L R A, nabla x, ctx L -> {L |- of (R x) (A x)}* -> (exists M,
R = x1\M)
H1 : ctx L
H3 : {L |- type (A n1)}*
============================
exists M, x1\c = x1\M
prune_of < search.
Proof completed.
Abella < Theorem prune_closed :
forall R, nabla x, closed (R x) -> (exists M, R = x1\M).
1 subgoal(s).
============================
forall R, nabla x, closed (R x) -> (exists M, R = x1\M)
prune_closed < intros.
1 subgoal(s).
Variables: R
H1 : closed (R n1)
============================
exists M, R = x1\M
prune_closed < case H1.
1 subgoal(s).
Variables: R, A
H2 : {of (R n1) (A n1)}
============================
exists M, R = x1\M
prune_closed < apply prune_of to _ H2.
1 subgoal(s).
Variables: R, A, M
H2 : {of M (A n1)}
============================
exists M1, x1\M = x1\M1
prune_closed < search.
Proof completed.
Abella < Theorem reduce_closed :
forall M A, reduce M A -> closed M.
1 subgoal(s).
============================
forall M A, reduce M A -> closed M
reduce_closed < intros.
1 subgoal(s).
Variables: M, A
H1 : reduce M A
============================
closed M
reduce_closed < apply reduce_of to H1.
1 subgoal(s).
Variables: M, A
H1 : reduce M A
H2 : {of M A}
============================
closed M
reduce_closed < search.
Proof completed.
Abella < Theorem prune_reduce :
forall R A, nabla x, reduce (R x) A -> (exists M, R = x1\M).
1 subgoal(s).
============================
forall R A, nabla x, reduce (R x) A -> (exists M, R = x1\M)
prune_reduce < intros.
1 subgoal(s).
Variables: R, A
H1 : reduce (R n1) A
============================
exists M, R = x1\M
prune_reduce < apply reduce_closed to H1.
1 subgoal(s).
Variables: R, A
H1 : reduce (R n1) A
H2 : closed (R n1)
============================
exists M, R = x1\M
prune_reduce < apply prune_closed to H2.
1 subgoal(s).
Variables: R, A, M
H1 : reduce M A
H2 : closed M
============================
exists M1, x1\M = x1\M1
prune_reduce < search.
Proof completed.
Abella < Define subst nil M M.
Abella < Define nabla x, subst (of x A :: L) (R x) M := exists U, reduce U A /\ subst L (R U) M.
Abella < Theorem closed_subst :
forall L M N, closed M -> subst L M N -> M = N.
1 subgoal(s).
============================
forall L M N, closed M -> subst L M N -> M = N
closed_subst < induction on 2.
1 subgoal(s).
IH : forall L M N, closed M -> subst L M N * -> M = N
============================
forall L M N, closed M -> subst L M N @ -> M = N
closed_subst < intros.
1 subgoal(s).
Variables: L, M, N
IH : forall L M N, closed M -> subst L M N * -> M = N
H1 : closed M
H2 : subst L M N @
============================
M = N
closed_subst < case H2.
2 subgoal(s).
Variables: L, M, N
IH : forall L M N, closed M -> subst L M N * -> M = N
H1 : closed N
============================
N = N
subgoal 2 is:
M n1 = M1
closed_subst < search.
1 subgoal(s).
Variables: L, M, N, U, M1, L1, A
IH : forall L M N, closed M -> subst L M N * -> M = N
H1 : closed (M n1)
H3 : reduce U A
H4 : subst L1 (M U) M1 *
============================
M n1 = M1
closed_subst < apply prune_closed to H1.
1 subgoal(s).
Variables: L, M, N, U, M1, L1, A, M2
IH : forall L M N, closed M -> subst L M N * -> M = N
H1 : closed M2
H3 : reduce U A
H4 : subst L1 M2 M1 *
============================
M2 = M1
closed_subst < apply IH to H1 H4.
1 subgoal(s).
Variables: L, M, N, U, M1, L1, A, M2
IH : forall L M N, closed M -> subst L M N * -> M = N
H1 : closed M1
H3 : reduce U A
H4 : subst L1 M1 M1 *
============================
M1 = M1
closed_subst < search.
Proof completed.
Abella < Theorem subst_const :
forall L M, subst L c M -> M = c.
1 subgoal(s).
============================
forall L M, subst L c M -> M = c
subst_const < induction on 1.
1 subgoal(s).
IH : forall L M, subst L c M * -> M = c
============================
forall L M, subst L c M @ -> M = c
subst_const < intros.
1 subgoal(s).
Variables: L, M
IH : forall L M, subst L c M * -> M = c
H1 : subst L c M @
============================
M = c
subst_const < case H1.
2 subgoal(s).
Variables: L, M
IH : forall L M, subst L c M * -> M = c
============================
c = c
subgoal 2 is:
M1 = c
subst_const < search.
1 subgoal(s).
Variables: L, M, U, M1, L1, A
IH : forall L M, subst L c M * -> M = c
H2 : reduce U A
H3 : subst L1 c M1 *
============================
M1 = c
subst_const < apply IH to H3.
1 subgoal(s).
Variables: L, M, U, M1, L1, A
IH : forall L M, subst L c M * -> M = c
H2 : reduce U A
H3 : subst L1 c c *
============================
c = c
subst_const < search.
Proof completed.
Abella < Theorem subst_var :
forall L M N A, ctx L -> member (of M A) L -> subst L M N -> reduce N A.
1 subgoal(s).
============================
forall L M N A, ctx L -> member (of M A) L -> subst L M N -> reduce N A
subst_var < induction on 1.
1 subgoal(s).
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
============================
forall L M N A, ctx L @ -> member (of M A) L -> subst L M N -> reduce N A
subst_var < intros.
1 subgoal(s).
Variables: L, M, N, A
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H1 : ctx L @
H2 : member (of M A) L
H3 : subst L M N
============================
reduce N A
subst_var < case H1.
2 subgoal(s).
Variables: L, M, N, A
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H2 : member (of M A) nil
H3 : subst nil M N
============================
reduce N A
subgoal 2 is:
reduce (N n1) (A n1)
subst_var < case H2.
1 subgoal(s).
Variables: L, M, N, A, L1, A1
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H2 : member (of (M n1) (A n1)) (of n1 A1 :: L1)
H3 : subst (of n1 A1 :: L1) (M n1) (N n1)
H4 : {type A1}
H5 : ctx L1 *
============================
reduce (N n1) (A n1)
subst_var < case H2.
2 subgoal(s).
Variables: L, M, N, A, L1, A1
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H3 : subst (of n1 A1 :: L1) n1 (N n1)
H4 : {type A1}
H5 : ctx L1 *
============================
reduce (N n1) A1
subgoal 2 is:
reduce (N n1) (A n1)
subst_var < case H3.
2 subgoal(s).
Variables: L, M, N, A, L1, A1, U, M1
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H4 : {type A1}
H5 : ctx L1 *
H6 : reduce U A1
H7 : subst L1 U M1
============================
reduce M1 A1
subgoal 2 is:
reduce (N n1) (A n1)
subst_var < apply reduce_closed to H6.
2 subgoal(s).
Variables: L, M, N, A, L1, A1, U, M1
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H4 : {type A1}
H5 : ctx L1 *
H6 : reduce U A1
H7 : subst L1 U M1
H8 : closed U
============================
reduce M1 A1
subgoal 2 is:
reduce (N n1) (A n1)
subst_var < apply closed_subst to H8 H7.
2 subgoal(s).
Variables: L, M, N, A, L1, A1, U, M1
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H4 : {type A1}
H5 : ctx L1 *
H6 : reduce M1 A1
H7 : subst L1 M1 M1
H8 : closed M1
============================
reduce M1 A1
subgoal 2 is:
reduce (N n1) (A n1)
subst_var < search.
1 subgoal(s).
Variables: L, M, N, A, L1, A1
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H3 : subst (of n1 A1 :: L1) (M n1) (N n1)
H4 : {type A1}
H5 : ctx L1 *
H6 : member (of (M n1) (A n1)) L1
============================
reduce (N n1) (A n1)
subst_var < case H3.
1 subgoal(s).
Variables: L, M, N, A, L1, A1, U, M1
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H4 : {type A1}
H5 : ctx L1 *
H6 : member (of (M n1) (A n1)) L1
H7 : reduce U A1
H8 : subst L1 (M U) M1
============================
reduce M1 (A n1)
subst_var < apply member_fresh to H6 _.
1 subgoal(s).
Variables: L, M, N, A, L1, A1, U, M1
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H4 : {type A1}
H5 : ctx L1 *
H6 : member (of (M n1) (A n1)) L1
H7 : reduce U A1
H8 : subst L1 (M U) M1
H9 : fresh n1 (of (M n1) (A n1))
============================
reduce M1 (A n1)
subst_var < case H9.
1 subgoal(s).
Variables: L, M, N, A, L1, A1, U, M1, M4, M3
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H4 : {type A1}
H5 : ctx L1 *
H6 : member (of M3 M4) L1
H7 : reduce U A1
H8 : subst L1 M3 M1
============================
reduce M1 M4
subst_var < apply IH to H5 H6 H8.
1 subgoal(s).
Variables: L, M, N, A, L1, A1, U, M1, M4, M3
IH : forall L M N A, ctx L * -> member (of M A) L -> subst L M N ->
reduce N A
H4 : {type A1}
H5 : ctx L1 *
H6 : member (of M3 M4) L1
H7 : reduce U A1
H8 : subst L1 M3 M1
H10 : reduce M1 M4
============================
reduce M1 M4
subst_var < search.
Proof completed.
Abella < Theorem subst_app :
forall L M N R, ctx L -> subst L (app M N) R -> (exists MR NR,
R = app MR NR /\ subst L M MR /\ subst L N NR).
1 subgoal(s).
============================
forall L M N R, ctx L -> subst L (app M N) R