Welcome to Abella 2.0.4-dev
Abella < Specification "trans".
Reading specification "trans"
Abella < Theorem add_det :
forall N1 N2 N3 N3', {add N1 N2 N3} -> {add N1 N2 N3'} -> N3 = N3'.
============================
forall N1 N2 N3 N3', {add N1 N2 N3} -> {add N1 N2 N3'} -> N3 = N3'
add_det < induction on 1.
IH : forall N1 N2 N3 N3', {add N1 N2 N3}* -> {add N1 N2 N3'} -> N3 = N3'
============================
forall N1 N2 N3 N3', {add N1 N2 N3}@ -> {add N1 N2 N3'} -> N3 = N3'
add_det < intros.
Variables: N1 N2 N3 N3'
IH : forall N1 N2 N3 N3', {add N1 N2 N3}* -> {add N1 N2 N3'} -> N3 = N3'
H1 : {add N1 N2 N3}@
H2 : {add N1 N2 N3'}
============================
N3 = N3'
add_det < case H1.
Subgoal 1:
Variables: N3 N3'
IH : forall N1 N2 N3 N3', {add N1 N2 N3}* -> {add N1 N2 N3'} -> N3 = N3'
H2 : {add z N3 N3'}
============================
N3 = N3'
Subgoal 2 is:
s N4 = N3'
add_det < case H2.
Subgoal 1:
Variables: N3'
IH : forall N1 N2 N3 N3', {add N1 N2 N3}* -> {add N1 N2 N3'} -> N3 = N3'
============================
N3' = N3'
Subgoal 2 is:
s N4 = N3'
add_det < search.
Subgoal 2:
Variables: N2 N3' N4 N6
IH : forall N1 N2 N3 N3', {add N1 N2 N3}* -> {add N1 N2 N3'} -> N3 = N3'
H2 : {add (s N6) N2 N3'}
H3 : {add N6 N2 N4}*
============================
s N4 = N3'
add_det < case H2.
Subgoal 2:
Variables: N2 N4 N6 N5
IH : forall N1 N2 N3 N3', {add N1 N2 N3}* -> {add N1 N2 N3'} -> N3 = N3'
H3 : {add N6 N2 N4}*
H4 : {add N6 N2 N5}
============================
s N4 = s N5
add_det < apply IH to H3 H4.
Subgoal 2:
Variables: N2 N6 N5
IH : forall N1 N2 N3 N3', {add N1 N2 N3}* -> {add N1 N2 N3'} -> N3 = N3'
H3 : {add N6 N2 N5}*
H4 : {add N6 N2 N5}
============================
s N5 = s N5
add_det < search.
Proof completed.
Abella < Define le : nat -> nat -> prop by
le N1 N2 := exists N, {add N1 N N2}.
Abella < Define lt : nat -> nat -> prop by
lt N1 N2 := exists N, {add N1 (s N) N2}.
Abella < Theorem lt_to_le :
forall N1 N2, lt N1 N2 -> le N1 N2.
============================
forall N1 N2, lt N1 N2 -> le N1 N2
lt_to_le < intros.
Variables: N1 N2
H1 : lt N1 N2
============================
le N1 N2
lt_to_le < case H1.
Variables: N1 N2 N
H2 : {add N1 (s N) N2}
============================
le N1 N2
lt_to_le < search.
Proof completed.
Abella < Theorem le_refl :
forall N, {is_nat N} -> le N N.
============================
forall N, {is_nat N} -> le N N
le_refl < induction on 1.
IH : forall N, {is_nat N}* -> le N N
============================
forall N, {is_nat N}@ -> le N N
le_refl < intros.
Variables: N
IH : forall N, {is_nat N}* -> le N N
H1 : {is_nat N}@
============================
le N N
le_refl < case H1.
Subgoal 1:
IH : forall N, {is_nat N}* -> le N N
============================
le z z
Subgoal 2 is:
le (s N1) (s N1)
le_refl < search.
Subgoal 2:
Variables: N1
IH : forall N, {is_nat N}* -> le N N
H2 : {is_nat N1}*
============================
le (s N1) (s N1)
le_refl < apply IH to H2.
Subgoal 2:
Variables: N1
IH : forall N, {is_nat N}* -> le N N
H2 : {is_nat N1}*
H3 : le N1 N1
============================
le (s N1) (s N1)
le_refl < case H3.
Subgoal 2:
Variables: N1 N2
IH : forall N, {is_nat N}* -> le N N
H2 : {is_nat N1}*
H4 : {add N1 N2 N1}
============================
le (s N1) (s N1)
le_refl < search.
Proof completed.
Abella < Theorem le_z :
forall N, le N z -> N = z.
============================
forall N, le N z -> N = z
le_z < intros.
Variables: N
H1 : le N z
============================
N = z
le_z < case H1.
Variables: N N1
H2 : {add N N1 z}
============================
N = z
le_z < case H2.
============================
z = z
le_z < search.
Proof completed.
Abella < Theorem add_result_isnat :
forall N1 N2 N3, {is_nat N2} -> {add N1 N2 N3} -> {is_nat N3}.
============================
forall N1 N2 N3, {is_nat N2} -> {add N1 N2 N3} -> {is_nat N3}
add_result_isnat < induction on 2.
IH : forall N1 N2 N3, {is_nat N2} -> {add N1 N2 N3}* -> {is_nat N3}
============================
forall N1 N2 N3, {is_nat N2} -> {add N1 N2 N3}@ -> {is_nat N3}
add_result_isnat < intros.
Variables: N1 N2 N3
IH : forall N1 N2 N3, {is_nat N2} -> {add N1 N2 N3}* -> {is_nat N3}
H1 : {is_nat N2}
H2 : {add N1 N2 N3}@
============================
{is_nat N3}
add_result_isnat < case H2.
Subgoal 1:
Variables: N3
IH : forall N1 N2 N3, {is_nat N2} -> {add N1 N2 N3}* -> {is_nat N3}
H1 : {is_nat N3}
============================
{is_nat N3}
Subgoal 2 is:
{is_nat (s N4)}
add_result_isnat < search.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {is_nat N2} -> {add N1 N2 N3}* -> {is_nat N3}
H1 : {is_nat N2}
H3 : {add N6 N2 N4}*
============================
{is_nat (s N4)}
add_result_isnat < apply IH to H1 H3.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {is_nat N2} -> {add N1 N2 N3}* -> {is_nat N3}
H1 : {is_nat N2}
H3 : {add N6 N2 N4}*
H4 : {is_nat N4}
============================
{is_nat (s N4)}
add_result_isnat < search.
Proof completed.
Abella < Theorem add_arg2_isnat :
forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3} -> {is_nat N2}.
============================
forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3} -> {is_nat N2}
add_arg2_isnat < induction on 2.
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {is_nat N2}
============================
forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}@ -> {is_nat N2}
add_arg2_isnat < intros.
Variables: N1 N2 N3
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {is_nat N2}
H1 : {is_nat N3}
H2 : {add N1 N2 N3}@
============================
{is_nat N2}
add_arg2_isnat < case H2.
Subgoal 1:
Variables: N3
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {is_nat N2}
H1 : {is_nat N3}
============================
{is_nat N3}
Subgoal 2 is:
{is_nat N2}
add_arg2_isnat < search.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {is_nat N2}
H1 : {is_nat (s N4)}
H3 : {add N6 N2 N4}*
============================
{is_nat N2}
add_arg2_isnat < case H1.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {is_nat N2}
H3 : {add N6 N2 N4}*
H4 : {is_nat N4}
============================
{is_nat N2}
add_arg2_isnat < backchain IH.
Proof completed.
Abella < Theorem add_arg2_det :
forall N1 N2 N2' N3, {add N1 N2 N3} -> {add N1 N2' N3} -> N2 = N2'.
============================
forall N1 N2 N2' N3, {add N1 N2 N3} -> {add N1 N2' N3} -> N2 = N2'
add_arg2_det < induction on 1.
IH : forall N1 N2 N2' N3, {add N1 N2 N3}* -> {add N1 N2' N3} -> N2 = N2'
============================
forall N1 N2 N2' N3, {add N1 N2 N3}@ -> {add N1 N2' N3} -> N2 = N2'
add_arg2_det < intros.
Variables: N1 N2 N2' N3
IH : forall N1 N2 N2' N3, {add N1 N2 N3}* -> {add N1 N2' N3} -> N2 = N2'
H1 : {add N1 N2 N3}@
H2 : {add N1 N2' N3}
============================
N2 = N2'
add_arg2_det < case H1.
Subgoal 1:
Variables: N2' N3
IH : forall N1 N2 N2' N3, {add N1 N2 N3}* -> {add N1 N2' N3} -> N2 = N2'
H2 : {add z N2' N3}
============================
N3 = N2'
Subgoal 2 is:
N2 = N2'
add_arg2_det < case H2.
Subgoal 1:
Variables: N3
IH : forall N1 N2 N2' N3, {add N1 N2 N3}* -> {add N1 N2' N3} -> N2 = N2'
============================
N3 = N3
Subgoal 2 is:
N2 = N2'
add_arg2_det < search.
Subgoal 2:
Variables: N2 N2' N4 N6
IH : forall N1 N2 N2' N3, {add N1 N2 N3}* -> {add N1 N2' N3} -> N2 = N2'
H2 : {add (s N6) N2' (s N4)}
H3 : {add N6 N2 N4}*
============================
N2 = N2'
add_arg2_det < case H2.
Subgoal 2:
Variables: N2 N2' N4 N6
IH : forall N1 N2 N2' N3, {add N1 N2 N3}* -> {add N1 N2' N3} -> N2 = N2'
H3 : {add N6 N2 N4}*
H4 : {add N6 N2' N4}
============================
N2 = N2'
add_arg2_det < backchain IH.
Proof completed.
Abella < Theorem add_arg1_isnat :
forall N1 N2 N3, {add N1 N2 N3} -> {is_nat N1}.
============================
forall N1 N2 N3, {add N1 N2 N3} -> {is_nat N1}
add_arg1_isnat < induction on 1.
IH : forall N1 N2 N3, {add N1 N2 N3}* -> {is_nat N1}
============================
forall N1 N2 N3, {add N1 N2 N3}@ -> {is_nat N1}
add_arg1_isnat < intros.
Variables: N1 N2 N3
IH : forall N1 N2 N3, {add N1 N2 N3}* -> {is_nat N1}
H1 : {add N1 N2 N3}@
============================
{is_nat N1}
add_arg1_isnat < case H1.
Subgoal 1:
Variables: N3
IH : forall N1 N2 N3, {add N1 N2 N3}* -> {is_nat N1}
============================
{is_nat z}
Subgoal 2 is:
{is_nat (s N6)}
add_arg1_isnat < search.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {add N1 N2 N3}* -> {is_nat N1}
H2 : {add N6 N2 N4}*
============================
{is_nat (s N6)}
add_arg1_isnat < apply IH to H2.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {add N1 N2 N3}* -> {is_nat N1}
H2 : {add N6 N2 N4}*
H3 : {is_nat N6}
============================
{is_nat (s N6)}
add_arg1_isnat < search.
Proof completed.
Abella < Theorem add_s :
forall N1 N2 N3, {add N1 N2 N3} -> {add N1 (s N2) (s N3)}.
============================
forall N1 N2 N3, {add N1 N2 N3} -> {add N1 (s N2) (s N3)}
add_s < induction on 1.
IH : forall N1 N2 N3, {add N1 N2 N3}* -> {add N1 (s N2) (s N3)}
============================
forall N1 N2 N3, {add N1 N2 N3}@ -> {add N1 (s N2) (s N3)}
add_s < intros.
Variables: N1 N2 N3
IH : forall N1 N2 N3, {add N1 N2 N3}* -> {add N1 (s N2) (s N3)}
H1 : {add N1 N2 N3}@
============================
{add N1 (s N2) (s N3)}
add_s < case H1.
Subgoal 1:
Variables: N3
IH : forall N1 N2 N3, {add N1 N2 N3}* -> {add N1 (s N2) (s N3)}
============================
{add z (s N3) (s N3)}
Subgoal 2 is:
{add (s N6) (s N2) (s (s N4))}
add_s < search.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {add N1 N2 N3}* -> {add N1 (s N2) (s N3)}
H2 : {add N6 N2 N4}*
============================
{add (s N6) (s N2) (s (s N4))}
add_s < apply IH to H2.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {add N1 N2 N3}* -> {add N1 (s N2) (s N3)}
H2 : {add N6 N2 N4}*
H3 : {add N6 (s N2) (s N4)}
============================
{add (s N6) (s N2) (s (s N4))}
add_s < search.
Proof completed.
Abella < Theorem add_s_inv :
forall N1 N2 N3, {add N1 (s N2) (s N3)} -> {add N1 N2 N3}.
============================
forall N1 N2 N3, {add N1 (s N2) (s N3)} -> {add N1 N2 N3}
add_s_inv < induction on 1.
IH : forall N1 N2 N3, {add N1 (s N2) (s N3)}* -> {add N1 N2 N3}
============================
forall N1 N2 N3, {add N1 (s N2) (s N3)}@ -> {add N1 N2 N3}
add_s_inv < intros.
Variables: N1 N2 N3
IH : forall N1 N2 N3, {add N1 (s N2) (s N3)}* -> {add N1 N2 N3}
H1 : {add N1 (s N2) (s N3)}@
============================
{add N1 N2 N3}
add_s_inv < case H1.
Subgoal 1:
Variables: N3
IH : forall N1 N2 N3, {add N1 (s N2) (s N3)}* -> {add N1 N2 N3}
============================
{add z N3 N3}
Subgoal 2 is:
{add (s N6) N2 N3}
add_s_inv < search.
Subgoal 2:
Variables: N2 N3 N6
IH : forall N1 N2 N3, {add N1 (s N2) (s N3)}* -> {add N1 N2 N3}
H2 : {add N6 (s N2) N3}*
============================
{add (s N6) N2 N3}
add_s_inv < case H2 (keep).
Subgoal 2.1:
Variables: N2
IH : forall N1 N2 N3, {add N1 (s N2) (s N3)}* -> {add N1 N2 N3}
H2 : {add z (s N2) (s N2)}*
============================
{add (s z) N2 (s N2)}
Subgoal 2.2 is:
{add (s (s N7)) N2 (s N4)}
add_s_inv < search.
Subgoal 2.2:
Variables: N2 N4 N7
IH : forall N1 N2 N3, {add N1 (s N2) (s N3)}* -> {add N1 N2 N3}
H2 : {add (s N7) (s N2) (s N4)}*
H3 : {add N7 (s N2) N4}*
============================
{add (s (s N7)) N2 (s N4)}
add_s_inv < apply IH to H2.
Subgoal 2.2:
Variables: N2 N4 N7
IH : forall N1 N2 N3, {add N1 (s N2) (s N3)}* -> {add N1 N2 N3}
H2 : {add (s N7) (s N2) (s N4)}*
H3 : {add N7 (s N2) N4}*
H4 : {add (s N7) N2 N4}
============================
{add (s (s N7)) N2 (s N4)}
add_s_inv < search.
Proof completed.
Abella < Theorem add_z :
forall N, {is_nat N} -> {add N z N}.
============================
forall N, {is_nat N} -> {add N z N}
add_z < induction on 1.
IH : forall N, {is_nat N}* -> {add N z N}
============================
forall N, {is_nat N}@ -> {add N z N}
add_z < intros.
Variables: N
IH : forall N, {is_nat N}* -> {add N z N}
H1 : {is_nat N}@
============================
{add N z N}
add_z < case H1.
Subgoal 1:
IH : forall N, {is_nat N}* -> {add N z N}
============================
{add z z z}
Subgoal 2 is:
{add (s N1) z (s N1)}
add_z < search.
Subgoal 2:
Variables: N1
IH : forall N, {is_nat N}* -> {add N z N}
H2 : {is_nat N1}*
============================
{add (s N1) z (s N1)}
add_z < apply IH to H2.
Subgoal 2:
Variables: N1
IH : forall N, {is_nat N}* -> {add N z N}
H2 : {is_nat N1}*
H3 : {add N1 z N1}
============================
{add (s N1) z (s N1)}
add_z < search.
Proof completed.
Abella < Theorem add_comm :
forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3} -> {add N2 N1 N3}.
============================
forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3} -> {add N2 N1 N3}
add_comm < induction on 2.
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {add N2 N1 N3}
============================
forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}@ -> {add N2 N1 N3}
add_comm < intros.
Variables: N1 N2 N3
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {add N2 N1 N3}
H1 : {is_nat N3}
H2 : {add N1 N2 N3}@
============================
{add N2 N1 N3}
add_comm < case H2.
Subgoal 1:
Variables: N3
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {add N2 N1 N3}
H1 : {is_nat N3}
============================
{add N3 z N3}
Subgoal 2 is:
{add N2 (s N6) (s N4)}
add_comm < backchain add_z.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {add N2 N1 N3}
H1 : {is_nat (s N4)}
H3 : {add N6 N2 N4}*
============================
{add N2 (s N6) (s N4)}
add_comm < case H1.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {add N2 N1 N3}
H3 : {add N6 N2 N4}*
H4 : {is_nat N4}
============================
{add N2 (s N6) (s N4)}
add_comm < apply IH to _ H3.
Subgoal 2:
Variables: N2 N4 N6
IH : forall N1 N2 N3, {is_nat N3} -> {add N1 N2 N3}* -> {add N2 N1 N3}
H3 : {add N6 N2 N4}*
H4 : {is_nat N4}
H5 : {add N2 N6 N4}
============================
{add N2 (s N6) (s N4)}
add_comm < backchain add_s.
Proof completed.
Abella < Theorem add_assoc :
forall N1 N2 N3 N12 N123, {add N1 N2 N12} -> {add N12 N3 N123} ->
(exists N23, {add N2 N3 N23} /\ {add N1 N23 N123}).
============================
forall N1 N2 N3 N12 N123, {add N1 N2 N12} -> {add N12 N3 N123} ->
(exists N23, {add N2 N3 N23} /\ {add N1 N23 N123})
add_assoc < induction on 1.
IH : forall N1 N2 N3 N12 N123, {add N1 N2 N12}* -> {add N12 N3 N123} ->
(exists N23, {add N2 N3 N23} /\ {add N1 N23 N123})
============================
forall N1 N2 N3 N12 N123, {add N1 N2 N12}@ -> {add N12 N3 N123} ->
(exists N23, {add N2 N3 N23} /\ {add N1 N23 N123})
add_assoc < intros.
Variables: N1 N2 N3 N12 N123
IH : forall N1 N2 N3 N12 N123, {add N1 N2 N12}* -> {add N12 N3 N123} ->
(exists N23, {add N2 N3 N23} /\ {add N1 N23 N123})
H1 : {add N1 N2 N12}@
H2 : {add N12 N3 N123}
============================
exists N23, {add N2 N3 N23} /\ {add N1 N23 N123}
add_assoc < case H1.
Subgoal 1:
Variables: N3 N12 N123
IH : forall N1 N2 N3 N12 N123, {add N1 N2 N12}* -> {add N12 N3 N123} ->
(exists N23, {add N2 N3 N23} /\ {add N1 N23 N123})
H2 : {add N12 N3 N123}
============================
exists N23, {add N12 N3 N23} /\ {add z N23 N123}
Subgoal 2 is:
exists N23, {add N2 N3 N23} /\ {add (s N6) N23 N123}
add_assoc < search.
Subgoal 2:
Variables: N2 N3 N123 N4 N6
IH : forall N1 N2 N3 N12 N123, {add N1 N2 N12}* -> {add N12 N3 N123} ->
(exists N23, {add N2 N3 N23} /\ {add N1 N23 N123})
H2 : {add (s N4) N3 N123}
H3 : {add N6 N2 N4}*
============================
exists N23, {add N2 N3 N23} /\ {add (s N6) N23 N123}
add_assoc < case H2.
Subgoal 2:
Variables: N2 N3 N4 N6 N5
IH : forall N1 N2 N3 N12 N123, {add N1 N2 N12}* -> {add N12 N3 N123} ->
(exists N23, {add N2 N3 N23} /\ {add N1 N23 N123})
H3 : {add N6 N2 N4}*
H4 : {add N4 N3 N5}
============================
exists N23, {add N2 N3 N23} /\ {add (s N6) N23 (s N5)}
add_assoc < apply IH to H3 H4.
Subgoal 2:
Variables: N2 N3 N4 N6 N5 N23
IH : forall N1 N2 N3 N12 N123, {add N1 N2 N12}* -> {add N12 N3 N123} ->
(exists N23, {add N2 N3 N23} /\ {add N1 N23 N123})
H3 : {add N6 N2 N4}*
H4 : {add N4 N3 N5}
H5 : {add N2 N3 N23}
H6 : {add N6 N23 N5}
============================
exists N23, {add N2 N3 N23} /\ {add (s N6) N23 (s N5)}
add_assoc < search.
Proof completed.
Abella < Theorem add_assoc' :
forall N1 N2 N3 N23 N123, {add N2 N3 N23} -> {add N1 N23 N123} ->
(exists N12, {add N1 N2 N12} /\ {add N12 N3 N123}).
============================
forall N1 N2 N3 N23 N123, {add N2 N3 N23} -> {add N1 N23 N123} ->
(exists N12, {add N1 N2 N12} /\ {add N12 N3 N123})
add_assoc' < induction on 2.
IH : forall N1 N2 N3 N23 N123, {add N2 N3 N23} -> {add N1 N23 N123}* ->
(exists N12, {add N1 N2 N12} /\ {add N12 N3 N123})
============================
forall N1 N2 N3 N23 N123, {add N2 N3 N23} -> {add N1 N23 N123}@ ->
(exists N12, {add N1 N2 N12} /\ {add N12 N3 N123})
add_assoc' < intros.
Variables: N1 N2 N3 N23 N123
IH : forall N1 N2 N3 N23 N123, {add N2 N3 N23} -> {add N1 N23 N123}* ->
(exists N12, {add N1 N2 N12} /\ {add N12 N3 N123})
H1 : {add N2 N3 N23}
H2 : {add N1 N23 N123}@
============================
exists N12, {add N1 N2 N12} /\ {add N12 N3 N123}
add_assoc' < case H2.
Subgoal 1:
Variables: N2 N3 N123
IH : forall N1 N2 N3 N23 N123, {add N2 N3 N23} -> {add N1 N23 N123}* ->
(exists N12, {add N1 N2 N12} /\ {add N12 N3 N123})
H1 : {add N2 N3 N123}
============================
exists N12, {add z N2 N12} /\ {add N12 N3 N123}
Subgoal 2 is:
exists N12, {add (s N6) N2 N12} /\ {add N12 N3 (s N4)}
add_assoc' < search.
Subgoal 2:
Variables: N2 N3 N23 N4 N6
IH : forall N1 N2 N3 N23 N123, {add N2 N3 N23} -> {add N1 N23 N123}* ->
(exists N12, {add N1 N2 N12} /\ {add N12 N3 N123})
H1 : {add N2 N3 N23}
H3 : {add N6 N23 N4}*
============================
exists N12, {add (s N6) N2 N12} /\ {add N12 N3 (s N4)}
add_assoc' < apply IH to _ H3.
Subgoal 2:
Variables: N2 N3 N23 N4 N6 N12
IH : forall N1 N2 N3 N23 N123, {add N2 N3 N23} -> {add N1 N23 N123}* ->
(exists N12, {add N1 N2 N12} /\ {add N12 N3 N123})
H1 : {add N2 N3 N23}
H3 : {add N6 N23 N4}*
H4 : {add N6 N2 N12}
H5 : {add N12 N3 N4}
============================
exists N12, {add (s N6) N2 N12} /\ {add N12 N3 (s N4)}
add_assoc' < search.
Proof completed.
Abella < Theorem le_to_lt :
forall N1 N2, {is_nat N2} -> le N1 N2 -> N1 = N2 \/ lt N1 N2.
============================
forall N1 N2, {is_nat N2} -> le N1 N2 -> N1 = N2 \/ lt N1 N2
le_to_lt < intros.
Variables: N1 N2
H1 : {is_nat N2}
H2 : le N1 N2
============================
N1 = N2 \/ lt N1 N2
le_to_lt < case H2.
Variables: N1 N2 N
H1 : {is_nat N2}
H3 : {add N1 N N2}
============================
N1 = N2 \/ lt N1 N2
le_to_lt < apply add_comm to _ H3.
Variables: N1 N2 N
H1 : {is_nat N2}
H3 : {add N1 N N2}
H4 : {add N N1 N2}
============================
N1 = N2 \/ lt N1 N2
le_to_lt < case H4.
Subgoal 1:
Variables: N2
H1 : {is_nat N2}
H3 : {add N2 z N2}
============================
N2 = N2 \/ lt N2 N2
Subgoal 2 is:
N1 = s N3 \/ lt N1 (s N3)
le_to_lt < search.
Subgoal 2:
Variables: N1 N3 N5
H1 : {is_nat (s N3)}
H3 : {add N1 (s N5) (s N3)}
H5 : {add N5 N1 N3}
============================
N1 = s N3 \/ lt N1 (s N3)
le_to_lt < apply add_comm to _ H5.
Subgoal 2.1:
Variables: N1 N3 N5
H1 : {is_nat (s N3)}
H3 : {add N1 (s N5) (s N3)}
H5 : {add N5 N1 N3}
============================
{is_nat N3}
Subgoal 2 is:
N1 = s N3 \/ lt N1 (s N3)
le_to_lt < case H1.
Subgoal 2.1:
Variables: N1 N3 N5
H3 : {add N1 (s N5) (s N3)}
H5 : {add N5 N1 N3}
H6 : {is_nat N3}
============================
{is_nat N3}
Subgoal 2 is:
N1 = s N3 \/ lt N1 (s N3)
le_to_lt < search.
Subgoal 2:
Variables: N1 N3 N5
H1 : {is_nat (s N3)}
H3 : {add N1 (s N5) (s N3)}
H5 : {add N5 N1 N3}
H6 : {add N1 N5 N3}
============================
N1 = s N3 \/ lt N1 (s N3)
le_to_lt < search.
Proof completed.
Abella < Theorem lt_pred_le :
forall I J, {is_nat J} -> lt I (s J) -> le I J.
============================
forall I J, {is_nat J} -> lt I (s J) -> le I J
lt_pred_le < intros.
Variables: I J
H1 : {is_nat J}
H2 : lt I (s J)
============================
le I J
lt_pred_le < case H2.
Variables: I J N
H1 : {is_nat J}
H3 : {add I (s N) (s J)}
============================
le I J
lt_pred_le < apply add_comm to _ H3.
Variables: I J N
H1 : {is_nat J}
H3 : {add I (s N) (s J)}
H4 : {add (s N) I (s J)}
============================
le I J
lt_pred_le < case H4.
Variables: I J N
H1 : {is_nat J}
H3 : {add I (s N) (s J)}
H5 : {add N I J}
============================
le I J
lt_pred_le < apply add_comm to _ H5.
Variables: I J N
H1 : {is_nat J}
H3 : {add I (s N) (s J)}
H5 : {add N I J}
H6 : {add I N J}
============================
le I J
lt_pred_le < search.
Proof completed.
Abella < Theorem lt_z_absurd :
forall I, lt I z -> false.
============================
forall I, lt I z -> false
lt_z_absurd < intros.
Variables: I
H1 : lt I z
============================
false
lt_z_absurd < case H1.
Variables: I N
H2 : {add I (s N) z}
============================
false
lt_z_absurd < apply add_comm to _ H2.
Variables: I N
H2 : {add I (s N) z}
H3 : {add (s N) I z}
============================
false
lt_z_absurd < case H3.
Proof completed.
Abella < Theorem le_succ :
forall I J, le I J -> le I (s J).
============================
forall I J, le I J -> le I (s J)
le_succ < intros.
Variables: I J
H1 : le I J
============================
le I (s J)
le_succ < case H1.
Variables: I J N
H2 : {add I N J}
============================
le I (s J)
le_succ < unfold.
Variables: I J N
H2 : {add I N J}
============================
exists N, {add I N (s J)}
le_succ < exists s N.
Variables: I J N
H2 : {add I N J}
============================
{add I (s N) (s J)}
le_succ < backchain add_s.
Proof completed.
Abella < Theorem le_extend :
forall I J, le I J -> le (s I) (s J).
============================
forall I J, le I J -> le (s I) (s J)
le_extend < intros.
Variables: I J
H1 : le I J
============================
le (s I) (s J)
le_extend < case H1.
Variables: I J N
H2 : {add I N J}
============================
le (s I) (s J)
le_extend < unfold.
Variables: I J N
H2 : {add I N J}
============================
exists N, {add (s I) N (s J)}
le_extend < exists N.
Variables: I J N
H2 : {add I N J}
============================
{add (s I) N (s J)}
le_extend < search.
Proof completed.
Abella < Theorem le_to_lt_s :
forall N1 N2, le N1 N2 -> lt N1 (s N2).
============================
forall N1 N2, le N1 N2 -> lt N1 (s N2)
le_to_lt_s < intros.
Variables: N1 N2
H1 : le N1 N2
============================
lt N1 (s N2)
le_to_lt_s < case H1.
Variables: N1 N2 N
H2 : {add N1 N N2}
============================
lt N1 (s N2)
le_to_lt_s < unfold.
Variables: N1 N2 N
H2 : {add N1 N N2}
============================
exists N, {add N1 (s N) (s N2)}
le_to_lt_s < exists N.
Variables: N1 N2 N
H2 : {add N1 N N2}
============================
{add N1 (s N) (s N2)}
le_to_lt_s < backchain add_s.
Proof completed.
Abella < Theorem le_trans :
forall N1 N2 N3, le N1 N2 -> le N2 N3 -> le N1 N3.
============================
forall N1 N2 N3, le N1 N2 -> le N2 N3 -> le N1 N3
le_trans < intros.
Variables: N1 N2 N3
H1 : le N1 N2
H2 : le N2 N3
============================
le N1 N3
le_trans < case H1.
Variables: N1 N2 N3 N
H2 : le N2 N3
H3 : {add N1 N N2}
============================
le N1 N3
le_trans < case H2.
Variables: N1 N2 N3 N N4
H3 : {add N1 N N2}
H4 : {add N2 N4 N3}
============================
le N1 N3
le_trans < unfold.
Variables: N1 N2 N3 N N4
H3 : {add N1 N N2}
H4 : {add N2 N4 N3}
============================
exists N, {add N1 N N3}
le_trans < apply add_assoc to H3 H4.
Variables: N1 N2 N3 N N4 N23
H3 : {add N1 N N2}
H4 : {add N2 N4 N3}
H5 : {add N N4 N23}
H6 : {add N1 N23 N3}
============================
exists N, {add N1 N N3}
le_trans < search.
Proof completed.
Abella < Theorem lt_le_compose :
forall N1 N2 N3, lt N1 N2 -> le N2 N3 -> lt N1 N3.
============================
forall N1 N2 N3, lt N1 N2 -> le N2 N3 -> lt N1 N3
lt_le_compose < intros.
Variables: N1 N2 N3
H1 : lt N1 N2
H2 : le N2 N3
============================
lt N1 N3
lt_le_compose < case H1.
Variables: N1 N2 N3 N
H2 : le N2 N3
H3 : {add N1 (s N) N2}
============================
lt N1 N3
lt_le_compose < case H2.
Variables: N1 N2 N3 N N4
H3 : {add N1 (s N) N2}
H4 : {add N2 N4 N3}
============================
lt N1 N3
lt_le_compose < unfold.
Variables: N1 N2 N3 N N4
H3 : {add N1 (s N) N2}
H4 : {add N2 N4 N3}
============================
exists N, {add N1 (s N) N3}
lt_le_compose < apply add_assoc to H3 H4.
Variables: N1 N2 N3 N N4 N23
H3 : {add N1 (s N) N2}
H4 : {add N2 N4 N3}
H5 : {add (s N) N4 N23}
H6 : {add N1 N23 N3}
============================
exists N, {add N1 (s N) N3}
lt_le_compose < case H5.
Variables: N1 N2 N3 N N4 N5
H3 : {add N1 (s N) N2}
H4 : {add N2 N4 N3}
H6 : {add N1 (s N5) N3}
H7 : {add N N4 N5}
============================
exists N, {add N1 (s N) N3}
lt_le_compose < search.
Proof completed.
Abella < Theorem add_result_le_to_arg1_le :
forall N1 N2 N2' J K, {add N1 N2 J} -> {add N1 N2' K} -> le J K -> le N2 N2'.
============================
forall N1 N2 N2' J K, {add N1 N2 J} -> {add N1 N2' K} -> le J K -> le N2 N2'
add_result_le_to_arg1_le < induction on 1.
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
============================
forall N1 N2 N2' J K, {add N1 N2 J}@ -> {add N1 N2' K} -> le J K ->
le N2 N2'
add_result_le_to_arg1_le < intros.
Variables: N1 N2 N2' J K
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
H1 : {add N1 N2 J}@
H2 : {add N1 N2' K}
H3 : le J K
============================
le N2 N2'
add_result_le_to_arg1_le < case H1.
Subgoal 1:
Variables: N2' J K
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
H2 : {add z N2' K}
H3 : le J K
============================
le J N2'
Subgoal 2 is:
le N2 N2'
add_result_le_to_arg1_le < case H2.
Subgoal 1:
Variables: J K
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
H3 : le J K
============================
le J K
Subgoal 2 is:
le N2 N2'
add_result_le_to_arg1_le < search.
Subgoal 2:
Variables: N2 N2' K N3 N5
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
H2 : {add (s N5) N2' K}
H3 : le (s N3) K
H4 : {add N5 N2 N3}*
============================
le N2 N2'
add_result_le_to_arg1_le < case H2.
Subgoal 2:
Variables: N2 N2' N3 N5 N4
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
H3 : le (s N3) (s N4)
H4 : {add N5 N2 N3}*
H5 : {add N5 N2' N4}
============================
le N2 N2'
add_result_le_to_arg1_le < assert le N3 N4.
Subgoal 2.1:
Variables: N2 N2' N3 N5 N4
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
H3 : le (s N3) (s N4)
H4 : {add N5 N2 N3}*
H5 : {add N5 N2' N4}
============================
le N3 N4
Subgoal 2 is:
le N2 N2'
add_result_le_to_arg1_le < case H3.
Subgoal 2.1:
Variables: N2 N2' N3 N5 N4 N
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
H4 : {add N5 N2 N3}*
H5 : {add N5 N2' N4}
H6 : {add (s N3) N (s N4)}
============================
le N3 N4
Subgoal 2 is:
le N2 N2'
add_result_le_to_arg1_le < case H6.
Subgoal 2.1:
Variables: N2 N2' N3 N5 N4 N
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
H4 : {add N5 N2 N3}*
H5 : {add N5 N2' N4}
H7 : {add N3 N N4}
============================
le N3 N4
Subgoal 2 is:
le N2 N2'
add_result_le_to_arg1_le < search.
Subgoal 2:
Variables: N2 N2' N3 N5 N4
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
H3 : le (s N3) (s N4)
H4 : {add N5 N2 N3}*
H5 : {add N5 N2' N4}
H6 : le N3 N4
============================
le N2 N2'
add_result_le_to_arg1_le < apply IH to H4 H5 H6.
Subgoal 2:
Variables: N2 N2' N3 N5 N4
IH : forall N1 N2 N2' J K, {add N1 N2 J}* -> {add N1 N2' K} -> le J K ->
le N2 N2'
H3 : le (s N3) (s N4)
H4 : {add N5 N2 N3}*
H5 : {add N5 N2' N4}
H6 : le N3 N4
H7 : le N2 N2'
============================
le N2 N2'
add_result_le_to_arg1_le < search.
Proof completed.
Abella < Theorem add_le_complement :
forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N} ->
{add N1' N2' N} -> le N2' N2.
============================
forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N} ->
{add N1' N2' N} -> le N2' N2
add_le_complement < induction on 3.
IH : forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N}* ->
{add N1' N2' N} -> le N2' N2
============================
forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N}@ ->
{add N1' N2' N} -> le N2' N2
add_le_complement < intros.
Variables: N1 N2 N1' N2' N
IH : forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N}* ->
{add N1' N2' N} -> le N2' N2
H1 : {is_nat N2}
H2 : le N1 N1'
H3 : {add N1 N2 N}@
H4 : {add N1' N2' N}
============================
le N2' N2
add_le_complement < case H3.
Subgoal 1:
Variables: N1' N2' N
IH : forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N}* ->
{add N1' N2' N} -> le N2' N2
H1 : {is_nat N}
H2 : le z N1'
H4 : {add N1' N2' N}
============================
le N2' N
Subgoal 2 is:
le N2' N2
add_le_complement < apply add_comm to _ H4.
Subgoal 1:
Variables: N1' N2' N
IH : forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N}* ->
{add N1' N2' N} -> le N2' N2
H1 : {is_nat N}
H2 : le z N1'
H4 : {add N1' N2' N}
H5 : {add N2' N1' N}
============================
le N2' N
Subgoal 2 is:
le N2' N2
add_le_complement < search.
Subgoal 2:
Variables: N2 N1' N2' N3 N5
IH : forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N}* ->
{add N1' N2' N} -> le N2' N2
H1 : {is_nat N2}
H2 : le (s N5) N1'
H4 : {add N1' N2' (s N3)}
H5 : {add N5 N2 N3}*
============================
le N2' N2
add_le_complement < case H2.
Subgoal 2:
Variables: N2 N1' N2' N3 N5 N4
IH : forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N}* ->
{add N1' N2' N} -> le N2' N2
H1 : {is_nat N2}
H4 : {add N1' N2' (s N3)}
H5 : {add N5 N2 N3}*
H6 : {add (s N5) N4 N1'}
============================
le N2' N2
add_le_complement < case H6.
Subgoal 2:
Variables: N2 N2' N3 N5 N4 N6
IH : forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N}* ->
{add N1' N2' N} -> le N2' N2
H1 : {is_nat N2}
H4 : {add (s N6) N2' (s N3)}
H5 : {add N5 N2 N3}*
H7 : {add N5 N4 N6}
============================
le N2' N2
add_le_complement < case H4.
Subgoal 2:
Variables: N2 N2' N3 N5 N4 N6
IH : forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N}* ->
{add N1' N2' N} -> le N2' N2
H1 : {is_nat N2}
H5 : {add N5 N2 N3}*
H7 : {add N5 N4 N6}
H8 : {add N6 N2' N3}
============================
le N2' N2
add_le_complement < apply IH to H1 _ H5 H8.
Subgoal 2:
Variables: N2 N2' N3 N5 N4 N6
IH : forall N1 N2 N1' N2' N, {is_nat N2} -> le N1 N1' -> {add N1 N2 N}* ->
{add N1' N2' N} -> le N2' N2
H1 : {is_nat N2}
H5 : {add N5 N2 N3}*
H7 : {add N5 N4 N6}
H8 : {add N6 N2' N3}
H9 : le N2' N2
============================
le N2' N2
add_le_complement < search.
Proof completed.
Abella < Theorem k_minus_n1 :
forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123} ->
{add N123 N K} -> (exists K', {add N1 K' K}).
============================
forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123} ->
{add N123 N K} -> (exists K', {add N1 K' K})
k_minus_n1 < induction on 2.
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N1 K' K})
============================
forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}@ ->
{add N123 N K} -> (exists K', {add N1 K' K})
k_minus_n1 < intros.
Variables: N1 N2 N3 N23 N123 N K
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N1 K' K})
H1 : {add N2 N3 N23}
H2 : {add N1 N23 N123}@
H3 : {add N123 N K}
============================
exists K', {add N1 K' K}
k_minus_n1 < case H2.
Subgoal 1:
Variables: N2 N3 N123 N K
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N1 K' K})
H1 : {add N2 N3 N123}
H3 : {add N123 N K}
============================
exists K', {add z K' K}
Subgoal 2 is:
exists K', {add (s N6) K' K}
k_minus_n1 < search.
Subgoal 2:
Variables: N2 N3 N23 N K N4 N6
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N1 K' K})
H1 : {add N2 N3 N23}
H3 : {add (s N4) N K}
H4 : {add N6 N23 N4}*
============================
exists K', {add (s N6) K' K}
k_minus_n1 < case H3.
Subgoal 2:
Variables: N2 N3 N23 N N4 N6 N5
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N1 K' K})
H1 : {add N2 N3 N23}
H4 : {add N6 N23 N4}*
H5 : {add N4 N N5}
============================
exists K', {add (s N6) K' (s N5)}
k_minus_n1 < apply IH to _ H4 _.
Subgoal 2:
Variables: N2 N3 N23 N N4 N6 N5 K'
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N1 K' K})
H1 : {add N2 N3 N23}
H4 : {add N6 N23 N4}*
H5 : {add N4 N N5}
H6 : {add N6 K' N5}
============================
exists K', {add (s N6) K' (s N5)}
k_minus_n1 < search.
Proof completed.
Abella < Theorem k_minus_n2 :
forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123} ->
{add N123 N K} -> (exists K', {add N2 K' K}).
============================
forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123} ->
{add N123 N K} -> (exists K', {add N2 K' K})
k_minus_n2 < induction on 2.
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N2 K' K})
============================
forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}@ ->
{add N123 N K} -> (exists K', {add N2 K' K})
k_minus_n2 < intros.
Variables: N1 N2 N3 N23 N123 N K
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N2 K' K})
H1 : {add N2 N3 N23}
H2 : {add N1 N23 N123}@
H3 : {add N123 N K}
============================
exists K', {add N2 K' K}
k_minus_n2 < case H2.
Subgoal 1:
Variables: N2 N3 N123 N K
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N2 K' K})
H1 : {add N2 N3 N123}
H3 : {add N123 N K}
============================
exists K', {add N2 K' K}
Subgoal 2 is:
exists K', {add N2 K' K}
k_minus_n2 < apply add_assoc to H1 H3.
Subgoal 1:
Variables: N2 N3 N123 N K N4
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N2 K' K})
H1 : {add N2 N3 N123}
H3 : {add N123 N K}
H4 : {add N3 N N4}
H5 : {add N2 N4 K}
============================
exists K', {add N2 K' K}
Subgoal 2 is:
exists K', {add N2 K' K}
k_minus_n2 < search.
Subgoal 2:
Variables: N2 N3 N23 N K N4 N6
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N2 K' K})
H1 : {add N2 N3 N23}
H3 : {add (s N4) N K}
H4 : {add N6 N23 N4}*
============================
exists K', {add N2 K' K}
k_minus_n2 < case H3.
Subgoal 2:
Variables: N2 N3 N23 N N4 N6 N5
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N2 K' K})
H1 : {add N2 N3 N23}
H4 : {add N6 N23 N4}*
H5 : {add N4 N N5}
============================
exists K', {add N2 K' (s N5)}
k_minus_n2 < apply IH to _ H4 _.
Subgoal 2:
Variables: N2 N3 N23 N N4 N6 N5 K'
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N2 K' K})
H1 : {add N2 N3 N23}
H4 : {add N6 N23 N4}*
H5 : {add N4 N N5}
H6 : {add N2 K' N5}
============================
exists K', {add N2 K' (s N5)}
k_minus_n2 < apply add_s to H6.
Subgoal 2:
Variables: N2 N3 N23 N N4 N6 N5 K'
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} -> (exists K', {add N2 K' K})
H1 : {add N2 N3 N23}
H4 : {add N6 N23 N4}*
H5 : {add N4 N N5}
H6 : {add N2 K' N5}
H7 : {add N2 (s K') (s N5)}
============================
exists K', {add N2 K' (s N5)}
k_minus_n2 < search.
Proof completed.
Abella < Theorem k_minus_n12 :
forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123} ->
{add N123 N K} ->
(exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K}).
============================
forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123} ->
{add N123 N K} ->
(exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K})
k_minus_n12 < induction on 2.
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} ->
(exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K})
============================
forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}@ ->
{add N123 N K} ->
(exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K})
k_minus_n12 < intros.
Variables: N1 N2 N3 N23 N123 N K
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} ->
(exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K})
H1 : {add N2 N3 N23}
H2 : {add N1 N23 N123}@
H3 : {add N123 N K}
============================
exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K}
k_minus_n12 < case H2.
Subgoal 1:
Variables: N2 N3 N123 N K
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} ->
(exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K})
H1 : {add N2 N3 N123}
H3 : {add N123 N K}
============================
exists K' N12, {add z N2 N12} /\ {add N3 N K'} /\ {add N12 K' K}
Subgoal 2 is:
exists K' N12, {add (s N6) N2 N12} /\ {add N3 N K'} /\ {add N12 K' K}
k_minus_n12 < apply add_assoc to H1 H3.
Subgoal 1:
Variables: N2 N3 N123 N K N4
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} ->
(exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K})
H1 : {add N2 N3 N123}
H3 : {add N123 N K}
H4 : {add N3 N N4}
H5 : {add N2 N4 K}
============================
exists K' N12, {add z N2 N12} /\ {add N3 N K'} /\ {add N12 K' K}
Subgoal 2 is:
exists K' N12, {add (s N6) N2 N12} /\ {add N3 N K'} /\ {add N12 K' K}
k_minus_n12 < search.
Subgoal 2:
Variables: N2 N3 N23 N K N4 N6
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} ->
(exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K})
H1 : {add N2 N3 N23}
H3 : {add (s N4) N K}
H4 : {add N6 N23 N4}*
============================
exists K' N12, {add (s N6) N2 N12} /\ {add N3 N K'} /\ {add N12 K' K}
k_minus_n12 < case H3.
Subgoal 2:
Variables: N2 N3 N23 N N4 N6 N5
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} ->
(exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K})
H1 : {add N2 N3 N23}
H4 : {add N6 N23 N4}*
H5 : {add N4 N N5}
============================
exists K' N12, {add (s N6) N2 N12} /\ {add N3 N K'} /\ {add N12 K' (s N5)}
k_minus_n12 < apply IH to _ H4 _.
Subgoal 2:
Variables: N2 N3 N23 N N4 N6 N5 K' N12
IH : forall N1 N2 N3 N23 N123 N K, {add N2 N3 N23} -> {add N1 N23 N123}* ->
{add N123 N K} ->
(exists K' N12, {add N1 N2 N12} /\ {add N3 N K'} /\ {add N12 K' K})
H1 : {add N2 N3 N23}
H4 : {add N6 N23 N4}*
H5 : {add N4 N N5}
H6 : {add N6 N2 N12}
H7 : {add N3 N K'}
H8 : {add N12 K' N5}
============================
exists K' N12, {add (s N6) N2 N12} /\ {add N3 N K'} /\ {add N12 K' (s N5)}
k_minus_n12 < search.
Proof completed.
Abella < Theorem sum_complement_to_lt1 :
forall N1 N2 N12 K K' N, {is_nat N} -> {add N1 N2 N12} -> {add N12 K N} ->
{add N1 K' N} -> lt K (s K').
============================
forall N1 N2 N12 K K' N, {is_nat N} -> {add N1 N2 N12} -> {add N12 K N} ->
{add N1 K' N} -> lt K (s K')
sum_complement_to_lt1 < intros.
Variables: N1 N2 N12 K K' N
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N1 K' N}
============================
lt K (s K')
sum_complement_to_lt1 < apply add_assoc to H2 H3.
Variables: N1 N2 N12 K K' N N23
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N1 K' N}
H5 : {add N2 K N23}
H6 : {add N1 N23 N}
============================
lt K (s K')
sum_complement_to_lt1 < unfold.
Variables: N1 N2 N12 K K' N N23
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N1 K' N}
H5 : {add N2 K N23}
H6 : {add N1 N23 N}
============================
exists N, {add K (s N) (s K')}
sum_complement_to_lt1 < apply add_arg2_det to H4 H6.
Variables: N1 N2 N12 K N N23
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N1 N23 N}
H5 : {add N2 K N23}
H6 : {add N1 N23 N}
============================
exists N, {add K (s N) (s N23)}
sum_complement_to_lt1 < apply add_comm to _ H5.
Subgoal 1:
Variables: N1 N2 N12 K N N23
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N1 N23 N}
H5 : {add N2 K N23}
H6 : {add N1 N23 N}
============================
{is_nat N23}
Subgoal is:
exists N, {add K (s N) (s N23)}
sum_complement_to_lt1 < backchain add_arg2_isnat.
Variables: N1 N2 N12 K N N23
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N1 N23 N}
H5 : {add N2 K N23}
H6 : {add N1 N23 N}
H7 : {add K N2 N23}
============================
exists N, {add K (s N) (s N23)}
sum_complement_to_lt1 < apply add_s to H7.
Variables: N1 N2 N12 K N N23
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N1 N23 N}
H5 : {add N2 K N23}
H6 : {add N1 N23 N}
H7 : {add K N2 N23}
H8 : {add K (s N2) (s N23)}
============================
exists N, {add K (s N) (s N23)}
sum_complement_to_lt1 < search.
Proof completed.
Abella < Theorem sum_complement_to_lt2 :
forall N1 N2 N12 K K' N, {is_nat N} -> {add N1 N2 N12} -> {add N12 K N} ->
{add N2 K' N} -> lt K (s K').
============================
forall N1 N2 N12 K K' N, {is_nat N} -> {add N1 N2 N12} -> {add N12 K N} ->
{add N2 K' N} -> lt K (s K')
sum_complement_to_lt2 < intros.
Variables: N1 N2 N12 K K' N
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N2 K' N}
============================
lt K (s K')
sum_complement_to_lt2 < apply add_comm to _ H2.
Subgoal 1:
Variables: N1 N2 N12 K K' N
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N2 K' N}
============================
{is_nat N12}
Subgoal is:
lt K (s K')
sum_complement_to_lt2 < backchain add_arg1_isnat.
Variables: N1 N2 N12 K K' N
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N2 K' N}
H5 : {add N2 N1 N12}
============================
lt K (s K')
sum_complement_to_lt2 < apply sum_complement_to_lt1 to _ H5 H3 H4.
Variables: N1 N2 N12 K K' N
H1 : {is_nat N}
H2 : {add N1 N2 N12}
H3 : {add N12 K N}
H4 : {add N2 K' N}
H5 : {add N2 N1 N12}
H6 : lt K (s K')
============================
lt K (s K')
sum_complement_to_lt2 < search.
Proof completed.
Abella < Theorem npred_det :
forall N N1 N2, {npred N N1} -> {npred N N2} -> N1 = N2.
============================
forall N N1 N2, {npred N N1} -> {npred N N2} -> N1 = N2
npred_det < intros.
Variables: N N1 N2
H1 : {npred N N1}
H2 : {npred N N2}
============================
N1 = N2
npred_det < case H1.
Subgoal 1:
Variables: N2
H2 : {npred z N2}
============================
z = N2
Subgoal 2 is:
N1 = N2
npred_det < case H2.
Subgoal 1:
============================
z = z
Subgoal 2 is:
N1 = N2
npred_det < search.
Subgoal 2:
Variables: N1 N2
H2 : {npred (s N1) N2}
============================
N1 = N2
npred_det < case H2.
Subgoal 2:
Variables: N2
============================
N2 = N2
npred_det < search.
Proof completed.
Abella < Define is_list : olist -> prop by
is_list nil;
is_list (X :: L) := is_list L.
Abella < Define append : olist -> olist -> olist -> prop by
append nil L L;
append (X :: L1) L2 (X :: L3) := append L1 L2 L3.
Abella < Theorem append_refl :
forall L, is_list L -> append L nil L.
============================
forall L, is_list L -> append L nil L
append_refl < induction on 1.
IH : forall L, is_list L * -> append L nil L
============================
forall L, is_list L @ -> append L nil L
append_refl < intros.
Variables: L
IH : forall L, is_list L * -> append L nil L
H1 : is_list L @
============================
append L nil L
append_refl < case H1.
Subgoal 1:
IH : forall L, is_list L * -> append L nil L
============================
append nil nil nil
Subgoal 2 is:
append (X :: L1) nil (X :: L1)
append_refl < search.
Subgoal 2:
Variables: L1 X
IH : forall L, is_list L * -> append L nil L
H2 : is_list L1 *
============================
append (X :: L1) nil (X :: L1)
append_refl < unfold.
Subgoal 2:
Variables: L1 X
IH : forall L, is_list L * -> append L nil L
H2 : is_list L1 *
============================
append L1 nil L1
append_refl < backchain IH.
Proof completed.
Abella < Theorem append_exists :
forall L1 L2, is_list L1 -> (exists L3, append L1 L2 L3).
============================
forall L1 L2, is_list L1 -> (exists L3, append L1 L2 L3)
append_exists < induction on 1.
IH : forall L1 L2, is_list L1 * -> (exists L3, append L1 L2 L3)
============================
forall L1 L2, is_list L1 @ -> (exists L3, append L1 L2 L3)
append_exists < intros.
Variables: L1 L2
IH : forall L1 L2, is_list L1 * -> (exists L3, append L1 L2 L3)
H1 : is_list L1 @
============================
exists L3, append L1 L2 L3
append_exists < case H1.
Subgoal 1:
Variables: L2
IH : forall L1 L2, is_list L1 * -> (exists L3, append L1 L2 L3)
============================
exists L3, append nil L2 L3
Subgoal 2 is:
exists L3, append (X :: L) L2 L3
append_exists < search.
Subgoal 2:
Variables: L2 L X
IH : forall L1 L2, is_list L1 * -> (exists L3, append L1 L2 L3)
H2 : is_list L *
============================
exists L3, append (X :: L) L2 L3
append_exists < apply IH to H2 with L2 = L2.
Subgoal 2:
Variables: L2 L X L3
IH : forall L1 L2, is_list L1 * -> (exists L3, append L1 L2 L3)
H2 : is_list L *
H3 : append L L2 L3
============================
exists L3, append (X :: L) L2 L3
append_exists < search.
Proof completed.
Abella < Theorem append_result_islist :
forall L1 L2 L, is_list L2 -> append L1 L2 L -> is_list L.
============================
forall L1 L2 L, is_list L2 -> append L1 L2 L -> is_list L
append_result_islist < induction on 2.
IH : forall L1 L2 L, is_list L2 -> append L1 L2 L * -> is_list L
============================
forall L1 L2 L, is_list L2 -> append L1 L2 L @ -> is_list L
append_result_islist < intros.
Variables: L1 L2 L
IH : forall L1 L2 L, is_list L2 -> append L1 L2 L * -> is_list L
H1 : is_list L2
H2 : append L1 L2 L @
============================
is_list L
append_result_islist < case H2.
Subgoal 1:
Variables: L
IH : forall L1 L2 L, is_list L2 -> append L1 L2 L * -> is_list L
H1 : is_list L
============================
is_list L
Subgoal 2 is:
is_list (X :: L5)
append_result_islist < search.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, is_list L2 -> append L1 L2 L * -> is_list L
H1 : is_list L2
H3 : append L3 L2 L5 *
============================
is_list (X :: L5)
append_result_islist < unfold.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, is_list L2 -> append L1 L2 L * -> is_list L
H1 : is_list L2
H3 : append L3 L2 L5 *
============================
is_list L5
append_result_islist < backchain IH.
Proof completed.
Abella < Theorem append_arg2_islist :
forall L1 L2 L, is_list L -> append L1 L2 L -> is_list L2.
============================
forall L1 L2 L, is_list L -> append L1 L2 L -> is_list L2
append_arg2_islist < induction on 2.
IH : forall L1 L2 L, is_list L -> append L1 L2 L * -> is_list L2
============================
forall L1 L2 L, is_list L -> append L1 L2 L @ -> is_list L2
append_arg2_islist < intros.
Variables: L1 L2 L
IH : forall L1 L2 L, is_list L -> append L1 L2 L * -> is_list L2
H1 : is_list L
H2 : append L1 L2 L @
============================
is_list L2
append_arg2_islist < case H2.
Subgoal 1:
Variables: L
IH : forall L1 L2 L, is_list L -> append L1 L2 L * -> is_list L2
H1 : is_list L
============================
is_list L
Subgoal 2 is:
is_list L2
append_arg2_islist < search.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, is_list L -> append L1 L2 L * -> is_list L2
H1 : is_list (X :: L5)
H3 : append L3 L2 L5 *
============================
is_list L2
append_arg2_islist < backchain IH with L1 = L3, L = L5.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, is_list L -> append L1 L2 L * -> is_list L2
H1 : is_list (X :: L5)
H3 : append L3 L2 L5 *
============================
is_list L5
append_arg2_islist < case H1.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, is_list L -> append L1 L2 L * -> is_list L2
H3 : append L3 L2 L5 *
H4 : is_list L5
============================
is_list L5
append_arg2_islist < search.
Proof completed.
Abella < Theorem append_arg1_islist :
forall L1 L2 L, append L1 L2 L -> is_list L1.
============================
forall L1 L2 L, append L1 L2 L -> is_list L1
append_arg1_islist < induction on 1.
IH : forall L1 L2 L, append L1 L2 L * -> is_list L1
============================
forall L1 L2 L, append L1 L2 L @ -> is_list L1
append_arg1_islist < intros.
Variables: L1 L2 L
IH : forall L1 L2 L, append L1 L2 L * -> is_list L1
H1 : append L1 L2 L @
============================
is_list L1
append_arg1_islist < case H1.
Subgoal 1:
Variables: L
IH : forall L1 L2 L, append L1 L2 L * -> is_list L1
============================
is_list nil
Subgoal 2 is:
is_list (X :: L3)
append_arg1_islist < search.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, append L1 L2 L * -> is_list L1
H2 : append L3 L2 L5 *
============================
is_list (X :: L3)
append_arg1_islist < unfold.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, append L1 L2 L * -> is_list L1
H2 : append L3 L2 L5 *
============================
is_list L3
append_arg1_islist < backchain IH.
Proof completed.
Abella < Define subset : olist -> olist -> prop by
subset nil L;
subset (X :: L1) L2 := member X L2 /\ subset L1 L2.
Abella < Theorem subset_add :
forall L L' X, subset L L' -> subset L (X :: L').
============================
forall L L' X, subset L L' -> subset L (X :: L')
subset_add < induction on 1.
IH : forall L L' X, subset L L' * -> subset L (X :: L')
============================
forall L L' X, subset L L' @ -> subset L (X :: L')
subset_add < intros.
Variables: L L' X
IH : forall L L' X, subset L L' * -> subset L (X :: L')
H1 : subset L L' @
============================
subset L (X :: L')
subset_add < case H1.
Subgoal 1:
Variables: L' X
IH : forall L L' X, subset L L' * -> subset L (X :: L')
============================
subset nil (X :: L')
Subgoal 2 is:
subset (X1 :: L1) (X :: L')
subset_add < search.
Subgoal 2:
Variables: L' X L1 X1
IH : forall L L' X, subset L L' * -> subset L (X :: L')
H2 : member X1 L'
H3 : subset L1 L' *
============================
subset (X1 :: L1) (X :: L')
subset_add < unfold.
Subgoal 2.1:
Variables: L' X L1 X1
IH : forall L L' X, subset L L' * -> subset L (X :: L')
H2 : member X1 L'
H3 : subset L1 L' *
============================
member X1 (X :: L')
Subgoal 2.2 is:
subset L1 (X :: L')
subset_add < search.
Subgoal 2.2:
Variables: L' X L1 X1
IH : forall L L' X, subset L L' * -> subset L (X :: L')
H2 : member X1 L'
H3 : subset L1 L' *
============================
subset L1 (X :: L')
subset_add < backchain IH.
Proof completed.
Abella < Theorem subset_refl :
forall L, is_list L -> subset L L.
============================
forall L, is_list L -> subset L L
subset_refl < induction on 1.
IH : forall L, is_list L * -> subset L L
============================
forall L, is_list L @ -> subset L L
subset_refl < intros.
Variables: L
IH : forall L, is_list L * -> subset L L
H1 : is_list L @
============================
subset L L
subset_refl < case H1.
Subgoal 1:
IH : forall L, is_list L * -> subset L L
============================
subset nil nil
Subgoal 2 is:
subset (X :: L1) (X :: L1)
subset_refl < search.
Subgoal 2:
Variables: L1 X
IH : forall L, is_list L * -> subset L L
H2 : is_list L1 *
============================
subset (X :: L1) (X :: L1)
subset_refl < unfold.
Subgoal 2.1:
Variables: L1 X
IH : forall L, is_list L * -> subset L L
H2 : is_list L1 *
============================
member X (X :: L1)
Subgoal 2.2 is:
subset L1 (X :: L1)
subset_refl < search.
Subgoal 2.2:
Variables: L1 X
IH : forall L, is_list L * -> subset L L
H2 : is_list L1 *
============================
subset L1 (X :: L1)
subset_refl < backchain subset_add.
Subgoal 2.2:
Variables: L1 X
IH : forall L, is_list L * -> subset L L
H2 : is_list L1 *
============================
subset L1 L1
subset_refl < backchain IH.
Proof completed.
Abella < Theorem subset_mem_trans :
forall L1 L2 X, subset L1 L2 -> member X L1 -> member X L2.
============================
forall L1 L2 X, subset L1 L2 -> member X L1 -> member X L2
subset_mem_trans < induction on 2.
IH : forall L1 L2 X, subset L1 L2 -> member X L1 * -> member X L2
============================
forall L1 L2 X, subset L1 L2 -> member X L1 @ -> member X L2
subset_mem_trans < intros.
Variables: L1 L2 X
IH : forall L1 L2 X, subset L1 L2 -> member X L1 * -> member X L2
H1 : subset L1 L2
H2 : member X L1 @
============================
member X L2
subset_mem_trans < case H2.
Subgoal 1:
Variables: L2 X L
IH : forall L1 L2 X, subset L1 L2 -> member X L1 * -> member X L2
H1 : subset (X :: L) L2
============================
member X L2
Subgoal 2 is:
member X L2
subset_mem_trans < case H1.
Subgoal 1:
Variables: L2 X L
IH : forall L1 L2 X, subset L1 L2 -> member X L1 * -> member X L2
H3 : member X L2
H4 : subset L L2
============================
member X L2
Subgoal 2 is:
member X L2
subset_mem_trans < search.
Subgoal 2:
Variables: L2 X L B
IH : forall L1 L2 X, subset L1 L2 -> member X L1 * -> member X L2
H1 : subset (B :: L) L2
H3 : member X L *
============================
member X L2
subset_mem_trans < case H1.
Subgoal 2:
Variables: L2 X L B
IH : forall L1 L2 X, subset L1 L2 -> member X L1 * -> member X L2
H3 : member X L *
H4 : member B L2
H5 : subset L L2
============================
member X L2
subset_mem_trans < backchain IH.
Proof completed.
Abella < Theorem subset_trans :
forall L1 L2 L3, subset L1 L2 -> subset L2 L3 -> subset L1 L3.
============================
forall L1 L2 L3, subset L1 L2 -> subset L2 L3 -> subset L1 L3
subset_trans < induction on 1.
IH : forall L1 L2 L3, subset L1 L2 * -> subset L2 L3 -> subset L1 L3
============================
forall L1 L2 L3, subset L1 L2 @ -> subset L2 L3 -> subset L1 L3
subset_trans < intros.
Variables: L1 L2 L3
IH : forall L1 L2 L3, subset L1 L2 * -> subset L2 L3 -> subset L1 L3
H1 : subset L1 L2 @
H2 : subset L2 L3
============================
subset L1 L3
subset_trans < case H1.
Subgoal 1:
Variables: L2 L3
IH : forall L1 L2 L3, subset L1 L2 * -> subset L2 L3 -> subset L1 L3
H2 : subset L2 L3
============================
subset nil L3
Subgoal 2 is:
subset (X :: L4) L3
subset_trans < search.
Subgoal 2:
Variables: L2 L3 L4 X
IH : forall L1 L2 L3, subset L1 L2 * -> subset L2 L3 -> subset L1 L3
H2 : subset L2 L3
H3 : member X L2
H4 : subset L4 L2 *
============================
subset (X :: L4) L3
subset_trans < unfold.
Subgoal 2.1:
Variables: L2 L3 L4 X
IH : forall L1 L2 L3, subset L1 L2 * -> subset L2 L3 -> subset L1 L3
H2 : subset L2 L3
H3 : member X L2
H4 : subset L4 L2 *
============================
member X L3
Subgoal 2.2 is:
subset L4 L3
subset_trans < backchain subset_mem_trans.
Subgoal 2.2:
Variables: L2 L3 L4 X
IH : forall L1 L2 L3, subset L1 L2 * -> subset L2 L3 -> subset L1 L3
H2 : subset L2 L3
H3 : member X L2
H4 : subset L4 L2 *
============================
subset L4 L3
subset_trans < backchain IH.
Proof completed.
Abella < Theorem subset_extend :
forall L L' X, subset L L' -> subset (X :: L) (X :: L').
============================
forall L L' X, subset L L' -> subset (X :: L) (X :: L')
subset_extend < intros.
Variables: L L' X
H1 : subset L L'
============================
subset (X :: L) (X :: L')
subset_extend < unfold.
Subgoal 1:
Variables: L L' X
H1 : subset L L'
============================
member X (X :: L')
Subgoal 2 is:
subset L (X :: L')
subset_extend < search.
Subgoal 2:
Variables: L L' X
H1 : subset L L'
============================
subset L (X :: L')
subset_extend < backchain subset_add.
Proof completed.
Abella < Theorem append_sub1 :
forall L1 L2 L, append L1 L2 L -> subset L1 L.
============================
forall L1 L2 L, append L1 L2 L -> subset L1 L
append_sub1 < induction on 1.
IH : forall L1 L2 L, append L1 L2 L * -> subset L1 L
============================
forall L1 L2 L, append L1 L2 L @ -> subset L1 L
append_sub1 < intros.
Variables: L1 L2 L
IH : forall L1 L2 L, append L1 L2 L * -> subset L1 L
H1 : append L1 L2 L @
============================
subset L1 L
append_sub1 < case H1.
Subgoal 1:
Variables: L
IH : forall L1 L2 L, append L1 L2 L * -> subset L1 L
============================
subset nil L
Subgoal 2 is:
subset (X :: L3) (X :: L5)
append_sub1 < search.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, append L1 L2 L * -> subset L1 L
H2 : append L3 L2 L5 *
============================
subset (X :: L3) (X :: L5)
append_sub1 < backchain subset_extend.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, append L1 L2 L * -> subset L1 L
H2 : append L3 L2 L5 *
============================
subset L3 L5
append_sub1 < backchain IH.
Proof completed.
Abella < Theorem append_sub2 :
forall L1 L2 L, is_list L2 -> append L1 L2 L -> subset L2 L.
============================
forall L1 L2 L, is_list L2 -> append L1 L2 L -> subset L2 L
append_sub2 < induction on 2.
IH : forall L1 L2 L, is_list L2 -> append L1 L2 L * -> subset L2 L
============================
forall L1 L2 L, is_list L2 -> append L1 L2 L @ -> subset L2 L
append_sub2 < intros.
Variables: L1 L2 L
IH : forall L1 L2 L, is_list L2 -> append L1 L2 L * -> subset L2 L
H1 : is_list L2
H2 : append L1 L2 L @
============================
subset L2 L
append_sub2 < case H2.
Subgoal 1:
Variables: L
IH : forall L1 L2 L, is_list L2 -> append L1 L2 L * -> subset L2 L
H1 : is_list L
============================
subset L L
Subgoal 2 is:
subset L2 (X :: L5)
append_sub2 < backchain subset_refl.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, is_list L2 -> append L1 L2 L * -> subset L2 L
H1 : is_list L2
H3 : append L3 L2 L5 *
============================
subset L2 (X :: L5)
append_sub2 < backchain subset_add.
Subgoal 2:
Variables: L2 L5 X L3
IH : forall L1 L2 L, is_list L2 -> append L1 L2 L * -> subset L2 L
H1 : is_list L2
H3 : append L3 L2 L5 *
============================
subset L2 L5
append_sub2 < backchain IH.
Proof completed.
Abella < Theorem append_subset_trans :
forall L1 L2 L L', append L1 L2 L -> subset L1 L' -> subset L2 L' ->
subset L L'.
============================
forall L1 L2 L L', append L1 L2 L -> subset L1 L' -> subset L2 L' ->
subset L L'
append_subset_trans < induction on 1.
IH : forall L1 L2 L L', append L1 L2 L * -> subset L1 L' -> subset L2 L' ->
subset L L'
============================
forall L1 L2 L L', append L1 L2 L @ -> subset L1 L' -> subset L2 L' ->
subset L L'
append_subset_trans < intros.
Variables: L1 L2 L L'
IH : forall L1 L2 L L', append L1 L2 L * -> subset L1 L' -> subset L2 L' ->
subset L L'
H1 : append L1 L2 L @
H2 : subset L1 L'
H3 : subset L2 L'
============================
subset L L'
append_subset_trans < case H1.
Subgoal 1:
Variables: L L'
IH : forall L1 L2 L L', append L1 L2 L * -> subset L1 L' -> subset L2 L' ->
subset L L'
H2 : subset nil L'
H3 : subset L L'
============================
subset L L'
Subgoal 2 is:
subset (X :: L5) L'
append_subset_trans < search.
Subgoal 2:
Variables: L2 L' L5 X L3
IH : forall L1 L2 L L', append L1 L2 L * -> subset L1 L' -> subset L2 L' ->
subset L L'
H2 : subset (X :: L3) L'
H3 : subset L2 L'
H4 : append L3 L2 L5 *
============================
subset (X :: L5) L'
append_subset_trans < case H2.
Subgoal 2:
Variables: L2 L' L5 X L3
IH : forall L1 L2 L L', append L1 L2 L * -> subset L1 L' -> subset L2 L' ->
subset L L'
H3 : subset L2 L'
H4 : append L3 L2 L5 *
H5 : member X L'
H6 : subset L3 L'
============================
subset (X :: L5) L'
append_subset_trans < unfold.
Subgoal 2.1:
Variables: L2 L' L5 X L3
IH : forall L1 L2 L L', append L1 L2 L * -> subset L1 L' -> subset L2 L' ->
subset L L'
H3 : subset L2 L'
H4 : append L3 L2 L5 *
H5 : member X L'
H6 : subset L3 L'
============================
member X L'
Subgoal 2.2 is:
subset L5 L'
append_subset_trans < search.
Subgoal 2.2:
Variables: L2 L' L5 X L3
IH : forall L1 L2 L L', append L1 L2 L * -> subset L1 L' -> subset L2 L' ->
subset L L'
H3 : subset L2 L'
H4 : append L3 L2 L5 *
H5 : member X L'
H6 : subset L3 L'
============================
subset L5 L'
append_subset_trans < backchain IH.
Proof completed.
Abella < Theorem append_append_subset_trans :
forall L1 L1' L2 L2' L L', is_list L2' -> append L1 L2 L ->
append L1' L2' L' -> subset L1 L1' -> subset L2 L2' -> subset L L'.
============================
forall L1 L1' L2 L2' L L', is_list L2' -> append L1 L2 L ->
append L1' L2' L' -> subset L1 L1' -> subset L2 L2' -> subset L L'
append_append_subset_trans < intros.
Variables: L1 L1' L2 L2' L L'
H1 : is_list L2'
H2 : append L1 L2 L
H3 : append L1' L2' L'
H4 : subset L1 L1'
H5 : subset L2 L2'
============================
subset L L'
append_append_subset_trans < assert subset L1 L'.
Subgoal 1:
Variables: L1 L1' L2 L2' L L'
H1 : is_list L2'
H2 : append L1 L2 L
H3 : append L1' L2' L'
H4 : subset L1 L1'
H5 : subset L2 L2'
============================
subset L1 L'
Subgoal is:
subset L L'
append_append_subset_trans < backchain subset_trans with L2 = L1'.
Subgoal 1:
Variables: L1 L1' L2 L2' L L'
H1 : is_list L2'
H2 : append L1 L2 L
H3 : append L1' L2' L'
H4 : subset L1 L1'
H5 : subset L2 L2'
============================
subset L1' L'
Subgoal is:
subset L L'
append_append_subset_trans < backchain append_sub1.
Variables: L1 L1' L2 L2' L L'
H1 : is_list L2'
H2 : append L1 L2 L
H3 : append L1' L2' L'
H4 : subset L1 L1'
H5 : subset L2 L2'
H6 : subset L1 L'
============================
subset L L'
append_append_subset_trans < assert subset L2 L'.
Subgoal 2:
Variables: L1 L1' L2 L2' L L'
H1 : is_list L2'
H2 : append L1 L2 L
H3 : append L1' L2' L'
H4 : subset L1 L1'
H5 : subset L2 L2'
H6 : subset L1 L'
============================
subset L2 L'
Subgoal is:
subset L L'
append_append_subset_trans < backchain subset_trans with L2 = L2'.
Subgoal 2:
Variables: L1 L1' L2 L2' L L'
H1 : is_list L2'
H2 : append L1 L2 L
H3 : append L1' L2' L'
H4 : subset L1 L1'
H5 : subset L2 L2'
H6 : subset L1 L'
============================
subset L2' L'
Subgoal is:
subset L L'
append_append_subset_trans < backchain append_sub2.
Variables: L1 L1' L2 L2' L L'
H1 : is_list L2'
H2 : append L1 L2 L
H3 : append L1' L2' L'
H4 : subset L1 L1'
H5 : subset L2 L2'
H6 : subset L1 L'
H7 : subset L2 L'
============================
subset L L'
append_append_subset_trans < backchain append_subset_trans.
Proof completed.
Abella < Define tm_subset : tm_list -> tm_list -> prop by
tm_subset snil L;
tm_subset (scons X L1) L2 := {smember X L2} /\ tm_subset L1 L2.
Abella < Define is_tm_list : tm_list -> prop by
is_tm_list snil;
is_tm_list (scons X L) := is_tm_list L.
Abella < Theorem sappend_refl_eq :
forall L1 L2, {sappend L1 snil L2} -> L1 = L2.
============================
forall L1 L2, {sappend L1 snil L2} -> L1 = L2
sappend_refl_eq < induction on 1.
IH : forall L1 L2, {sappend L1 snil L2}* -> L1 = L2
============================
forall L1 L2, {sappend L1 snil L2}@ -> L1 = L2
sappend_refl_eq < intros.
Variables: L1 L2
IH : forall L1 L2, {sappend L1 snil L2}* -> L1 = L2
H1 : {sappend L1 snil L2}@
============================
L1 = L2
sappend_refl_eq < case H1.
Subgoal 1:
IH : forall L1 L2, {sappend L1 snil L2}* -> L1 = L2
============================
snil = snil
Subgoal 2 is:
scons X L5 = scons X L3
sappend_refl_eq < search.
Subgoal 2:
Variables: L3 L5 X
IH : forall L1 L2, {sappend L1 snil L2}* -> L1 = L2
H2 : {sappend L5 snil L3}*
============================
scons X L5 = scons X L3
sappend_refl_eq < apply IH to H2.
Subgoal 2:
Variables: L3 X
IH : forall L1 L2, {sappend L1 snil L2}* -> L1 = L2
H2 : {sappend L3 snil L3}*
============================
scons X L3 = scons X L3
sappend_refl_eq < search.
Proof completed.
Abella < Theorem append_prune_tm :
forall L1 L2 L3, nabla n, append L1 L2 (L3 n) -> (exists L3', L3 = y\L3').
============================
forall L1 L2 L3, nabla n, append L1 L2 (L3 n) -> (exists L3', L3 = y\L3')
append_prune_tm < induction on 1.
IH : forall L1 L2 L3, nabla n, append L1 L2 (L3 n) * ->
(exists L3', L3 = y\L3')
============================
forall L1 L2 L3, nabla n, append L1 L2 (L3 n) @ -> (exists L3', L3 = y\L3')
append_prune_tm < intros.
Variables: L1 L2 L3
IH : forall L1 L2 L3, nabla n, append L1 L2 (L3 n) * ->
(exists L3', L3 = y\L3')
H1 : append L1 L2 (L3 n1) @
============================
exists L3', L3 = y\L3'
append_prune_tm < case H1.
Subgoal 1:
Variables: L2
IH : forall L1 L2 L3, nabla n, append L1 L2 (L3 n) * ->
(exists L3', L3 = y\L3')
============================
exists L3', z1\L2 = y\L3'
Subgoal 2 is:
exists L3', z1\L7 :: L6 z1 = y\L3'
append_prune_tm < search.
Subgoal 2:
Variables: L2 L6 L7 L8
IH : forall L1 L2 L3, nabla n, append L1 L2 (L3 n) * ->
(exists L3', L3 = y\L3')
H2 : append L8 L2 (L6 n1) *
============================
exists L3', z1\L7 :: L6 z1 = y\L3'
append_prune_tm < apply IH to H2.
Subgoal 2:
Variables: L2 L7 L8 L3'
IH : forall L1 L2 L3, nabla n, append L1 L2 (L3 n) * ->
(exists L3', L3 = y\L3')
H2 : append L8 L2 L3' *
============================
exists L3'1, z1\L7 :: L3' = y\L3'1
append_prune_tm < search.
Proof completed.
Abella < Theorem tm_subset_add :
forall L L' X, tm_subset L L' -> tm_subset L (scons X L').
============================
forall L L' X, tm_subset L L' -> tm_subset L (scons X L')
tm_subset_add < induction on 1.
IH : forall L L' X, tm_subset L L' * -> tm_subset L (scons X L')
============================
forall L L' X, tm_subset L L' @ -> tm_subset L (scons X L')
tm_subset_add < intros.
Variables: L L' X
IH : forall L L' X, tm_subset L L' * -> tm_subset L (scons X L')
H1 : tm_subset L L' @
============================
tm_subset L (scons X L')
tm_subset_add < case H1.
Subgoal 1:
Variables: L' X
IH : forall L L' X, tm_subset L L' * -> tm_subset L (scons X L')
============================
tm_subset snil (scons X L')
Subgoal 2 is:
tm_subset (scons X1 L1) (scons X L')
tm_subset_add < search.
Subgoal 2:
Variables: L' X L1 X1
IH : forall L L' X, tm_subset L L' * -> tm_subset L (scons X L')
H2 : {smember X1 L'}
H3 : tm_subset L1 L' *
============================
tm_subset (scons X1 L1) (scons X L')
tm_subset_add < unfold.
Subgoal 2.1:
Variables: L' X L1 X1
IH : forall L L' X, tm_subset L L' * -> tm_subset L (scons X L')
H2 : {smember X1 L'}
H3 : tm_subset L1 L' *
============================
{smember X1 (scons X L')}
Subgoal 2.2 is:
tm_subset L1 (scons X L')
tm_subset_add < search.
Subgoal 2.2:
Variables: L' X L1 X1
IH : forall L L' X, tm_subset L L' * -> tm_subset L (scons X L')
H2 : {smember X1 L'}
H3 : tm_subset L1 L' *
============================
tm_subset L1 (scons X L')
tm_subset_add < backchain IH.
Proof completed.
Abella < Theorem tm_subset_refl :
forall L, is_tm_list L -> tm_subset L L.
============================
forall L, is_tm_list L -> tm_subset L L
tm_subset_refl < induction on 1.
IH : forall L, is_tm_list L * -> tm_subset L L
============================
forall L, is_tm_list L @ -> tm_subset L L
tm_subset_refl < intros.
Variables: L
IH : forall L, is_tm_list L * -> tm_subset L L
H1 : is_tm_list L @
============================
tm_subset L L
tm_subset_refl < case H1.
Subgoal 1:
IH : forall L, is_tm_list L * -> tm_subset L L
============================
tm_subset snil snil
Subgoal 2 is:
tm_subset (scons X L1) (scons X L1)
tm_subset_refl < search.
Subgoal 2:
Variables: L1 X
IH : forall L, is_tm_list L * -> tm_subset L L
H2 : is_tm_list L1 *
============================
tm_subset (scons X L1) (scons X L1)
tm_subset_refl < unfold.
Subgoal 2.1:
Variables: L1 X
IH : forall L, is_tm_list L * -> tm_subset L L
H2 : is_tm_list L1 *
============================
{smember X (scons X L1)}
Subgoal 2.2 is:
tm_subset L1 (scons X L1)
tm_subset_refl < search.
Subgoal 2.2:
Variables: L1 X
IH : forall L, is_tm_list L * -> tm_subset L L
H2 : is_tm_list L1 *
============================
tm_subset L1 (scons X L1)
tm_subset_refl < backchain tm_subset_add.
Subgoal 2.2:
Variables: L1 X
IH : forall L, is_tm_list L * -> tm_subset L L
H2 : is_tm_list L1 *
============================
tm_subset L1 L1
tm_subset_refl < backchain IH.
Proof completed.
Abella < Theorem tm_subset_mem_trans :
forall L1 L2 X, tm_subset L1 L2 -> {smember X L1} -> {smember X L2}.
============================
forall L1 L2 X, tm_subset L1 L2 -> {smember X L1} -> {smember X L2}
tm_subset_mem_trans < induction on 2.
IH : forall L1 L2 X, tm_subset L1 L2 -> {smember X L1}* -> {smember X L2}
============================
forall L1 L2 X, tm_subset L1 L2 -> {smember X L1}@ -> {smember X L2}
tm_subset_mem_trans < intros.
Variables: L1 L2 X
IH : forall L1 L2 X, tm_subset L1 L2 -> {smember X L1}* -> {smember X L2}
H1 : tm_subset L1 L2
H2 : {smember X L1}@
============================
{smember X L2}
tm_subset_mem_trans < case H2.
Subgoal 1:
Variables: L2 X L
IH : forall L1 L2 X, tm_subset L1 L2 -> {smember X L1}* -> {smember X L2}
H1 : tm_subset (scons X L) L2
============================
{smember X L2}
Subgoal 2 is:
{smember X L2}
tm_subset_mem_trans < case H1.
Subgoal 1:
Variables: L2 X L
IH : forall L1 L2 X, tm_subset L1 L2 -> {smember X L1}* -> {smember X L2}
H3 : {smember X L2}
H4 : tm_subset L L2
============================
{smember X L2}
Subgoal 2 is:
{smember X L2}
tm_subset_mem_trans < search.
Subgoal 2:
Variables: L2 X L X1
IH : forall L1 L2 X, tm_subset L1 L2 -> {smember X L1}* -> {smember X L2}
H1 : tm_subset (scons X1 L) L2
H3 : {smember X L}*
============================
{smember X L2}
tm_subset_mem_trans < case H1.
Subgoal 2:
Variables: L2 X L X1
IH : forall L1 L2 X, tm_subset L1 L2 -> {smember X L1}* -> {smember X L2}
H3 : {smember X L}*
H4 : {smember X1 L2}
H5 : tm_subset L L2
============================
{smember X L2}
tm_subset_mem_trans < backchain IH.
Proof completed.
Abella < Theorem tm_subset_trans :
forall L1 L2 L3, tm_subset L1 L2 -> tm_subset L2 L3 -> tm_subset L1 L3.
============================
forall L1 L2 L3, tm_subset L1 L2 -> tm_subset L2 L3 -> tm_subset L1 L3
tm_subset_trans < induction on 1.
IH : forall L1 L2 L3, tm_subset L1 L2 * -> tm_subset L2 L3 -> tm_subset L1 L3
============================
forall L1 L2 L3, tm_subset L1 L2 @ -> tm_subset L2 L3 -> tm_subset L1 L3
tm_subset_trans < intros.
Variables: L1 L2 L3
IH : forall L1 L2 L3, tm_subset L1 L2 * -> tm_subset L2 L3 -> tm_subset L1 L3
H1 : tm_subset L1 L2 @
H2 : tm_subset L2 L3
============================
tm_subset L1 L3
tm_subset_trans < case H1.
Subgoal 1:
Variables: L2 L3
IH : forall L1 L2 L3, tm_subset L1 L2 * -> tm_subset L2 L3 -> tm_subset L1 L3
H2 : tm_subset L2 L3
============================
tm_subset snil L3
Subgoal 2 is:
tm_subset (scons X L4) L3
tm_subset_trans < search.
Subgoal 2:
Variables: L2 L3 L4 X
IH : forall L1 L2 L3, tm_subset L1 L2 * -> tm_subset L2 L3 -> tm_subset L1 L3
H2 : tm_subset L2 L3
H3 : {smember X L2}
H4 : tm_subset L4 L2 *
============================
tm_subset (scons X L4) L3
tm_subset_trans < unfold.
Subgoal 2.1:
Variables: L2 L3 L4 X
IH : forall L1 L2 L3, tm_subset L1 L2 * -> tm_subset L2 L3 -> tm_subset L1 L3
H2 : tm_subset L2 L3
H3 : {smember X L2}
H4 : tm_subset L4 L2 *
============================
{smember X L3}
Subgoal 2.2 is:
tm_subset L4 L3
tm_subset_trans < backchain tm_subset_mem_trans.
Subgoal 2.2:
Variables: L2 L3 L4 X
IH : forall L1 L2 L3, tm_subset L1 L2 * -> tm_subset L2 L3 -> tm_subset L1 L3
H2 : tm_subset L2 L3
H3 : {smember X L2}
H4 : tm_subset L4 L2 *
============================
tm_subset L4 L3
tm_subset_trans < backchain IH.
Proof completed.
Abella < Theorem tm_subset_extend :
forall L L' X, tm_subset L L' -> tm_subset (scons X L) (scons X L').
============================
forall L L' X, tm_subset L L' -> tm_subset (scons X L) (scons X L')
tm_subset_extend < intros.
Variables: L L' X
H1 : tm_subset L L'
============================
tm_subset (scons X L) (scons X L')
tm_subset_extend < unfold.
Subgoal 1:
Variables: L L' X
H1 : tm_subset L L'
============================
{smember X (scons X L')}
Subgoal 2 is:
tm_subset L (scons X L')
tm_subset_extend < search.
Subgoal 2:
Variables: L L' X
H1 : tm_subset L L'
============================
tm_subset L (scons X L')
tm_subset_extend < backchain tm_subset_add.
Proof completed.
Abella < Define is_tm'_list : tm'_list -> prop by
is_tm'_list cnil;
is_tm'_list (ccons X L) := is_tm'_list L.
Abella < Theorem is_tm'_list_inst :
forall L V, nabla x, is_tm'_list (L x) -> is_tm'_list (L V).
============================
forall L V, nabla x, is_tm'_list (L x) -> is_tm'_list (L V)
is_tm'_list_inst < induction on 1.
IH : forall L V, nabla x, is_tm'_list (L x) * -> is_tm'_list (L V)
============================
forall L V, nabla x, is_tm'_list (L x) @ -> is_tm'_list (L V)
is_tm'_list_inst < intros.
Variables: L V
IH : forall L V, nabla x, is_tm'_list (L x) * -> is_tm'_list (L V)
H1 : is_tm'_list (L n1) @
============================
is_tm'_list (L V)
is_tm'_list_inst < case H1.
Subgoal 1:
Variables: V
IH : forall L V, nabla x, is_tm'_list (L x) * -> is_tm'_list (L V)
============================
is_tm'_list cnil
Subgoal 2 is:
is_tm'_list (ccons (X V) (L1 V))
is_tm'_list_inst < search.
Subgoal 2:
Variables: V L1 X
IH : forall L V, nabla x, is_tm'_list (L x) * -> is_tm'_list (L V)
H2 : is_tm'_list (L1 n1) *
============================
is_tm'_list (ccons (X V) (L1 V))
is_tm'_list_inst < apply IH to H2 with V = V.
Subgoal 2:
Variables: V L1 X
IH : forall L V, nabla x, is_tm'_list (L x) * -> is_tm'_list (L V)
H2 : is_tm'_list (L1 n1) *
H3 : is_tm'_list (L1 V)
============================
is_tm'_list (ccons (X V) (L1 V))
is_tm'_list_inst < search.
Proof completed.
Abella < Define tm'_list_length : tm'_list -> nat -> prop by
tm'_list_length cnil z;
tm'_list_length (ccons M ML) (s N) := tm'_list_length ML N.
Abella < Theorem member_prune_tm :
forall M L, nabla x, member (M x) L -> (exists M', M = y\M').
============================
forall M L, nabla x, member (M x) L -> (exists M', M = y\M')
member_prune_tm < induction on 1.
IH : forall M L, nabla x, member (M x) L * -> (exists M', M = y\M')
============================
forall M L, nabla x, member (M x) L @ -> (exists M', M = y\M')
member_prune_tm < intros.
Variables: M L
IH : forall M L, nabla x, member (M x) L * -> (exists M', M = y\M')
H1 : member (M n1) L @
============================
exists M', M = y\M'
member_prune_tm < case H1.
Subgoal 1:
Variables: L3 L2
IH : forall M L, nabla x, member (M x) L * -> (exists M', M = y\M')
============================
exists M', z1\L2 = y\M'
Subgoal 2 is:
exists M', M = y\M'
member_prune_tm < search.
Subgoal 2:
Variables: M L3 L2
IH : forall M L, nabla x, member (M x) L * -> (exists M', M = y\M')
H2 : member (M n1) L3 *
============================
exists M', M = y\M'
member_prune_tm < apply IH to H2.
Subgoal 2:
Variables: L3 L2 M'
IH : forall M L, nabla x, member (M x) L * -> (exists M', M = y\M')
H2 : member M' L3 *
============================
exists M'1, z1\M' = y\M'1
member_prune_tm < search.
Proof completed.
Abella < Theorem member_prune_tm' :
forall M L, nabla x, member (M x) L -> (exists M', M = y\M').
============================
forall M L, nabla x, member (M x) L -> (exists M', M = y\M')
member_prune_tm' < induction on 1.
IH : forall M L, nabla x, member (M x) L * -> (exists M', M = y\M')
============================
forall M L, nabla x, member (M x) L @ -> (exists M', M = y\M')
member_prune_tm' < intros.
Variables: M L
IH : forall M L, nabla x, member (M x) L * -> (exists M', M = y\M')
H1 : member (M n1) L @
============================
exists M', M = y\M'
member_prune_tm' < case H1.
Subgoal 1:
Variables: L3 L2
IH : forall M L, nabla x, member (M x) L * -> (exists M', M = y\M')
============================
exists M', z1\L2 = y\M'
Subgoal 2 is:
exists M', M = y\M'
member_prune_tm' < search.
Subgoal 2:
Variables: M L3 L2
IH : forall M L, nabla x, member (M x) L * -> (exists M', M = y\M')
H2 : member (M n1) L3 *
============================
exists M', M = y\M'
member_prune_tm' < apply IH to H2.
Subgoal 2:
Variables: L3 L2 M'
IH : forall M L, nabla x, member (M x) L * -> (exists M', M = y\M')
H2 : member M' L3 *
============================
exists M'1, z1\M' = y\M'1
member_prune_tm' < search.
Proof completed.
Abella < Theorem mmember_prune_tm :
forall M L, nabla x, {mmember (M x) L} -> (exists M', M = y\M').
============================
forall M L, nabla x, {mmember (M x) L} -> (exists M', M = y\M')
mmember_prune_tm < induction on 1.
IH : forall M L, nabla x, {mmember (M x) L}* -> (exists M', M = y\M')
============================
forall M L, nabla x, {mmember (M x) L}@ -> (exists M', M = y\M')
mmember_prune_tm < intros.
Variables: M L
IH : forall M L, nabla x, {mmember (M x) L}* -> (exists M', M = y\M')
H1 : {mmember (M n1) L}@
============================
exists M', M = y\M'
mmember_prune_tm < case H1.
Subgoal 1:
Variables: L3 L2
IH : forall M L, nabla x, {mmember (M x) L}* -> (exists M', M = y\M')
============================
exists M', z1\L2 = y\M'
Subgoal 2 is:
exists M', M = y\M'
mmember_prune_tm < search.
Subgoal 2:
Variables: M L3 L2
IH : forall M L, nabla x, {mmember (M x) L}* -> (exists M', M = y\M')
H2 : {mmember (M n1) L3}*
============================
exists M', M = y\M'
mmember_prune_tm < apply IH to H2.
Subgoal 2:
Variables: L3 L2 M'
IH : forall M L, nabla x, {mmember (M x) L}* -> (exists M', M = y\M')
H2 : {mmember M' L3}*
============================
exists M'1, z1\M' = y\M'1
mmember_prune_tm < search.
Proof completed.
Abella < Theorem mmember_prune_tm' :
forall M L, nabla x, {mmember (M x) L} -> (exists M', M = y\M').
============================
forall M L, nabla x, {mmember (M x) L} -> (exists M', M = y\M')
mmember_prune_tm' < induction on 1.
IH : forall M L, nabla x, {mmember (M x) L}* -> (exists M', M = y\M')
============================
forall M L, nabla x, {mmember (M x) L}@ -> (exists M', M = y\M')
mmember_prune_tm' < intros.
Variables: M L
IH : forall M L, nabla x, {mmember (M x) L}* -> (exists M', M = y\M')
H1 : {mmember (M n1) L}@
============================
exists M', M = y\M'
mmember_prune_tm' < case H1.
Subgoal 1:
Variables: L3 L2
IH : forall M L, nabla x, {mmember (M x) L}* -> (exists M', M = y\M')
============================
exists M', z1\L2 = y\M'
Subgoal 2 is:
exists M', M = y\M'
mmember_prune_tm' < search.
Subgoal 2:
Variables: M L3 L2
IH : forall M L, nabla x, {mmember (M x) L}* -> (exists M', M = y\M')
H2 : {mmember (M n1) L3}*
============================
exists M', M = y\M'
mmember_prune_tm' < apply IH to H2.
Subgoal 2:
Variables: L3 L2 M'
IH : forall M L, nabla x, {mmember (M x) L}* -> (exists M', M = y\M')
H2 : {mmember M' L3}*
============================
exists M'1, z1\M' = y\M'1
mmember_prune_tm' < search.
Proof completed.
Abella < Define name : tm -> prop by
nabla n, name n.
Abella < Define name' : tm' -> prop by
nabla n, name' n.
Abella < Theorem combine_subset :
forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs} ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs.
============================
forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs} ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
combine_subset < induction on 2.
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
============================
forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}@ ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
combine_subset < intros.
Variables: Vs1 Vs2 Vs
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H1 : is_tm_list Vs
H2 : {combine Vs1 Vs2 Vs}@
============================
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
combine_subset < case H2.
Subgoal 1:
Variables: Vs
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H1 : is_tm_list Vs
============================
tm_subset snil Vs /\ tm_subset Vs Vs
Subgoal 2 is:
tm_subset (scons X FVs1) Vs /\ tm_subset Vs2 Vs
Subgoal 3 is:
tm_subset (scons X FVs1) (scons X FVs) /\ tm_subset Vs2 (scons X FVs)
combine_subset < split.
Subgoal 1.1:
Variables: Vs
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H1 : is_tm_list Vs
============================
tm_subset snil Vs
Subgoal 1.2 is:
tm_subset Vs Vs
Subgoal 2 is:
tm_subset (scons X FVs1) Vs /\ tm_subset Vs2 Vs
Subgoal 3 is:
tm_subset (scons X FVs1) (scons X FVs) /\ tm_subset Vs2 (scons X FVs)
combine_subset < search.
Subgoal 1.2:
Variables: Vs
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H1 : is_tm_list Vs
============================
tm_subset Vs Vs
Subgoal 2 is:
tm_subset (scons X FVs1) Vs /\ tm_subset Vs2 Vs
Subgoal 3 is:
tm_subset (scons X FVs1) (scons X FVs) /\ tm_subset Vs2 (scons X FVs)
combine_subset < backchain tm_subset_refl.
Subgoal 2:
Variables: Vs2 Vs FVs1 X
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H1 : is_tm_list Vs
H3 : {smember X Vs2}*
H4 : {combine FVs1 Vs2 Vs}*
============================
tm_subset (scons X FVs1) Vs /\ tm_subset Vs2 Vs
Subgoal 3 is:
tm_subset (scons X FVs1) (scons X FVs) /\ tm_subset Vs2 (scons X FVs)
combine_subset < apply IH to _ H4.
Subgoal 2:
Variables: Vs2 Vs FVs1 X
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H1 : is_tm_list Vs
H3 : {smember X Vs2}*
H4 : {combine FVs1 Vs2 Vs}*
H5 : tm_subset FVs1 Vs
H6 : tm_subset Vs2 Vs
============================
tm_subset (scons X FVs1) Vs /\ tm_subset Vs2 Vs
Subgoal 3 is:
tm_subset (scons X FVs1) (scons X FVs) /\ tm_subset Vs2 (scons X FVs)
combine_subset < apply tm_subset_mem_trans to H6 H3.
Subgoal 2:
Variables: Vs2 Vs FVs1 X
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H1 : is_tm_list Vs
H3 : {smember X Vs2}*
H4 : {combine FVs1 Vs2 Vs}*
H5 : tm_subset FVs1 Vs
H6 : tm_subset Vs2 Vs
H7 : {smember X Vs}
============================
tm_subset (scons X FVs1) Vs /\ tm_subset Vs2 Vs
Subgoal 3 is:
tm_subset (scons X FVs1) (scons X FVs) /\ tm_subset Vs2 (scons X FVs)
combine_subset < search.
Subgoal 3:
Variables: Vs2 FVs FVs1 X
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H1 : is_tm_list (scons X FVs)
H3 : {combine FVs1 Vs2 FVs}*
============================
tm_subset (scons X FVs1) (scons X FVs) /\ tm_subset Vs2 (scons X FVs)
combine_subset < case H1.
Subgoal 3:
Variables: Vs2 FVs FVs1 X
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H3 : {combine FVs1 Vs2 FVs}*
H4 : is_tm_list FVs
============================
tm_subset (scons X FVs1) (scons X FVs) /\ tm_subset Vs2 (scons X FVs)
combine_subset < apply IH to _ H3.
Subgoal 3:
Variables: Vs2 FVs FVs1 X
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H3 : {combine FVs1 Vs2 FVs}*
H4 : is_tm_list FVs
H5 : tm_subset FVs1 FVs
H6 : tm_subset Vs2 FVs
============================
tm_subset (scons X FVs1) (scons X FVs) /\ tm_subset Vs2 (scons X FVs)
combine_subset < split.
Subgoal 3.1:
Variables: Vs2 FVs FVs1 X
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H3 : {combine FVs1 Vs2 FVs}*
H4 : is_tm_list FVs
H5 : tm_subset FVs1 FVs
H6 : tm_subset Vs2 FVs
============================
tm_subset (scons X FVs1) (scons X FVs)
Subgoal 3.2 is:
tm_subset Vs2 (scons X FVs)
combine_subset < backchain tm_subset_extend.
Subgoal 3.2:
Variables: Vs2 FVs FVs1 X
IH : forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs}* ->
tm_subset Vs1 Vs /\ tm_subset Vs2 Vs
H3 : {combine FVs1 Vs2 FVs}*
H4 : is_tm_list FVs
H5 : tm_subset FVs1 FVs
H6 : tm_subset Vs2 FVs
============================
tm_subset Vs2 (scons X FVs)
combine_subset < backchain tm_subset_add.
Proof completed.
Abella < Theorem combine_sub1 :
forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs} -> tm_subset Vs1 Vs.
============================
forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs} -> tm_subset Vs1 Vs
combine_sub1 < intros.
Variables: Vs1 Vs2 Vs
H1 : is_tm_list Vs
H2 : {combine Vs1 Vs2 Vs}
============================
tm_subset Vs1 Vs
combine_sub1 < apply combine_subset to _ H2.
Variables: Vs1 Vs2 Vs
H1 : is_tm_list Vs
H2 : {combine Vs1 Vs2 Vs}
H3 : tm_subset Vs1 Vs
H4 : tm_subset Vs2 Vs
============================
tm_subset Vs1 Vs
combine_sub1 < search.
Proof completed.
Abella < Theorem combine_sub2 :
forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs} -> tm_subset Vs2 Vs.
============================
forall Vs1 Vs2 Vs, is_tm_list Vs -> {combine Vs1 Vs2 Vs} -> tm_subset Vs2 Vs
combine_sub2 < intros.
Variables: Vs1 Vs2 Vs
H1 : is_tm_list Vs
H2 : {combine Vs1 Vs2 Vs}
============================
tm_subset Vs2 Vs
combine_sub2 < apply combine_subset to _ H2.
Variables: Vs1 Vs2 Vs
H1 : is_tm_list Vs
H2 : {combine Vs1 Vs2 Vs}
H3 : tm_subset Vs1 Vs
H4 : tm_subset Vs2 Vs
============================
tm_subset Vs2 Vs
combine_sub2 < search.
Proof completed.
Abella < Kind smap type.
Abella < Kind smap_list type.
Abella < Type smap tm -> tm -> smap.
Abella < Type smnil smap_list.
Abella < Type smcons smap -> smap_list -> smap_list.
Abella < Define smmember : smap -> smap_list -> prop by
smmember X (smcons X L);
smmember X (smcons Y L) := smmember X L.
Abella < Kind cmap type.
Abella < Kind cmap_list type.
Abella < Type cmap tm' -> tm' -> cmap.
Abella < Type cmnil cmap_list.
Abella < Type cmcons cmap -> cmap_list -> cmap_list.
Abella < Define cmmember : cmap -> cmap_list -> prop by
cmmember X (cmcons X L);
cmmember X (cmcons Y L) := cmmember X L.
Abella < Theorem smmember_prune_tm :
forall M L, nabla x, smmember (M x) L -> (exists M', M = y\M').
============================
forall M L, nabla x, smmember (M x) L -> (exists M', M = y\M')
smmember_prune_tm < induction on 1.
IH : forall M L, nabla x, smmember (M x) L * -> (exists M', M = y\M')
============================
forall M L, nabla x, smmember (M x) L @ -> (exists M', M = y\M')
smmember_prune_tm < intros.
Variables: M L
IH : forall M L, nabla x, smmember (M x) L * -> (exists M', M = y\M')
H1 : smmember (M n1) L @
============================
exists M', M = y\M'
smmember_prune_tm < case H1.
Subgoal 1:
Variables: L3 L2
IH : forall M L, nabla x, smmember (M x) L * -> (exists M', M = y\M')
============================
exists M', z1\L2 = y\M'
Subgoal 2 is:
exists M', M = y\M'
smmember_prune_tm < search.
Subgoal 2:
Variables: M L3 L2
IH : forall M L, nabla x, smmember (M x) L * -> (exists M', M = y\M')
H2 : smmember (M n1) L3 *
============================
exists M', M = y\M'
smmember_prune_tm < apply IH to H2.
Subgoal 2:
Variables: L3 L2 M'
IH : forall M L, nabla x, smmember (M x) L * -> (exists M', M = y\M')
H2 : smmember M' L3 *
============================
exists M'1, z1\M' = y\M'1
smmember_prune_tm < search.
Proof completed.
Abella < Theorem cmmember_prune_tm' :
forall M L, nabla x, cmmember (M x) L -> (exists M', M = y\M').
============================
forall M L, nabla x, cmmember (M x) L -> (exists M', M = y\M')
cmmember_prune_tm' < induction on 1.
IH : forall M L, nabla x, cmmember (M x) L * -> (exists M', M = y\M')
============================
forall M L, nabla x, cmmember (M x) L @ -> (exists M', M = y\M')
cmmember_prune_tm' < intros.
Variables: M L
IH : forall M L, nabla x, cmmember (M x) L * -> (exists M', M = y\M')
H1 : cmmember (M n1) L @
============================
exists M', M = y\M'
cmmember_prune_tm' < case H1.
Subgoal 1:
Variables: L3 L2
IH : forall M L, nabla x, cmmember (M x) L * -> (exists M', M = y\M')
============================
exists M', z1\L2 = y\M'
Subgoal 2 is:
exists M', M = y\M'
cmmember_prune_tm' < search.
Subgoal 2:
Variables: M L3 L2
IH : forall M L, nabla x, cmmember (M x) L * -> (exists M', M = y\M')
H2 : cmmember (M n1) L3 *
============================
exists M', M = y\M'
cmmember_prune_tm' < apply IH to H2.
Subgoal 2:
Variables: L3 L2 M'
IH : forall M L, nabla x, cmmember (M x) L * -> (exists M', M = y\M')
H2 : cmmember M' L3 *
============================
exists M'1, z1\M' = y\M'1
cmmember_prune_tm' < search.
Proof completed.
Abella < Theorem crev_det :
forall L1 L2 L3 L3', {crev L1 L2 L3} -> {crev L1 L2 L3'} -> L3 = L3'.
============================
forall L1 L2 L3 L3', {crev L1 L2 L3} -> {crev L1 L2 L3'} -> L3 = L3'
crev_det < induction on 1.
IH : forall L1 L2 L3 L3', {crev L1 L2 L3}* -> {crev L1 L2 L3'} -> L3 = L3'
============================
forall L1 L2 L3 L3', {crev L1 L2 L3}@ -> {crev L1 L2 L3'} -> L3 = L3'
crev_det < intros.
Variables: L1 L2 L3 L3'
IH : forall L1 L2 L3 L3', {crev L1 L2 L3}* -> {crev L1 L2 L3'} -> L3 = L3'
H1 : {crev L1 L2 L3}@
H2 : {crev L1 L2 L3'}
============================
L3 = L3'
crev_det < case H1.
Subgoal 1:
Variables: L3 L3'
IH : forall L1 L2 L3 L3', {crev L1 L2 L3}* -> {crev L1 L2 L3'} -> L3 = L3'
H2 : {crev cnil L3 L3'}
============================
L3 = L3'
Subgoal 2 is:
L3 = L3'
crev_det < case H2.
Subgoal 1:
Variables: L3'
IH : forall L1 L2 L3 L3', {crev L1 L2 L3}* -> {crev L1 L2 L3'} -> L3 = L3'
============================
L3' = L3'
Subgoal 2 is:
L3 = L3'
crev_det < search.
Subgoal 2:
Variables: L2 L3 L3' X L5
IH : forall L1 L2 L3 L3', {crev L1 L2 L3}* -> {crev L1 L2 L3'} -> L3 = L3'
H2 : {crev (ccons X L5) L2 L3'}
H3 : {crev L5 (ccons X L2) L3}*
============================
L3 = L3'
crev_det < case H2.
Subgoal 2:
Variables: L2 L3 L3' X L5
IH : forall L1 L2 L3 L3', {crev L1 L2 L3}* -> {crev L1 L2 L3'} -> L3 = L3'
H3 : {crev L5 (ccons X L2) L3}*
H4 : {crev L5 (ccons X L2) L3'}
============================
L3 = L3'
crev_det < apply IH to H3 H4.
Subgoal 2:
Variables: L2 L3' X L5
IH : forall L1 L2 L3 L3', {crev L1 L2 L3}* -> {crev L1 L2 L3'} -> L3 = L3'
H3 : {crev L5 (ccons X L2) L3'}*
H4 : {crev L5 (ccons X L2) L3'}
============================
L3' = L3'
crev_det < search.
Proof completed.
Abella < Theorem crev_prune :
forall L1 L2 L3, nabla x, {crev L1 L2 (L3 x)} -> (exists L3', L3 = x\L3').
============================
forall L1 L2 L3, nabla x, {crev L1 L2 (L3 x)} -> (exists L3', L3 = x\L3')
crev_prune < induction on 1.
IH : forall L1 L2 L3, nabla x, {crev L1 L2 (L3 x)}* ->
(exists L3', L3 = x\L3')
============================
forall L1 L2 L3, nabla x, {crev L1 L2 (L3 x)}@ -> (exists L3', L3 = x\L3')
crev_prune < intros.
Variables: L1 L2 L3
IH : forall L1 L2 L3, nabla x, {crev L1 L2 (L3 x)}* ->
(exists L3', L3 = x\L3')
H1 : {crev L1 L2 (L3 n1)}@
============================
exists L3', L3 = x\L3'
crev_prune < case H1.
Subgoal 1:
Variables: L2
IH : forall L1 L2 L3, nabla x, {crev L1 L2 (L3 x)}* ->
(exists L3', L3 = x\L3')
============================
exists L3', z1\L2 = x\L3'
Subgoal 2 is:
exists L3', L3 = x\L3'
crev_prune < search.
Subgoal 2:
Variables: L2 L3 L6 L7
IH : forall L1 L2 L3, nabla x, {crev L1 L2 (L3 x)}* ->
(exists L3', L3 = x\L3')
H2 : {crev L7 (ccons L6 L2) (L3 n1)}*
============================
exists L3', L3 = x\L3'
crev_prune < apply IH to H2.
Subgoal 2:
Variables: L2 L6 L7 L3'
IH : forall L1 L2 L3, nabla x, {crev L1 L2 (L3 x)}* ->
(exists L3', L3 = x\L3')
H2 : {crev L7 (ccons L6 L2) L3'}*
============================
exists L3'1, z1\L3' = x\L3'1
crev_prune < search.
Proof completed.
Abella < Theorem tm'_list_to_tuple_det :
forall FE E E', {tm'_list_to_tuple FE E} -> {tm'_list_to_tuple FE E'} -> E =
E'.
============================
forall FE E E', {tm'_list_to_tuple FE E} -> {tm'_list_to_tuple FE E'} -> E =
E'
tm'_list_to_tuple_det < induction on 1.
IH : forall FE E E', {tm'_list_to_tuple FE E}* ->
{tm'_list_to_tuple FE E'} -> E =
E'
============================
forall FE E E', {tm'_list_to_tuple FE E}@ -> {tm'_list_to_tuple FE E'} ->
E =
E'
tm'_list_to_tuple_det < intros.
Variables: FE E E'
IH : forall FE E E', {tm'_list_to_tuple FE E}* ->
{tm'_list_to_tuple FE E'} -> E =
E'
H1 : {tm'_list_to_tuple FE E}@
H2 : {tm'_list_to_tuple FE E'}
============================
E = E'
tm'_list_to_tuple_det < case H1.
Subgoal 1:
Variables: E'
IH : forall FE E E', {tm'_list_to_tuple FE E}* ->
{tm'_list_to_tuple FE E'} -> E =
E'
H2 : {tm'_list_to_tuple cnil E'}
============================
unit' = E'
Subgoal 2 is:
pair' M ML' = E'
tm'_list_to_tuple_det < case H2.
Subgoal 1:
IH : forall FE E E', {tm'_list_to_tuple FE E}* ->
{tm'_list_to_tuple FE E'} -> E =
E'
============================
unit' = unit'
Subgoal 2 is:
pair' M ML' = E'
tm'_list_to_tuple_det < search.
Subgoal 2:
Variables: E' ML' ML M
IH : forall FE E E', {tm'_list_to_tuple FE E}* ->
{tm'_list_to_tuple FE E'} -> E =
E'
H2 : {tm'_list_to_tuple (ccons M ML) E'}
H3 : {tm'_list_to_tuple ML ML'}*
============================
pair' M ML' = E'
tm'_list_to_tuple_det < case H2.
Subgoal 2:
Variables: ML' ML M ML'1
IH : forall FE E E', {tm'_list_to_tuple FE E}* ->
{tm'_list_to_tuple FE E'} -> E =
E'
H3 : {tm'_list_to_tuple ML ML'}*
H4 : {tm'_list_to_tuple ML ML'1}
============================
pair' M ML' = pair' M ML'1
tm'_list_to_tuple_det < apply IH to H3 H4.
Subgoal 2:
Variables: ML M ML'1
IH : forall FE E E', {tm'_list_to_tuple FE E}* ->
{tm'_list_to_tuple FE E'} -> E =
E'
H3 : {tm'_list_to_tuple ML ML'1}*
H4 : {tm'_list_to_tuple ML ML'1}
============================
pair' M ML'1 = pair' M ML'1
tm'_list_to_tuple_det < search.
Proof completed.
Abella < Theorem tm'_list_to_tuple_exists :
forall L, is_tm'_list L -> (exists E, {tm'_list_to_tuple L E}).
============================
forall L, is_tm'_list L -> (exists E, {tm'_list_to_tuple L E})
tm'_list_to_tuple_exists < induction on 1.
IH : forall L, is_tm'_list L * -> (exists E, {tm'_list_to_tuple L E})
============================
forall L, is_tm'_list L @ -> (exists E, {tm'_list_to_tuple L E})
tm'_list_to_tuple_exists < intros.
Variables: L
IH : forall L, is_tm'_list L * -> (exists E, {tm'_list_to_tuple L E})
H1 : is_tm'_list L @
============================
exists E, {tm'_list_to_tuple L E}
tm'_list_to_tuple_exists < case H1.
Subgoal 1:
IH : forall L, is_tm'_list L * -> (exists E, {tm'_list_to_tuple L E})
============================
exists E, {tm'_list_to_tuple cnil E}
Subgoal 2 is:
exists E, {tm'_list_to_tuple (ccons X L1) E}
tm'_list_to_tuple_exists < search.
Subgoal 2:
Variables: L1 X
IH : forall L, is_tm'_list L * -> (exists E, {tm'_list_to_tuple L E})
H2 : is_tm'_list L1 *
============================
exists E, {tm'_list_to_tuple (ccons X L1) E}
tm'_list_to_tuple_exists < apply IH to H2.
Subgoal 2:
Variables: L1 X E
IH : forall L, is_tm'_list L * -> (exists E, {tm'_list_to_tuple L E})
H2 : is_tm'_list L1 *
H3 : {tm'_list_to_tuple L1 E}
============================
exists E, {tm'_list_to_tuple (ccons X L1) E}
tm'_list_to_tuple_exists < search.
Proof completed.
Abella < Theorem tm'_list_to_tuple_prune :
forall L E, nabla x, {tm'_list_to_tuple L (E x)} -> (exists E', E = y\E').
============================
forall L E, nabla x, {tm'_list_to_tuple L (E x)} -> (exists E', E = y\E')
tm'_list_to_tuple_prune < induction on 1.
IH : forall L E, nabla x, {tm'_list_to_tuple L (E x)}* ->
(exists E', E = y\E')
============================
forall L E, nabla x, {tm'_list_to_tuple L (E x)}@ -> (exists E', E = y\E')
tm'_list_to_tuple_prune < intros.
Variables: L E
IH : forall L E, nabla x, {tm'_list_to_tuple L (E x)}* ->
(exists E', E = y\E')
H1 : {tm'_list_to_tuple L (E n1)}@
============================
exists E', E = y\E'
tm'_list_to_tuple_prune < case H1.
Subgoal 1:
IH : forall L E, nabla x, {tm'_list_to_tuple L (E x)}* ->
(exists E', E = y\E')
============================
exists E', z1\unit' = y\E'
Subgoal 2 is:
exists E', z1\pair' L1 (ML' z1) = y\E'
tm'_list_to_tuple_prune < search.
Subgoal 2:
Variables: ML' L2 L1
IH : forall L E, nabla x, {tm'_list_to_tuple L (E x)}* ->
(exists E', E = y\E')
H2 : {tm'_list_to_tuple L2 (ML' n1)}*
============================
exists E', z1\pair' L1 (ML' z1) = y\E'
tm'_list_to_tuple_prune < apply IH to H2.
Subgoal 2:
Variables: L2 L1 E'
IH : forall L E, nabla x, {tm'_list_to_tuple L (E x)}* ->
(exists E', E = y\E')
H2 : {tm'_list_to_tuple L2 E'}*
============================
exists E'1, z1\pair' L1 E' = y\E'1
tm'_list_to_tuple_prune < search.
Proof completed.
Abella <