< Module nonExtensible:lists.
< Theorem perm_mem [Item] :
forall (L : list Item) (M : list Item) I, perm L M -> mem I L -> mem I M.
============================
forall L M I, perm L M -> mem I L -> mem I M
< induction on 2.
IH : forall L M I, perm L M -> mem I L * -> mem I M
============================
forall L M I, perm L M -> mem I L @ -> mem I M
< intros P M.
Variables: L M I
IH : forall L M I, perm L M -> mem I L * -> mem I M
P : perm L M
M : mem I L @
============================
mem I M
< M: case M.
Subgoal 1:
Variables: M I Rest
IH : forall L M I, perm L M -> mem I L * -> mem I M
P : perm (I::Rest) M
============================
mem I M
< P: case P.
Subgoal 1:
Variables: M I Rest L2
IH : forall L M I, perm L M -> mem I L * -> mem I M
P : select I L2 M
P1 : perm Rest L2
============================
mem I M
< apply select_mem to P.
Subgoal 1:
Variables: M I Rest L2
IH : forall L M I, perm L M -> mem I L * -> mem I M
P : select I L2 M
P1 : perm Rest L2
H1 : mem I M
============================
mem I M
< search.
Subgoal 2:
Variables: M I Rest I1
IH : forall L M I, perm L M -> mem I L * -> mem I M
P : perm (I1::Rest) M
M : mem I Rest *
============================
mem I M
< P: case P.
Subgoal 2:
Variables: M I Rest I1 L2
IH : forall L M I, perm L M -> mem I L * -> mem I M
M : mem I Rest *
P : select I1 L2 M
P1 : perm Rest L2
============================
mem I M
< M': apply IH to P1 M.
Subgoal 2:
Variables: M I Rest I1 L2
IH : forall L M I, perm L M -> mem I L * -> mem I M
M : mem I Rest *
P : select I1 L2 M
P1 : perm Rest L2
M' : mem I L2
============================
mem I M
< apply mem_after_select_before to _ M'.
Subgoal 2:
Variables: M I Rest I1 L2
IH : forall L M I, perm L M -> mem I L * -> mem I M
M : mem I Rest *
P : select I1 L2 M
P1 : perm Rest L2
M' : mem I L2
H1 : mem I M
============================
mem I M
< search.
Proof completed.
< Theorem prm_lemma [Item] :
forall A B B' (X : Item), perm B' A -> select X B' B -> perm B (X::A).
============================
forall A B B' X, perm B' A -> select X B' B -> perm B (X::A)
< induction on 2.
IH : forall A B B' X, perm B' A -> select X B' B * -> perm B (X::A)
============================
forall A B B' X, perm B' A -> select X B' B @ -> perm B (X::A)
< intros P S.
Variables: A B B' X
IH : forall A B B' X, perm B' A -> select X B' B * -> perm B (X::A)
P : perm B' A
S : select X B' B @
============================
perm B (X::A)
< S: case S.
Subgoal 1:
Variables: A B' X
IH : forall A B B' X, perm B' A -> select X B' B * -> perm B (X::A)
P : perm B' A
============================
perm (X::B') (X::A)
< search.
Subgoal 2:
Variables: A X L2 I L1
IH : forall A B B' X, perm B' A -> select X B' B * -> perm B (X::A)
P : perm (I::L1) A
S : select X L1 L2 *
============================
perm (I::L2) (X::A)
< P: case P.
Subgoal 2:
Variables: A X L2 I L1 L3
IH : forall A B B' X, perm B' A -> select X B' B * -> perm B (X::A)
S : select X L1 L2 *
P : select I L3 A
P1 : perm L1 L3
============================
perm (I::L2) (X::A)
< apply IH to P1 S.
Subgoal 2:
Variables: A X L2 I L1 L3
IH : forall A B B' X, perm B' A -> select X B' B * -> perm B (X::A)
S : select X L1 L2 *
P : select I L3 A
P1 : perm L1 L3
H1 : perm L2 (X::L3)
============================
perm (I::L2) (X::A)
< search.
Proof completed.
< Theorem perm_symmetric [Item] :
forall (M : list Item) (L : list Item), perm L M -> perm M L.
============================
forall M L, perm L M -> perm M L
< induction on 1.
IH : forall M L, perm L M * -> perm M L
============================
forall M L, perm L M @ -> perm M L
< intros P.
Variables: M L
IH : forall M L, perm L M * -> perm M L
P : perm L M @
============================
perm M L
< P: case P.
Subgoal 1:
IH : forall M L, perm L M * -> perm M L
============================
perm [] []
< search.
Subgoal 2:
Variables: M L2 Rest A
IH : forall M L, perm L M * -> perm M L
P : select A L2 M
P1 : perm Rest L2 *
============================
perm M (A::Rest)
< PSub: apply IH to P1.
Subgoal 2:
Variables: M L2 Rest A
IH : forall M L, perm L M * -> perm M L
P : select A L2 M
P1 : perm Rest L2 *
PSub : perm L2 Rest
============================
perm M (A::Rest)
< apply prm_lemma to PSub P.
Subgoal 2:
Variables: M L2 Rest A
IH : forall M L, perm L M * -> perm M L
P : select A L2 M
P1 : perm Rest L2 *
PSub : perm L2 Rest
H1 : perm M (A::Rest)
============================
perm M (A::Rest)
< search.
Proof completed.
< Theorem no_lookup_perm [Key, Value] :
forall (L : list (pair Key Value)) (P : list (pair Key Value)) (Key : Key),
no_lookup L Key -> perm L P -> no_lookup P Key.
============================
forall L P Key, no_lookup L Key -> perm L P -> no_lookup P Key
< induction on 1.
IH : forall L P Key, no_lookup L Key * -> perm L P -> no_lookup P Key
============================
forall L P Key, no_lookup L Key @ -> perm L P -> no_lookup P Key
< intros NLkp P.
Variables: L P Key
IH : forall L P Key, no_lookup L Key * -> perm L P -> no_lookup P Key
NLkp : no_lookup L Key @
P : perm L P
============================
no_lookup P Key
< NLkp: case NLkp.
Subgoal 1:
Variables: P Key
IH : forall L P Key, no_lookup L Key * -> perm L P -> no_lookup P Key
P : perm [] P
============================
no_lookup P Key
< case P.
Subgoal 1:
Variables: Key
IH : forall L P Key, no_lookup L Key * -> perm L P -> no_lookup P Key
============================
no_lookup [] Key
< search.
Subgoal 2:
Variables: P Key Rest V K
IH : forall L P Key, no_lookup L Key * -> perm L P -> no_lookup P Key
P : perm ((K, V)::Rest) P
NLkp : K = Key -> false
NLkp1 : no_lookup Rest Key *
============================
no_lookup P Key
< P: case P.
Subgoal 2:
Variables: P Key Rest V K L2
IH : forall L P Key, no_lookup L Key * -> perm L P -> no_lookup P Key
NLkp : K = Key -> false
NLkp1 : no_lookup Rest Key *
P : select (K, V) L2 P
P1 : perm Rest L2
============================
no_lookup P Key
< NLkp': apply IH to NLkp1 P1.
Subgoal 2:
Variables: P Key Rest V K L2
IH : forall L P Key, no_lookup L Key * -> perm L P -> no_lookup P Key
NLkp : K = Key -> false
NLkp1 : no_lookup Rest Key *
P : select (K, V) L2 P
P1 : perm Rest L2
NLkp' : no_lookup L2 Key
============================
no_lookup P Key
< apply no_lookup_after_select_before to NLkp' P NLkp.
Subgoal 2:
Variables: P Key Rest V K L2
IH : forall L P Key, no_lookup L Key * -> perm L P -> no_lookup P Key
NLkp : K = Key -> false
NLkp1 : no_lookup Rest Key *
P : select (K, V) L2 P
P1 : perm Rest L2
NLkp' : no_lookup L2 Key
H1 : no_lookup P Key
============================
no_lookup P Key
< search.
Proof completed.
< Theorem countItem_is_integer [Item] :
forall (I : Item) L N, countItem I L N -> is_integer N.
============================
forall I L N, countItem I L N -> is_integer N
< induction on 1.
IH : forall I L N, countItem I L N * -> is_integer N
============================
forall I L N, countItem I L N @ -> is_integer N
< intros C.
Variables: I L N
IH : forall I L N, countItem I L N * -> is_integer N
C : countItem I L N @
============================
is_integer N
< C: case C.
Subgoal 1:
Variables: I
IH : forall I L N, countItem I L N * -> is_integer N
============================
is_integer 0
< search.
Subgoal 2:
Variables: I N N1 Rest
IH : forall I L N, countItem I L N * -> is_integer N
C : countItem I Rest N1 *
C1 : 1 + N1 = N
============================
is_integer N
< apply IH to C.
Subgoal 2:
Variables: I N N1 Rest
IH : forall I L N, countItem I L N * -> is_integer N
C : countItem I Rest N1 *
C1 : 1 + N1 = N
H1 : is_integer N1
============================
is_integer N
< apply plus_integer_is_integer to _ _ C1.
Subgoal 2:
Variables: I N N1 Rest
IH : forall I L N, countItem I L N * -> is_integer N
C : countItem I Rest N1 *
C1 : 1 + N1 = N
H1 : is_integer N1
H2 : is_integer N
============================
is_integer N
< search.
Subgoal 3:
Variables: I N Rest Y
IH : forall I L N, countItem I L N * -> is_integer N
C : I = Y -> false
C1 : countItem I Rest N *
============================
is_integer N
< apply IH to C1.
Subgoal 3:
Variables: I N Rest Y
IH : forall I L N, countItem I L N * -> is_integer N
C : I = Y -> false
C1 : countItem I Rest N *
H1 : is_integer N
============================
is_integer N
< search.
Proof completed.
< Theorem countItem_geq_0 [Item] :
forall (I : Item) L N, countItem I L N -> N >= 0.
============================
forall I L N, countItem I L N -> N >= 0
< induction on 1.
IH : forall I L N, countItem I L N * -> N >= 0
============================
forall I L N, countItem I L N @ -> N >= 0
< intros C.
Variables: I L N
IH : forall I L N, countItem I L N * -> N >= 0
C : countItem I L N @
============================
N >= 0
< C: case C.
Subgoal 1:
Variables: I
IH : forall I L N, countItem I L N * -> N >= 0
============================
0 >= 0
< search.
Subgoal 2:
Variables: I N N1 Rest
IH : forall I L N, countItem I L N * -> N >= 0
C : countItem I Rest N1 *
C1 : 1 + N1 = N
============================
N >= 0
< GEq: apply IH to C.
Subgoal 2:
Variables: I N N1 Rest
IH : forall I L N, countItem I L N * -> N >= 0
C : countItem I Rest N1 *
C1 : 1 + N1 = N
GEq : N1 >= 0
============================
N >= 0
< apply greatereq_integer__add_positive to _ GEq C1.
Subgoal 2:
Variables: I N N1 Rest
IH : forall I L N, countItem I L N * -> N >= 0
C : countItem I Rest N1 *
C1 : 1 + N1 = N
GEq : N1 >= 0
H1 : N >= 0
============================
N >= 0
< search.
Subgoal 3:
Variables: I N Rest Y
IH : forall I L N, countItem I L N * -> N >= 0
C : I = Y -> false
C1 : countItem I Rest N *
============================
N >= 0
< apply IH to C1.
Subgoal 3:
Variables: I N Rest Y
IH : forall I L N, countItem I L N * -> N >= 0
C : I = Y -> false
C1 : countItem I Rest N *
H1 : N >= 0
============================
N >= 0
< search.
Proof completed.
< Theorem select_countItem [Item] :
forall (I : Item) L Rest N N',
countItem I L N -> select I Rest L -> N - 1 = N' -> countItem I Rest N'.
============================
forall I L Rest N N',
countItem I L N -> select I Rest L -> N - 1 = N' -> countItem I Rest N'
< induction on 2.
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
============================
forall I L Rest N N',
countItem I L N -> select I Rest L @ -> N - 1 = N' -> countItem I Rest N'
< intros C S Minus.
Variables: I L Rest N N'
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
C : countItem I L N
S : select I Rest L @
Minus : N - 1 = N'
============================
countItem I Rest N'
< S: case S.
Subgoal 1:
Variables: I Rest N N'
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
C : countItem I (I::Rest) N
Minus : N - 1 = N'
============================
countItem I Rest N'
< IsN: apply countItem_is_integer to C.
Subgoal 1:
Variables: I Rest N N'
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
C : countItem I (I::Rest) N
Minus : N - 1 = N'
IsN : is_integer N
============================
countItem I Rest N'
< C: case C.
Subgoal 1.1:
Variables: I Rest N N' N1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
IsN : is_integer N
C : countItem I Rest N1
C1 : 1 + N1 = N
============================
countItem I Rest N'
< IsN1: apply countItem_is_integer to C.
Subgoal 1.1:
Variables: I Rest N N' N1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
IsN : is_integer N
C : countItem I Rest N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
============================
countItem I Rest N'
< P: apply plus_integer_comm to _ _ C1.
Subgoal 1.1:
Variables: I Rest N N' N1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
IsN : is_integer N
C : countItem I Rest N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
============================
countItem I Rest N'
< M2: apply plus_minus_same_integer to _ _ P.
Subgoal 1.1:
Variables: I Rest N N' N1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
IsN : is_integer N
C : countItem I Rest N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
M2 : N - 1 = N1
============================
countItem I Rest N'
< apply minus_integer_unique to Minus M2.
Subgoal 1.1:
Variables: I Rest N N1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N1
IsN : is_integer N
C : countItem I Rest N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
M2 : N - 1 = N1
============================
countItem I Rest N1
< search.
Subgoal 1.2:
Variables: I Rest N N'
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
IsN : is_integer N
C : I = I -> false
C1 : countItem I Rest N
============================
countItem I Rest N'
< apply C to _.
Subgoal 2:
Variables: I N N' L2 I1 L1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
C : countItem I (I1::L2) N
Minus : N - 1 = N'
S : select I L1 L2 *
============================
countItem I (I1::L1) N'
< IsN: apply countItem_is_integer to C.
Subgoal 2:
Variables: I N N' L2 I1 L1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
C : countItem I (I1::L2) N
Minus : N - 1 = N'
S : select I L1 L2 *
IsN : is_integer N
============================
countItem I (I1::L1) N'
< C: case C.
Subgoal 2.1:
Variables: N N' L2 I1 L1 N1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
S : select I1 L1 L2 *
IsN : is_integer N
C : countItem I1 L2 N1
C1 : 1 + N1 = N
============================
countItem I1 (I1::L1) N'
< IsN1: apply countItem_is_integer to C.
Subgoal 2.1:
Variables: N N' L2 I1 L1 N1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
S : select I1 L1 L2 *
IsN : is_integer N
C : countItem I1 L2 N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
============================
countItem I1 (I1::L1) N'
< P: apply plus_integer_comm to _ _ C1.
Subgoal 2.1:
Variables: N N' L2 I1 L1 N1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
S : select I1 L1 L2 *
IsN : is_integer N
C : countItem I1 L2 N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
============================
countItem I1 (I1::L1) N'
< M2: apply plus_minus_same_integer to _ _ P.
Subgoal 2.1:
Variables: N N' L2 I1 L1 N1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
S : select I1 L1 L2 *
IsN : is_integer N
C : countItem I1 L2 N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
M2 : N - 1 = N1
============================
countItem I1 (I1::L1) N'
< apply minus_integer_unique to Minus M2.
Subgoal 2.1:
Variables: N L2 I1 L1 N1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N1
S : select I1 L1 L2 *
IsN : is_integer N
C : countItem I1 L2 N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
M2 : N - 1 = N1
============================
countItem I1 (I1::L1) N1
< Sub: apply minus_integer_total to IsN1 _ with
N2 = 1.
Subgoal 2.1:
Variables: N L2 I1 L1 N1 N3
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N1
S : select I1 L1 L2 *
IsN : is_integer N
C : countItem I1 L2 N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
M2 : N - 1 = N1
Sub : N1 - 1 = N3
============================
countItem I1 (I1::L1) N1
< C': apply IH to C S Sub.
Subgoal 2.1:
Variables: N L2 I1 L1 N1 N3
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N1
S : select I1 L1 L2 *
IsN : is_integer N
C : countItem I1 L2 N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
M2 : N - 1 = N1
Sub : N1 - 1 = N3
C' : countItem I1 L1 N3
============================
countItem I1 (I1::L1) N1
< P': apply minus_plus_same_integer to _ _ Sub.
Subgoal 2.1:
Variables: N L2 I1 L1 N1 N3
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N1
S : select I1 L1 L2 *
IsN : is_integer N
C : countItem I1 L2 N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
M2 : N - 1 = N1
Sub : N1 - 1 = N3
C' : countItem I1 L1 N3
P' : N3 + 1 = N1
============================
countItem I1 (I1::L1) N1
< apply countItem_is_integer to C'.
Subgoal 2.1:
Variables: N L2 I1 L1 N1 N3
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N1
S : select I1 L1 L2 *
IsN : is_integer N
C : countItem I1 L2 N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
M2 : N - 1 = N1
Sub : N1 - 1 = N3
C' : countItem I1 L1 N3
P' : N3 + 1 = N1
H1 : is_integer N3
============================
countItem I1 (I1::L1) N1
< apply plus_integer_comm to _ _ P'.
Subgoal 2.1:
Variables: N L2 I1 L1 N1 N3
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N1
S : select I1 L1 L2 *
IsN : is_integer N
C : countItem I1 L2 N1
C1 : 1 + N1 = N
IsN1 : is_integer N1
P : N1 + 1 = N
M2 : N - 1 = N1
Sub : N1 - 1 = N3
C' : countItem I1 L1 N3
P' : N3 + 1 = N1
H1 : is_integer N3
H2 : 1 + N3 = N1
============================
countItem I1 (I1::L1) N1
< search.
Subgoal 2.2:
Variables: I N N' L2 I1 L1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
S : select I L1 L2 *
IsN : is_integer N
C : I = I1 -> false
C1 : countItem I L2 N
============================
countItem I (I1::L1) N'
< apply IH to C1 S _.
Subgoal 2.2:
Variables: I N N' L2 I1 L1
IH : forall I L Rest N N',
countItem I L N -> select I Rest L * -> N - 1 = N' -> countItem I Rest N'
Minus : N - 1 = N'
S : select I L1 L2 *
IsN : is_integer N
C : I = I1 -> false
C1 : countItem I L2 N
H1 : countItem I L1 N'
============================
countItem I (I1::L1) N'
< search.
Proof completed.
< Theorem countItem_select [Item] :
forall (I : Item) L Rest N' N,
countItem I Rest N' -> select I Rest L -> 1 + N' = N -> countItem I L N.
============================
forall I L Rest N' N,
countItem I Rest N' -> select I Rest L -> 1 + N' = N -> countItem I L N
< induction on 2.
IH : forall I L Rest N' N,
countItem I Rest N' -> select I Rest L * -> 1 + N' = N -> countItem I L N
============================
forall I L Rest N' N,
countItem I Rest N' -> select I Rest L @ -> 1 + N' = N -> countItem I L N
< intros C S P.
Variables: I L Rest N' N
IH : forall I L Rest N' N,
countItem I Rest N' -> select I Rest L * -> 1 + N' = N -> countItem I L N
C : countItem I Rest N'
S : select I Rest L @
P : 1 + N' = N
============================
countItem I L N
< S: case S.
Subgoal 1:
Variables: I Rest N' N
IH : forall I L Rest N' N,
countItem I Rest N' -> select I Rest L * -> 1 + N' = N -> countItem I L N
C : countItem I Rest N'
P : 1 + N' = N
============================
countItem I (I::Rest) N
< search.
Subgoal 2:
Variables: I N' N L2 I1 L1
IH : forall I L Rest N' N,
countItem I Rest N' -> select I Rest L * -> 1 + N' = N -> countItem I L N
C : countItem I (I1::L1) N'
P : 1 + N' = N
S : select I L1 L2 *
============================
countItem I (I1::L2) N
< C: case C.
Subgoal 2.1:
Variables: N' N L2 I1 L1 N1
IH : forall I L Rest N' N,
countItem I Rest N' -> select I Rest L * -> 1 + N' = N -> countItem I L N
P : 1 + N' = N
S : select I1 L1 L2 *
C : countItem I1 L1 N1
C1 : 1 + N1 = N'
============================
countItem I1 (I1::L2) N
< apply IH to C S _.
Subgoal 2.1:
Variables: N' N L2 I1 L1 N1
IH : forall I L Rest N' N,
countItem I Rest N' -> select I Rest L * -> 1 + N' = N -> countItem I L N
P : 1 + N' = N
S : select I1 L1 L2 *
C : countItem I1 L1 N1
C1 : 1 + N1 = N'
H1 : countItem I1 L2 N'
============================
countItem I1 (I1::L2) N
< search.
Subgoal 2.2:
Variables: I N' N L2 I1 L1
IH : forall I L Rest N' N,
countItem I Rest N' -> select I Rest L * -> 1 + N' = N -> countItem I L N
P : 1 + N' = N
S : select I L1 L2 *
C : I = I1 -> false
C1 : countItem I L1 N'
============================
countItem I (I1::L2) N
< apply IH to C1 S _.
Subgoal 2.2:
Variables: I N' N L2 I1 L1
IH : forall I L Rest N' N,
countItem I Rest N' -> select I Rest L * -> 1 + N' = N -> countItem I L N
P : 1 + N' = N
S : select I L1 L2 *
C : I = I1 -> false
C1 : countItem I L1 N'
H1 : countItem I L2 N
============================
countItem I (I1::L2) N
< search.
Proof completed.
< Theorem select_countItem_neq [Item] :
forall (I : Item) (J : Item) L Rest N,
countItem I L N -> select J Rest L -> (I = J -> false) -> countItem I Rest N.
============================
forall I J L Rest N,
countItem I L N -> select J Rest L -> (I = J -> false) -> countItem I Rest N
< induction on 2.
IH : forall I J L Rest N,
countItem I L N -> select J Rest L * -> (I = J -> false) -> countItem I Rest N
============================
forall I J L Rest N,
countItem I L N -> select J Rest L @ -> (I = J -> false) -> countItem I Rest N
< intros C S NEq.
Variables: I J L Rest N
IH : forall I J L Rest N,
countItem I L N -> select J Rest L * -> (I = J -> false) -> countItem I Rest N
C : countItem I L N
S : select J Rest L @
NEq : I = J -> false
============================
countItem I Rest N
< S: case S.
Subgoal 1:
Variables: I J Rest N
IH : forall I J L Rest N,
countItem I L N -> select J Rest L * -> (I = J -> false) -> countItem I Rest N
C : countItem I (J::Rest) N
NEq : I = J -> false
============================
countItem I Rest N
< C: case C.
Subgoal 1.1:
Variables: J Rest N N1
IH : forall I J L Rest N,
countItem I L N -> select J Rest L * -> (I = J -> false) -> countItem I Rest N
NEq : J = J -> false
C : countItem J Rest N1
C1 : 1 + N1 = N
============================
countItem J Rest N
< apply NEq to _.
Subgoal 1.2:
Variables: I J Rest N
IH : forall I J L Rest N,
countItem I L N -> select J Rest L * -> (I = J -> false) -> countItem I Rest N
NEq : I = J -> false
C : I = J -> false
C1 : countItem I Rest N
============================
countItem I Rest N
< search.
Subgoal 2:
Variables: I J N L2 I1 L1
IH : forall I J L Rest N,
countItem I L N -> select J Rest L * -> (I = J -> false) -> countItem I Rest N
C : countItem I (I1::L2) N
NEq : I = J -> false
S : select J L1 L2 *
============================
countItem I (I1::L1) N
< C: case C.
Subgoal 2.1:
Variables: J N L2 I1 L1 N1
IH : forall I J L Rest N,
countItem I L N -> select J Rest L * -> (I = J -> false) -> countItem I Rest N
NEq : I1 = J -> false
S : select J L1 L2 *
C : countItem I1 L2 N1
C1 : 1 + N1 = N
============================
countItem I1 (I1::L1) N
< apply IH to C S _.
Subgoal 2.1:
Variables: J N L2 I1 L1 N1
IH : forall I J L Rest N,
countItem I L N -> select J Rest L * -> (I = J -> false) -> countItem I Rest N
NEq : I1 = J -> false
S : select J L1 L2 *
C : countItem I1 L2 N1
C1 : 1 + N1 = N
H1 : countItem I1 L1 N1
============================
countItem I1 (I1::L1) N
< search.
Subgoal 2.2:
Variables: I J N L2 I1 L1
IH : forall I J L Rest N,
countItem I L N -> select J Rest L * -> (I = J -> false) -> countItem I Rest N
NEq : I = J -> false
S : select J L1 L2 *
C : I = I1 -> false
C1 : countItem I L2 N
============================
countItem I (I1::L1) N
< apply IH to C1 S _.
Subgoal 2.2:
Variables: I J N L2 I1 L1
IH : forall I J L Rest N,
countItem I L N -> select J Rest L * -> (I = J -> false) -> countItem I Rest N
NEq : I = J -> false
S : select J L1 L2 *
C : I = I1 -> false
C1 : countItem I L2 N
H1 : countItem I L1 N
============================
countItem I (I1::L1) N
< search.
Proof completed.
< Theorem countItem_select_neq [Item] :
forall (I : Item) (J : Item) L Rest N,
countItem I Rest N -> select J Rest L -> (I = J -> false) -> countItem I L N.
============================
forall I J L Rest N,
countItem I Rest N -> select J Rest L -> (I = J -> false) -> countItem I L N
< induction on 2.
IH : forall I J L Rest N,
countItem I Rest N -> select J Rest L * -> (I = J -> false) -> countItem I L N
============================
forall I J L Rest N,
countItem I Rest N -> select J Rest L @ -> (I = J -> false) -> countItem I L N
< intros C S NEq.
Variables: I J L Rest N
IH : forall I J L Rest N,
countItem I Rest N -> select J Rest L * -> (I = J -> false) -> countItem I L N
C : countItem I Rest N
S : select J Rest L @
NEq : I = J -> false
============================
countItem I L N
< S: case S.
Subgoal 1:
Variables: I J Rest N
IH : forall I J L Rest N,
countItem I Rest N -> select J Rest L * -> (I = J -> false) -> countItem I L N
C : countItem I Rest N
NEq : I = J -> false
============================
countItem I (J::Rest) N
< search.
Subgoal 2:
Variables: I J N L2 I1 L1
IH : forall I J L Rest N,
countItem I Rest N -> select J Rest L * -> (I = J -> false) -> countItem I L N
C : countItem I (I1::L1) N
NEq : I = J -> false
S : select J L1 L2 *
============================
countItem I (I1::L2) N
< C: case C.
Subgoal 2.1:
Variables: J N L2 I1 L1 N1
IH : forall I J L Rest N,
countItem I Rest N -> select J Rest L * -> (I = J -> false) -> countItem I L N
NEq : I1 = J -> false
S : select J L1 L2 *
C : countItem I1 L1 N1
C1 : 1 + N1 = N
============================
countItem I1 (I1::L2) N
< apply IH to C S _.
Subgoal 2.1:
Variables: J N L2 I1 L1 N1
IH : forall I J L Rest N,
countItem I Rest N -> select J Rest L * -> (I = J -> false) -> countItem I L N
NEq : I1 = J -> false
S : select J L1 L2 *
C : countItem I1 L1 N1
C1 : 1 + N1 = N
H1 : countItem I1 L2 N1
============================
countItem I1 (I1::L2) N
< search.
Subgoal 2.2:
Variables: I J N L2 I1 L1
IH : forall I J L Rest N,
countItem I Rest N -> select J Rest L * -> (I = J -> false) -> countItem I L N
NEq : I = J -> false
S : select J L1 L2 *
C : I = I1 -> false
C1 : countItem I L1 N
============================
countItem I (I1::L2) N
< apply IH to C1 S _.
Subgoal 2.2:
Variables: I J N L2 I1 L1
IH : forall I J L Rest N,
countItem I Rest N -> select J Rest L * -> (I = J -> false) -> countItem I L N
NEq : I = J -> false
S : select J L1 L2 *
C : I = I1 -> false
C1 : countItem I L1 N
H1 : countItem I L2 N
============================
countItem I (I1::L2) N
< search.
Proof completed.
< Theorem countItem_unique [Item] :
forall (I : Item) NA NB L, countItem I L NA -> countItem I L NB -> NA = NB.
============================
forall I NA NB L, countItem I L NA -> countItem I L NB -> NA = NB
< induction on 1.
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
============================
forall I NA NB L, countItem I L NA @ -> countItem I L NB -> NA = NB
< intros CA CB.
Variables: I NA NB L
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CA : countItem I L NA @
CB : countItem I L NB
============================
NA = NB
< CA: case CA.
Subgoal 1:
Variables: I NB
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CB : countItem I [] NB
============================
0 = NB
< case CB.
Subgoal 1:
Variables: I
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
============================
0 = 0
< search.
Subgoal 2:
Variables: I NA NB N Rest
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CB : countItem I (I::Rest) NB
CA : countItem I Rest N *
CA1 : 1 + N = NA
============================
NA = NB
< CB: case CB.
Subgoal 2.1:
Variables: I NA NB N Rest N1
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CA : countItem I Rest N *
CA1 : 1 + N = NA
CB : countItem I Rest N1
CB1 : 1 + N1 = NB
============================
NA = NB
< apply IH to CA CB.
Subgoal 2.1:
Variables: I NA NB Rest N1
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CA : countItem I Rest N1 *
CA1 : 1 + N1 = NA
CB : countItem I Rest N1
CB1 : 1 + N1 = NB
============================
NA = NB
< apply plus_integer_unique to CA1 CB1.
Subgoal 2.1:
Variables: I NB Rest N1
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CA : countItem I Rest N1 *
CA1 : 1 + N1 = NB
CB : countItem I Rest N1
CB1 : 1 + N1 = NB
============================
NB = NB
< search.
Subgoal 2.2:
Variables: I NA NB N Rest
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CA : countItem I Rest N *
CA1 : 1 + N = NA
CB : I = I -> false
CB1 : countItem I Rest NB
============================
NA = NB
< apply CB to _.
Subgoal 3:
Variables: I NA NB Rest Y
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CB : countItem I (Y::Rest) NB
CA : I = Y -> false
CA1 : countItem I Rest NA *
============================
NA = NB
< CB: case CB.
Subgoal 3.1:
Variables: NA NB Rest Y N
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CA : Y = Y -> false
CA1 : countItem Y Rest NA *
CB : countItem Y Rest N
CB1 : 1 + N = NB
============================
NA = NB
< apply CA to _.
Subgoal 3.2:
Variables: I NA NB Rest Y
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CA : I = Y -> false
CA1 : countItem I Rest NA *
CB : I = Y -> false
CB1 : countItem I Rest NB
============================
NA = NB
< apply IH to CA1 CB1.
Subgoal 3.2:
Variables: I NB Rest Y
IH : forall I NA NB L, countItem I L NA * -> countItem I L NB -> NA = NB
CA : I = Y -> false
CA1 : countItem I Rest NB *
CB : I = Y -> false
CB1 : countItem I Rest NB
============================
NB = NB
< search.
Proof completed.
< Theorem countItem_mem [Item] :
forall (I : Item) N L, countItem I L N -> N > 0 -> mem I L.
============================
forall I N L, countItem I L N -> N > 0 -> mem I L
< induction on 1.
IH : forall I N L, countItem I L N * -> N > 0 -> mem I L
============================
forall I N L, countItem I L N @ -> N > 0 -> mem I L
< intros C G.
Variables: I N L
IH : forall I N L, countItem I L N * -> N > 0 -> mem I L
C : countItem I L N @
G : N > 0
============================
mem I L
< C: case C.
Subgoal 1:
Variables: I
IH : forall I N L, countItem I L N * -> N > 0 -> mem I L
G : 0 > 0
============================
mem I []
< L: apply greater_integer_flip_less to G.
Subgoal 1:
Variables: I
IH : forall I N L, countItem I L N * -> N > 0 -> mem I L
G : 0 > 0
L : 0 < 0
============================
mem I []
< apply less_integer_not_eq to L.
Subgoal 2:
Variables: I N N1 Rest
IH : forall I N L, countItem I L N * -> N > 0 -> mem I L
G : N > 0
C : countItem I Rest N1 *
C1 : 1 + N1 = N
============================
mem I (I::Rest)
< search.
Subgoal 3:
Variables: I N Rest Y
IH : forall I N L, countItem I L N * -> N > 0 -> mem I L
G : N > 0
C : I = Y -> false
C1 : countItem I Rest N *
============================
mem I (Y::Rest)
< apply IH to C1 _.
Subgoal 3:
Variables: I N Rest Y
IH : forall I N L, countItem I L N * -> N > 0 -> mem I L
G : N > 0
C : I = Y -> false
C1 : countItem I Rest N *
H1 : mem I Rest
============================
mem I (Y::Rest)
< search.
Proof completed.
< Theorem countItem_not_mem [Item] :
forall (I : Item) L, countItem I L 0 -> mem I L -> false.
============================
forall I L, countItem I L 0 -> mem I L -> false
< induction on 1.
IH : forall I L, countItem I L 0 * -> mem I L -> false
============================
forall I L, countItem I L 0 @ -> mem I L -> false
< intros C Mem.
Variables: I L
IH : forall I L, countItem I L 0 * -> mem I L -> false
C : countItem I L 0 @
Mem : mem I L
============================
false
< C: case C.
Subgoal 1:
Variables: I
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I []
============================
false
< case Mem.
Subgoal 2:
Variables: I N Rest
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I (I::Rest)
C : countItem I Rest N *
C1 : 1 + N = 0
============================
false
< G: apply countItem_geq_0 to C.
Subgoal 2:
Variables: I N Rest
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I (I::Rest)
C : countItem I Rest N *
C1 : 1 + N = 0
G : N >= 0
============================
false
< IsN: apply countItem_is_integer to C.
Subgoal 2:
Variables: I N Rest
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I (I::Rest)
C : countItem I Rest N *
C1 : 1 + N = 0
G : N >= 0
IsN : is_integer N
============================
false
< P: apply plus_integer_comm to _ _ C1.
Subgoal 2:
Variables: I N Rest
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I (I::Rest)
C : countItem I Rest N *
C1 : 1 + N = 0
G : N >= 0
IsN : is_integer N
P : N + 1 = 0
============================
false
< Or: apply greatereq_integer_greater_or_eq to G.
Subgoal 2:
Variables: I N Rest
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I (I::Rest)
C : countItem I Rest N *
C1 : 1 + N = 0
G : N >= 0
IsN : is_integer N
P : N + 1 = 0
Or : N > 0 \/ N = 0
============================
false
< G': case Or.
Subgoal 2.1:
Variables: I N Rest
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I (I::Rest)
C : countItem I Rest N *
C1 : 1 + N = 0
G : N >= 0
IsN : is_integer N
P : N + 1 = 0
G' : N > 0
============================
false
< G'': apply greater_plus_positive to _ _ C1 _.
Subgoal 2.1:
Variables: I N Rest
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I (I::Rest)
C : countItem I Rest N *
C1 : 1 + N = 0
G : N >= 0
IsN : is_integer N
P : N + 1 = 0
G' : N > 0
G'' : 0 > 1
============================
false
< case G''.
Subgoal 2.1:
Variables: I N Rest
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I (I::Rest)
C : countItem I Rest N *
C1 : 1 + N = 0
G : N >= 0
IsN : is_integer N
P : N + 1 = 0
G' : N > 0
H1 : 1 < 0
============================
false
< case H1.
Subgoal 2.2:
Variables: I Rest
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I (I::Rest)
C : countItem I Rest 0 *
C1 : 1 + 0 = 0
G : 0 >= 0
IsN : is_integer 0
P : 0 + 1 = 0
============================
false
< case P.
Subgoal 3:
Variables: I Rest Y
IH : forall I L, countItem I L 0 * -> mem I L -> false
Mem : mem I (Y::Rest)
C : I = Y -> false
C1 : countItem I Rest 0 *
============================
false
< Mem: case Mem.
Subgoal 3.1:
Variables: Rest Y
IH : forall I L, countItem I L 0 * -> mem I L -> false
C : Y = Y -> false
C1 : countItem Y Rest 0 *
============================
false
< backchain C.
Subgoal 3.2:
Variables: I Rest Y
IH : forall I L, countItem I L 0 * -> mem I L -> false
C : I = Y -> false
C1 : countItem I Rest 0 *
Mem : mem I Rest
============================
false
< apply IH to C1 Mem.
Proof completed.
< Theorem countItem_greater_0 [Item] :
forall (I : Item) L N, countItem I (I::L) N -> N > 0.
============================
forall I L N, countItem I (I::L) N -> N > 0
< induction on 1.
IH : forall I L N, countItem I (I::L) N * -> N > 0
============================
forall I L N, countItem I (I::L) N @ -> N > 0
< intros C.
Variables: I L N
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I (I::L) N @
============================
N > 0
< C: case C.
Subgoal 1:
Variables: I L N N1
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L N1 *
C1 : 1 + N1 = N
============================
N > 0
< GEq: apply countItem_geq_0 to C.
Subgoal 1:
Variables: I L N N1
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L N1 *
C1 : 1 + N1 = N
GEq : N1 >= 0
============================
N > 0
< Or: apply greatereq_integer_greater_or_eq to GEq.
Subgoal 1:
Variables: I L N N1
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L N1 *
C1 : 1 + N1 = N
GEq : N1 >= 0
Or : N1 > 0 \/ N1 = 0
============================
N > 0
< G: case Or.
Subgoal 1.1:
Variables: I L N N1
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L N1 *
C1 : 1 + N1 = N
GEq : N1 >= 0
G : N1 > 0
============================
N > 0
< IsN1: apply countItem_is_integer to C.
Subgoal 1.1:
Variables: I L N N1
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L N1 *
C1 : 1 + N1 = N
GEq : N1 >= 0
G : N1 > 0
IsN1 : is_integer N1
============================
N > 0
< P: apply plus_integer_comm to _ _ C1.
Subgoal 1.1:
Variables: I L N N1
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L N1 *
C1 : 1 + N1 = N
GEq : N1 >= 0
G : N1 > 0
IsN1 : is_integer N1
P : N1 + 1 = N
============================
N > 0
< G': apply greater_plus_positive to _ _ P _.
Subgoal 1.1:
Variables: I L N N1
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L N1 *
C1 : 1 + N1 = N
GEq : N1 >= 0
G : N1 > 0
IsN1 : is_integer N1
P : N1 + 1 = N
G' : N > N1
============================
N > 0
< apply greater_integer_transitive to G' G.
Subgoal 1.1:
Variables: I L N N1
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L N1 *
C1 : 1 + N1 = N
GEq : N1 >= 0
G : N1 > 0
IsN1 : is_integer N1
P : N1 + 1 = N
G' : N > N1
H1 : N > 0
============================
N > 0
< search.
Subgoal 1.2:
Variables: I L N
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L 0 *
C1 : 1 + 0 = N
GEq : 0 >= 0
============================
N > 0
< P: apply plus_integer_comm to _ _ C1.
Subgoal 1.2:
Variables: I L N
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L 0 *
C1 : 1 + 0 = N
GEq : 0 >= 0
P : 0 + 1 = N
============================
N > 0
< case P.
Subgoal 1.2:
Variables: I L
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : countItem I L 0 *
C1 : 1 + 0 = 1
GEq : 0 >= 0
============================
1 > 0
< search.
Subgoal 2:
Variables: I L N
IH : forall I L N, countItem I (I::L) N * -> N > 0
C : I = I -> false
C1 : countItem I L N *
============================
N > 0
< apply C to _.
Proof completed.
< Theorem perm_countItems [Item] :
forall L P (I : Item) NL NP,
perm L P -> countItem I L NL -> countItem I P NP -> NL = NP.
============================
forall L P I NL NP, perm L P -> countItem I L NL -> countItem I P NP -> NL = NP
< induction on 2.
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
============================
forall L P I NL NP,
perm L P -> countItem I L NL @ -> countItem I P NP -> NL = NP
< intros P CL CP.
Variables: L P I NL NP
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
P : perm L P
CL : countItem I L NL @
CP : countItem I P NP
============================
NL = NP
< CL: case CL.
Subgoal 1:
Variables: P I NP
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
P : perm [] P
CP : countItem I P NP
============================
0 = NP
< case P.
Subgoal 1:
Variables: I NP
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I [] NP
============================
0 = NP
< case CP.
Subgoal 1:
Variables: I
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
============================
0 = 0
< search.
Subgoal 2:
Variables: P I NL NP N Rest
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
P : perm (I::Rest) P
CP : countItem I P NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
============================
NL = NP
< P: case P.
Subgoal 2:
Variables: P I NL NP N Rest L2
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I P NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I L2 P
P1 : perm Rest L2
============================
NL = NP
< S: case P (keep).
Subgoal 2.1:
Variables: I NL NP N Rest L2
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I (I::L2) NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I L2 (I::L2)
P1 : perm Rest L2
============================
NL = NP
< CP: case CP.
Subgoal 2.1.1:
Variables: I NL NP N Rest L2 N1
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I L2 (I::L2)
P1 : perm Rest L2
CP : countItem I L2 N1
CP1 : 1 + N1 = NP
============================
NL = NP
< apply IH to P1 CL CP.
Subgoal 2.1.1:
Variables: I NL NP Rest L2 N1
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CL : countItem I Rest N1 *
CL1 : 1 + N1 = NL
P : select I L2 (I::L2)
P1 : perm Rest L2
CP : countItem I L2 N1
CP1 : 1 + N1 = NP
============================
NL = NP
< apply plus_integer_unique to CL1 CP1.
Subgoal 2.1.1:
Variables: I NP Rest L2 N1
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CL : countItem I Rest N1 *
CL1 : 1 + N1 = NP
P : select I L2 (I::L2)
P1 : perm Rest L2
CP : countItem I L2 N1
CP1 : 1 + N1 = NP
============================
NP = NP
< search.
Subgoal 2.1.2:
Variables: I NL NP N Rest L2
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I L2 (I::L2)
P1 : perm Rest L2
CP : I = I -> false
CP1 : countItem I L2 NP
============================
NL = NP
< apply CP to _.
Subgoal 2.2:
Variables: I NL NP N Rest L3 I1 L1
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I (I1::L3) NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I (I1::L1) (I1::L3)
P1 : perm Rest (I1::L1)
S : select I L1 L3
============================
NL = NP
< IsNP: apply countItem_is_integer to CP.
Subgoal 2.2:
Variables: I NL NP N Rest L3 I1 L1
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I (I1::L3) NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I (I1::L1) (I1::L3)
P1 : perm Rest (I1::L1)
S : select I L1 L3
IsNP : is_integer NP
============================
NL = NP
< Minus: apply minus_integer_total to IsNP _ with
N2 = 1.
Subgoal 2.2:
Variables: I NL NP N Rest L3 I1 L1 N3
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I (I1::L3) NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I (I1::L1) (I1::L3)
P1 : perm Rest (I1::L1)
S : select I L1 L3
IsNP : is_integer NP
Minus : NP - 1 = N3
============================
NL = NP
< C': apply select_countItem to CP P Minus.
Subgoal 2.2:
Variables: I NL NP N Rest L3 I1 L1 N3
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I (I1::L3) NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I (I1::L1) (I1::L3)
P1 : perm Rest (I1::L1)
S : select I L1 L3
IsNP : is_integer NP
Minus : NP - 1 = N3
C' : countItem I (I1::L1) N3
============================
NL = NP
< P': apply minus_plus_same_integer to _ _ Minus.
Subgoal 2.2:
Variables: I NL NP N Rest L3 I1 L1 N3
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I (I1::L3) NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I (I1::L1) (I1::L3)
P1 : perm Rest (I1::L1)
S : select I L1 L3
IsNP : is_integer NP
Minus : NP - 1 = N3
C' : countItem I (I1::L1) N3
P' : N3 + 1 = NP
============================
NL = NP
< IsN3: apply minus_integer_is_integer to _ _ Minus.
Subgoal 2.2:
Variables: I NL NP N Rest L3 I1 L1 N3
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I (I1::L3) NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I (I1::L1) (I1::L3)
P1 : perm Rest (I1::L1)
S : select I L1 L3
IsNP : is_integer NP
Minus : NP - 1 = N3
C' : countItem I (I1::L1) N3
P' : N3 + 1 = NP
IsN3 : is_integer N3
============================
NL = NP
< Plus: apply plus_integer_comm to _ _ P'.
Subgoal 2.2:
Variables: I NL NP N Rest L3 I1 L1 N3
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I (I1::L3) NP
CL : countItem I Rest N *
CL1 : 1 + N = NL
P : select I (I1::L1) (I1::L3)
P1 : perm Rest (I1::L1)
S : select I L1 L3
IsNP : is_integer NP
Minus : NP - 1 = N3
C' : countItem I (I1::L1) N3
P' : N3 + 1 = NP
IsN3 : is_integer N3
Plus : 1 + N3 = NP
============================
NL = NP
< apply IH to P1 CL _.
Subgoal 2.2:
Variables: I NL NP Rest L3 I1 L1 N3
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I (I1::L3) NP
CL : countItem I Rest N3 *
CL1 : 1 + N3 = NL
P : select I (I1::L1) (I1::L3)
P1 : perm Rest (I1::L1)
S : select I L1 L3
IsNP : is_integer NP
Minus : NP - 1 = N3
C' : countItem I (I1::L1) N3
P' : N3 + 1 = NP
IsN3 : is_integer N3
Plus : 1 + N3 = NP
============================
NL = NP
< apply plus_integer_unique to CL1 Plus.
Subgoal 2.2:
Variables: I NP Rest L3 I1 L1 N3
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I (I1::L3) NP
CL : countItem I Rest N3 *
CL1 : 1 + N3 = NP
P : select I (I1::L1) (I1::L3)
P1 : perm Rest (I1::L1)
S : select I L1 L3
IsNP : is_integer NP
Minus : NP - 1 = N3
C' : countItem I (I1::L1) N3
P' : N3 + 1 = NP
IsN3 : is_integer N3
Plus : 1 + N3 = NP
============================
NP = NP
< search.
Subgoal 3:
Variables: P I NL NP Rest Y
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
P : perm (Y::Rest) P
CP : countItem I P NP
CL : I = Y -> false
CL1 : countItem I Rest NL *
============================
NL = NP
< P: case P.
Subgoal 3:
Variables: P I NL NP Rest Y L2
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I P NP
CL : I = Y -> false
CL1 : countItem I Rest NL *
P : select Y L2 P
P1 : perm Rest L2
============================
NL = NP
< C: apply select_countItem_neq to CP P CL.
Subgoal 3:
Variables: P I NL NP Rest Y L2
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I P NP
CL : I = Y -> false
CL1 : countItem I Rest NL *
P : select Y L2 P
P1 : perm Rest L2
C : countItem I L2 NP
============================
NL = NP
< apply IH to P1 CL1 C.
Subgoal 3:
Variables: P I NP Rest Y L2
IH : forall L P I NL NP,
perm L P -> countItem I L NL * -> countItem I P NP -> NL = NP
CP : countItem I P NP
CL : I = Y -> false
CL1 : countItem I Rest NP *
P : select Y L2 P
P1 : perm Rest L2
C : countItem I L2 NP
============================
NP = NP
< search.
Proof completed.
< Theorem intRange_is :
forall Low High R,
is_integer Low -> intRange Low High R -> is_list is_integer R.
============================
forall Low High R,
is_integer Low -> intRange Low High R -> is_list is_integer R
< induction on 2.
IH : forall Low High R,
is_integer Low -> intRange Low High R * -> is_list is_integer R
============================
forall Low High R,
is_integer Low -> intRange Low High R @ -> is_list is_integer R
< intros IsLow R.
Variables: Low High R
IH : forall Low High R,
is_integer Low -> intRange Low High R * -> is_list is_integer R
IsLow : is_integer Low
R : intRange Low High R @
============================
is_list is_integer R
< R: case R.
Subgoal 1:
Variables: Low High
IH : forall Low High R,
is_integer Low -> intRange Low High R * -> is_list is_integer R
IsLow : is_integer Low
R : Low > High
============================
is_list is_integer []
< search.
Subgoal 2:
Variables: Low High PlusOne Rest
IH : forall Low High R,
is_integer Low -> intRange Low High R * -> is_list is_integer R
IsLow : is_integer Low
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
============================
is_list is_integer (Low::Rest)
< IsPlusOne: apply plus_integer_is_integer to _ _ R1.
Subgoal 2:
Variables: Low High PlusOne Rest
IH : forall Low High R,
is_integer Low -> intRange Low High R * -> is_list is_integer R
IsLow : is_integer Low
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
IsPlusOne : is_integer PlusOne
============================
is_list is_integer (Low::Rest)
< apply IH to IsPlusOne R2.
Subgoal 2:
Variables: Low High PlusOne Rest
IH : forall Low High R,
is_integer Low -> intRange Low High R * -> is_list is_integer R
IsLow : is_integer Low
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
IsPlusOne : is_integer PlusOne
H1 : is_list is_integer Rest
============================
is_list is_integer (Low::Rest)
< search.
Proof completed.
< Theorem intRange_low_lesseq :
forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R -> Low <= X.
============================
forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R -> Low <= X
< induction on 3.
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
============================
forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R @ -> Low <= X
< intros IsLow Range Mem.
Variables: Low High R X
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer Low
Range : intRange Low High R
Mem : mem X R @
============================
Low <= X
< apply intRange_is to IsLow Range.
Variables: Low High R X
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer Low
Range : intRange Low High R
Mem : mem X R @
H1 : is_list is_integer R
============================
Low <= X
< IsX: apply is_list_int_mem to _ Mem.
Variables: Low High R X
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer Low
Range : intRange Low High R
Mem : mem X R @
H1 : is_list is_integer R
IsX : is_integer X
============================
Low <= X
< Mem: case Mem.
Subgoal 1:
Variables: Low High X Rest
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer Low
Range : intRange Low High (X::Rest)
H1 : is_list is_integer (X::Rest)
IsX : is_integer X
============================
Low <= X
< R: case Range.
Subgoal 1:
Variables: High X Rest PlusOne
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer X
H1 : is_list is_integer (X::Rest)
IsX : is_integer X
R : X <= High
R1 : 1 + X = PlusOne
R2 : intRange PlusOne High Rest
============================
X <= X
< apply is_integer_lesseq to IsX.
Subgoal 1:
Variables: High X Rest PlusOne
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer X
H1 : is_list is_integer (X::Rest)
IsX : is_integer X
R : X <= High
R1 : 1 + X = PlusOne
R2 : intRange PlusOne High Rest
H2 : X <= X
============================
X <= X
< search.
Subgoal 2:
Variables: Low High X Rest I
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer Low
Range : intRange Low High (I::Rest)
H1 : is_list is_integer (I::Rest)
IsX : is_integer X
Mem : mem X Rest *
============================
Low <= X
< R: case Range.
Subgoal 2:
Variables: High X Rest I PlusOne
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer I
H1 : is_list is_integer (I::Rest)
IsX : is_integer X
Mem : mem X Rest *
R : I <= High
R1 : 1 + I = PlusOne
R2 : intRange PlusOne High Rest
============================
I <= X
< apply plus_integer_is_integer to _ _ R1.
Subgoal 2:
Variables: High X Rest I PlusOne
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer I
H1 : is_list is_integer (I::Rest)
IsX : is_integer X
Mem : mem X Rest *
R : I <= High
R1 : 1 + I = PlusOne
R2 : intRange PlusOne High Rest
H2 : is_integer PlusOne
============================
I <= X
< LEq: apply IH to _ R2 Mem.
Subgoal 2:
Variables: High X Rest I PlusOne
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer I
H1 : is_list is_integer (I::Rest)
IsX : is_integer X
Mem : mem X Rest *
R : I <= High
R1 : 1 + I = PlusOne
R2 : intRange PlusOne High Rest
H2 : is_integer PlusOne
LEq : PlusOne <= X
============================
I <= X
< L: apply lt_plus_one to R1 _.
Subgoal 2:
Variables: High X Rest I PlusOne
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer I
H1 : is_list is_integer (I::Rest)
IsX : is_integer X
Mem : mem X Rest *
R : I <= High
R1 : 1 + I = PlusOne
R2 : intRange PlusOne High Rest
H2 : is_integer PlusOne
LEq : PlusOne <= X
L : I < PlusOne
============================
I <= X
< LEq': apply less_integer_lesseq to L.
Subgoal 2:
Variables: High X Rest I PlusOne
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer I
H1 : is_list is_integer (I::Rest)
IsX : is_integer X
Mem : mem X Rest *
R : I <= High
R1 : 1 + I = PlusOne
R2 : intRange PlusOne High Rest
H2 : is_integer PlusOne
LEq : PlusOne <= X
L : I < PlusOne
LEq' : I <= PlusOne
============================
I <= X
< apply lesseq_integer_transitive to LEq' LEq.
Subgoal 2:
Variables: High X Rest I PlusOne
IH : forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R * -> Low <= X
IsLow : is_integer I
H1 : is_list is_integer (I::Rest)
IsX : is_integer X
Mem : mem X Rest *
R : I <= High
R1 : 1 + I = PlusOne
R2 : intRange PlusOne High Rest
H2 : is_integer PlusOne
LEq : PlusOne <= X
L : I < PlusOne
LEq' : I <= PlusOne
H3 : I <= X
============================
I <= X
< search.
Proof completed.
< Theorem intRange_high_lesseq :
forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R -> X <= High.
============================
forall Low High R X,
is_integer Low -> intRange Low High R -> mem X R -> X <= High
< induction on 2.
IH : forall Low High R X,
is_integer Low -> intRange Low High R * -> mem X R -> X <= High
============================
forall Low High R X,
is_integer Low -> intRange Low High R @ -> mem X R -> X <= High
< intros IsLow Range Mem.
Variables: Low High R X
IH : forall Low High R X,
is_integer Low -> intRange Low High R * -> mem X R -> X <= High
IsLow : is_integer Low
Range : intRange Low High R @
Mem : mem X R
============================
X <= High
< Range: case Range.
Subgoal 1:
Variables: Low High X
IH : forall Low High R X,
is_integer Low -> intRange Low High R * -> mem X R -> X <= High
IsLow : is_integer Low
Mem : mem X []
Range : Low > High
============================
X <= High
< case Mem.
Subgoal 2:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> intRange Low High R * -> mem X R -> X <= High
IsLow : is_integer Low
Mem : mem X (Low::Rest)
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest *
============================
X <= High
< Mem: case Mem.
Subgoal 2.1:
Variables: Low High PlusOne Rest
IH : forall Low High R X,
is_integer Low -> intRange Low High R * -> mem X R -> X <= High
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest *
============================
Low <= High
< search.
Subgoal 2.2:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> intRange Low High R * -> mem X R -> X <= High
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest *
Mem : mem X Rest
============================
X <= High
< apply plus_integer_is_integer to _ _ Range1.
Subgoal 2.2:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> intRange Low High R * -> mem X R -> X <= High
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest *
Mem : mem X Rest
H1 : is_integer PlusOne
============================
X <= High
< apply IH to _ Range2 Mem.
Subgoal 2.2:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> intRange Low High R * -> mem X R -> X <= High
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest *
Mem : mem X Rest
H1 : is_integer PlusOne
H2 : X <= High
============================
X <= High
< search.
Proof completed.
< Theorem in_intRange :
forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R -> Low <= X -> X <= High ->
mem X R.
============================
forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R -> Low <= X -> X <= High ->
mem X R
< induction on 3.
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
============================
forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R @ -> Low <= X -> X <= High ->
mem X R
< intros IsLow IsX R LowX XHigh.
Variables: Low High R X
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer Low
IsX : is_integer X
R : intRange Low High R @
LowX : Low <= X
XHigh : X <= High
============================
mem X R
< R: case R.
Subgoal 1:
Variables: Low High X
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer Low
IsX : is_integer X
LowX : Low <= X
XHigh : X <= High
R : Low > High
============================
mem X []
< L: apply lesseq_integer_transitive to LowX XHigh.
Subgoal 1:
Variables: Low High X
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer Low
IsX : is_integer X
LowX : Low <= X
XHigh : X <= High
R : Low > High
L : Low <= High
============================
mem X []
< apply greater_lesseq_integer_false to R L.
Subgoal 2:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer Low
IsX : is_integer X
LowX : Low <= X
XHigh : X <= High
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
============================
mem X (Low::Rest)
< Or: apply lesseq_integer_less_or_eq to LowX.
Subgoal 2:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer Low
IsX : is_integer X
LowX : Low <= X
XHigh : X <= High
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
Or : Low < X \/ Low = X
============================
mem X (Low::Rest)
< L: case Or.
Subgoal 2.1:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer Low
IsX : is_integer X
LowX : Low <= X
XHigh : X <= High
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
L : Low < X
============================
mem X (Low::Rest)
< P: apply plus_integer_comm to _ _ R1.
Subgoal 2.1:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer Low
IsX : is_integer X
LowX : Low <= X
XHigh : X <= High
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
L : Low < X
P : Low + 1 = PlusOne
============================
mem X (Low::Rest)
< IsPlusOne: apply plus_integer_is_integer to _ _ P.
Subgoal 2.1:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer Low
IsX : is_integer X
LowX : Low <= X
XHigh : X <= High
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
L : Low < X
P : Low + 1 = PlusOne
IsPlusOne : is_integer PlusOne
============================
mem X (Low::Rest)
< apply less_lesseq_plus_one to _ _ L P.
Subgoal 2.1:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer Low
IsX : is_integer X
LowX : Low <= X
XHigh : X <= High
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
L : Low < X
P : Low + 1 = PlusOne
IsPlusOne : is_integer PlusOne
H1 : PlusOne <= X
============================
mem X (Low::Rest)
< apply IH to _ _ R2 _ _.
Subgoal 2.1:
Variables: Low High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer Low
IsX : is_integer X
LowX : Low <= X
XHigh : X <= High
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
L : Low < X
P : Low + 1 = PlusOne
IsPlusOne : is_integer PlusOne
H1 : PlusOne <= X
H2 : mem X Rest
============================
mem X (Low::Rest)
< search.
Subgoal 2.2:
Variables: High X PlusOne Rest
IH : forall Low High R X,
is_integer Low -> is_integer X -> intRange Low High R * -> Low <= X -> X <= High ->
mem X R
IsLow : is_integer X
IsX : is_integer X
LowX : X <= X
XHigh : X <= High
R : X <= High
R1 : 1 + X = PlusOne
R2 : intRange PlusOne High Rest *
============================
mem X (X::Rest)
< search.
Proof completed.
< Theorem intRange_unique :
forall Low High R1 R2,
intRange Low High R1 -> intRange Low High R2 -> R1 = R2.
============================
forall Low High R1 R2, intRange Low High R1 -> intRange Low High R2 -> R1 = R2
< induction on 1.
IH : forall Low High R1 R2,
intRange Low High R1 * -> intRange Low High R2 -> R1 = R2
============================
forall Low High R1 R2,
intRange Low High R1 @ -> intRange Low High R2 -> R1 = R2
< intros RA RB.
Variables: Low High R1 R2
IH : forall Low High R1 R2,
intRange Low High R1 * -> intRange Low High R2 -> R1 = R2
RA : intRange Low High R1 @
RB : intRange Low High R2
============================
R1 = R2
< RA: case RA.
Subgoal 1:
Variables: Low High R2
IH : forall Low High R1 R2,
intRange Low High R1 * -> intRange Low High R2 -> R1 = R2
RB : intRange Low High R2
RA : Low > High
============================
[] = R2
< RB: case RB.
Subgoal 1.1:
Variables: Low High
IH : forall Low High R1 R2,
intRange Low High R1 * -> intRange Low High R2 -> R1 = R2
RA : Low > High
RB : Low > High
============================
[] = []
< search.
Subgoal 1.2:
Variables: Low High PlusOne Rest
IH : forall Low High R1 R2,
intRange Low High R1 * -> intRange Low High R2 -> R1 = R2
RA : Low > High
RB : Low <= High
RB1 : 1 + Low = PlusOne
RB2 : intRange PlusOne High Rest
============================
[] = Low::Rest
< apply greater_lesseq_integer_false to RA RB.
Subgoal 2:
Variables: Low High R2 PlusOne Rest
IH : forall Low High R1 R2,
intRange Low High R1 * -> intRange Low High R2 -> R1 = R2
RB : intRange Low High R2
RA : Low <= High
RA1 : 1 + Low = PlusOne
RA2 : intRange PlusOne High Rest *
============================
Low::Rest = R2
< RB: case RB.
Subgoal 2.1:
Variables: Low High PlusOne Rest
IH : forall Low High R1 R2,
intRange Low High R1 * -> intRange Low High R2 -> R1 = R2
RA : Low <= High
RA1 : 1 + Low = PlusOne
RA2 : intRange PlusOne High Rest *
RB : Low > High
============================
Low::Rest = []
< apply greater_lesseq_integer_false to RB RA.
Subgoal 2.2:
Variables: Low High PlusOne Rest PlusOne1 Rest1
IH : forall Low High R1 R2,
intRange Low High R1 * -> intRange Low High R2 -> R1 = R2
RA : Low <= High
RA1 : 1 + Low = PlusOne
RA2 : intRange PlusOne High Rest *
RB : Low <= High
RB1 : 1 + Low = PlusOne1
RB2 : intRange PlusOne1 High Rest1
============================
Low::Rest = Low::Rest1
< apply plus_integer_unique to RA1 RB1.
Subgoal 2.2:
Variables: Low High Rest PlusOne1 Rest1
IH : forall Low High R1 R2,
intRange Low High R1 * -> intRange Low High R2 -> R1 = R2
RA : Low <= High
RA1 : 1 + Low = PlusOne1
RA2 : intRange PlusOne1 High Rest *
RB : Low <= High
RB1 : 1 + Low = PlusOne1
RB2 : intRange PlusOne1 High Rest1
============================
Low::Rest = Low::Rest1
< apply IH to RA2 RB2.
Subgoal 2.2:
Variables: Low High PlusOne1 Rest1
IH : forall Low High R1 R2,
intRange Low High R1 * -> intRange Low High R2 -> R1 = R2
RA : Low <= High
RA1 : 1 + Low = PlusOne1
RA2 : intRange PlusOne1 High Rest1 *
RB : Low <= High
RB1 : 1 + Low = PlusOne1
RB2 : intRange PlusOne1 High Rest1
============================
Low::Rest1 = Low::Rest1
< search.
Proof completed.
< Theorem intRange_smaller_exists :
forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R -> Low < Low' ->
exists R', intRange Low' High R'.
============================
forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R -> Low < Low' -> exists R',
intRange Low' High R'
< induction on 3.
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
============================
forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R @ -> Low < Low' -> exists R',
intRange Low' High R'
< intros IsLow IsLow' R L.
Variables: Low High R Low'
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R @
L : Low < Low'
============================
exists R', intRange Low' High R'
< R: case R.
Subgoal 1:
Variables: Low High Low'
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low > High
============================
exists R', intRange Low' High R'
< G: apply less_integer_flip_greater to L.
Subgoal 1:
Variables: Low High Low'
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low > High
G : Low' > Low
============================
exists R', intRange Low' High R'
< apply greater_integer_transitive to G R.
Subgoal 1:
Variables: Low High Low'
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low > High
G : Low' > Low
H1 : Low' > High
============================
exists R', intRange Low' High R'
< search.
Subgoal 2:
Variables: Low High Low' PlusOne Rest
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
============================
exists R', intRange Low' High R'
< IsPlusOne: apply plus_integer_is_integer to _ _ R1.
Subgoal 2:
Variables: Low High Low' PlusOne Rest
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
IsPlusOne : is_integer PlusOne
============================
exists R', intRange Low' High R'
< P: apply plus_integer_comm to _ _ R1.
Subgoal 2:
Variables: Low High Low' PlusOne Rest
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
IsPlusOne : is_integer PlusOne
P : Low + 1 = PlusOne
============================
exists R', intRange Low' High R'
< LEq: apply less_lesseq_plus_one to _ _ L P.
Subgoal 2:
Variables: Low High Low' PlusOne Rest
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
IsPlusOne : is_integer PlusOne
P : Low + 1 = PlusOne
LEq : PlusOne <= Low'
============================
exists R', intRange Low' High R'
< Or: apply lesseq_integer_less_or_eq to LEq.
Subgoal 2:
Variables: Low High Low' PlusOne Rest
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
IsPlusOne : is_integer PlusOne
P : Low + 1 = PlusOne
LEq : PlusOne <= Low'
Or : PlusOne < Low' \/ PlusOne = Low'
============================
exists R', intRange Low' High R'
< L: case Or.
Subgoal 2.1:
Variables: Low High Low' PlusOne Rest
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
IsPlusOne : is_integer PlusOne
P : Low + 1 = PlusOne
LEq : PlusOne <= Low'
L1 : PlusOne < Low'
============================
exists R', intRange Low' High R'
< apply IH to _ _ R2 L1.
Subgoal 2.1:
Variables: Low High Low' PlusOne Rest R'
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low <= High
R1 : 1 + Low = PlusOne
R2 : intRange PlusOne High Rest *
IsPlusOne : is_integer PlusOne
P : Low + 1 = PlusOne
LEq : PlusOne <= Low'
L1 : PlusOne < Low'
H1 : intRange Low' High R'
============================
exists R', intRange Low' High R'
< search.
Subgoal 2.2:
Variables: Low High Low' Rest
IH : forall Low High R Low',
is_integer Low -> is_integer Low' -> intRange Low High R * -> Low < Low' ->
exists R', intRange Low' High R'
IsLow : is_integer Low
IsLow' : is_integer Low'
L : Low < Low'
R : Low <= High
R1 : 1 + Low = Low'
R2 : intRange Low' High Rest *
IsPlusOne : is_integer Low'
P : Low + 1 = Low'
LEq : Low' <= Low'
============================
exists R', intRange Low' High R'
< search.
Proof completed.
< Theorem intRange_subset :
forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' ->
Low < Low' -> subset R' R.
============================
forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' ->
Low < Low' -> subset R' R
< induction on 4.
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
============================
forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' @ ->
Low < Low' -> subset R' R
< intros IsLow IsLow' R R' L.
Variables: Low Low' High R R'
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R
R' : intRange Low' High R' @
L : Low < Low'
============================
subset R' R
< R': case R'.
Subgoal 1:
Variables: Low Low' High R
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R
L : Low < Low'
R' : Low' > High
============================
subset [] R
< search.
Subgoal 2:
Variables: Low Low' High R PlusOne Rest
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R
L : Low < Low'
R' : Low' <= High
R'1 : 1 + Low' = PlusOne
R'2 : intRange PlusOne High Rest *
============================
subset (Low'::Rest) R
< P: apply plus_integer_comm to _ _ R'1.
Subgoal 2:
Variables: Low Low' High R PlusOne Rest
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R
L : Low < Low'
R' : Low' <= High
R'1 : 1 + Low' = PlusOne
R'2 : intRange PlusOne High Rest *
P : Low' + 1 = PlusOne
============================
subset (Low'::Rest) R
< LEq: apply less_integer_lesseq to L.
Subgoal 2:
Variables: Low Low' High R PlusOne Rest
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R
L : Low < Low'
R' : Low' <= High
R'1 : 1 + Low' = PlusOne
R'2 : intRange PlusOne High Rest *
P : Low' + 1 = PlusOne
LEq : Low <= Low'
============================
subset (Low'::Rest) R
< M: apply in_intRange to _ _ R _ R'.
Subgoal 2:
Variables: Low Low' High R PlusOne Rest
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R
L : Low < Low'
R' : Low' <= High
R'1 : 1 + Low' = PlusOne
R'2 : intRange PlusOne High Rest *
P : Low' + 1 = PlusOne
LEq : Low <= Low'
M : mem Low' R
============================
subset (Low'::Rest) R
< L': apply lt_plus_one to R'1 _.
Subgoal 2:
Variables: Low Low' High R PlusOne Rest
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R
L : Low < Low'
R' : Low' <= High
R'1 : 1 + Low' = PlusOne
R'2 : intRange PlusOne High Rest *
P : Low' + 1 = PlusOne
LEq : Low <= Low'
M : mem Low' R
L' : Low' < PlusOne
============================
subset (Low'::Rest) R
< apply less_integer_transitive to L L'.
Subgoal 2:
Variables: Low Low' High R PlusOne Rest
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R
L : Low < Low'
R' : Low' <= High
R'1 : 1 + Low' = PlusOne
R'2 : intRange PlusOne High Rest *
P : Low' + 1 = PlusOne
LEq : Low <= Low'
M : mem Low' R
L' : Low' < PlusOne
H1 : Low < PlusOne
============================
subset (Low'::Rest) R
< apply plus_integer_is_integer to _ _ R'1.
Subgoal 2:
Variables: Low Low' High R PlusOne Rest
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R
L : Low < Low'
R' : Low' <= High
R'1 : 1 + Low' = PlusOne
R'2 : intRange PlusOne High Rest *
P : Low' + 1 = PlusOne
LEq : Low <= Low'
M : mem Low' R
L' : Low' < PlusOne
H1 : Low < PlusOne
H2 : is_integer PlusOne
============================
subset (Low'::Rest) R
< apply IH to _ _ R R'2 _.
Subgoal 2:
Variables: Low Low' High R PlusOne Rest
IH : forall Low Low' High R R',
is_integer Low -> is_integer Low' -> intRange Low High R -> intRange Low' High R' * ->
Low < Low' -> subset R' R
IsLow : is_integer Low
IsLow' : is_integer Low'
R : intRange Low High R
L : Low < Low'
R' : Low' <= High
R'1 : 1 + Low' = PlusOne
R'2 : intRange PlusOne High Rest *
P : Low' + 1 = PlusOne
LEq : Low <= Low'
M : mem Low' R
L' : Low' < PlusOne
H1 : Low < PlusOne
H2 : is_integer PlusOne
H3 : subset Rest R
============================
subset (Low'::Rest) R
< search.
Proof completed.
< Theorem intRange_select_unique :
forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R -> select X Rest R -> select X Rest' R ->
Rest = Rest'.
============================
forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R -> select X Rest R -> select X Rest' R ->
Rest = Rest'
< induction on 2.
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
============================
forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R @ -> select X Rest R -> select X Rest' R ->
Rest = Rest'
< intros IsLow Range Slct Slct'.
Variables: Low High R X Rest Rest'
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : intRange Low High R @
Slct : select X Rest R
Slct' : select X Rest' R
============================
Rest = Rest'
< Range: case Range.
Subgoal 1:
Variables: Low High X Rest Rest'
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Slct : select X Rest []
Slct' : select X Rest' []
Range : Low > High
============================
Rest = Rest'
< case Slct.
Subgoal 2:
Variables: Low High X Rest Rest' PlusOne Rest1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Slct : select X Rest (Low::Rest1)
Slct' : select X Rest' (Low::Rest1)
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
============================
Rest = Rest'
< Slct: case Slct.
Subgoal 2.1:
Variables: Low High Rest' PlusOne Rest1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Slct' : select Low Rest' (Low::Rest1)
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
============================
Rest1 = Rest'
< Slct': case Slct'.
Subgoal 2.1.1:
Variables: Low High PlusOne Rest1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
============================
Rest1 = Rest1
< search.
Subgoal 2.1.2:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct' : select Low L1 Rest1
============================
Rest1 = Low::L1
< L: apply lt_plus_one to Range1 _.
Subgoal 2.1.2:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct' : select Low L1 Rest1
L : Low < PlusOne
============================
Rest1 = Low::L1
< M: apply select_mem to Slct'.
Subgoal 2.1.2:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct' : select Low L1 Rest1
L : Low < PlusOne
M : mem Low Rest1
============================
Rest1 = Low::L1
< IsPlusOne: apply plus_integer_is_integer to _ _ Range1.
Subgoal 2.1.2:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct' : select Low L1 Rest1
L : Low < PlusOne
M : mem Low Rest1
IsPlusOne : is_integer PlusOne
============================
Rest1 = Low::L1
< LEq: apply intRange_low_lesseq to _ Range2 M.
Subgoal 2.1.2:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct' : select Low L1 Rest1
L : Low < PlusOne
M : mem Low Rest1
IsPlusOne : is_integer PlusOne
LEq : PlusOne <= Low
============================
Rest1 = Low::L1
< G: apply less_integer_flip_greater to L.
Subgoal 2.1.2:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct' : select Low L1 Rest1
L : Low < PlusOne
M : mem Low Rest1
IsPlusOne : is_integer PlusOne
LEq : PlusOne <= Low
G : PlusOne > Low
============================
Rest1 = Low::L1
< apply greater_lesseq_integer_false to G LEq.
Subgoal 2.2:
Variables: Low High X Rest' PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Slct' : select X Rest' (Low::Rest1)
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct : select X L1 Rest1
============================
Low::L1 = Rest'
< Slct': case Slct'.
Subgoal 2.2.1:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct : select Low L1 Rest1
============================
Low::L1 = Rest1
< L: apply lt_plus_one to Range1 _.
Subgoal 2.2.1:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct : select Low L1 Rest1
L : Low < PlusOne
============================
Low::L1 = Rest1
< M: apply select_mem to Slct.
Subgoal 2.2.1:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct : select Low L1 Rest1
L : Low < PlusOne
M : mem Low Rest1
============================
Low::L1 = Rest1
< IsPlusOne: apply plus_integer_is_integer to _ _ Range1.
Subgoal 2.2.1:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct : select Low L1 Rest1
L : Low < PlusOne
M : mem Low Rest1
IsPlusOne : is_integer PlusOne
============================
Low::L1 = Rest1
< LEq: apply intRange_low_lesseq to _ Range2 M.
Subgoal 2.2.1:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct : select Low L1 Rest1
L : Low < PlusOne
M : mem Low Rest1
IsPlusOne : is_integer PlusOne
LEq : PlusOne <= Low
============================
Low::L1 = Rest1
< G: apply less_integer_flip_greater to L.
Subgoal 2.2.1:
Variables: Low High PlusOne Rest1 L1
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct : select Low L1 Rest1
L : Low < PlusOne
M : mem Low Rest1
IsPlusOne : is_integer PlusOne
LEq : PlusOne <= Low
G : PlusOne > Low
============================
Low::L1 = Rest1
< apply greater_lesseq_integer_false to G LEq.
Subgoal 2.2.2:
Variables: Low High X PlusOne Rest1 L1 L2
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct : select X L1 Rest1
Slct' : select X L2 Rest1
============================
Low::L1 = Low::L2
< apply plus_integer_is_integer to _ _ Range1.
Subgoal 2.2.2:
Variables: Low High X PlusOne Rest1 L1 L2
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct : select X L1 Rest1
Slct' : select X L2 Rest1
H1 : is_integer PlusOne
============================
Low::L1 = Low::L2
< apply IH to _ Range2 Slct Slct'.
Subgoal 2.2.2:
Variables: Low High X PlusOne Rest1 L2
IH : forall Low High R X Rest Rest',
is_integer Low -> intRange Low High R * -> select X Rest R -> select X Rest' R ->
Rest = Rest'
IsLow : is_integer Low
Range : Low <= High
Range1 : 1 + Low = PlusOne
Range2 : intRange PlusOne High Rest1 *
Slct : select X L2 Rest1
Slct' : select X L2 Rest1
H1 : is_integer PlusOne
============================
Low::L2 = Low::L2
< search.
Proof completed.
< Theorem intRange_exists :
forall Low High,
is_integer Low -> is_integer High -> exists R, intRange Low High R.
============================
forall Low High,
is_integer Low -> is_integer High -> exists R, intRange Low High R
< assert forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R.
Subgoal 1:
============================
forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
< induction on 4.
Subgoal 1:
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
============================
forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff @ -> exists R,
intRange Low High R
< intros IsLow IsHigh Minus Acc.
Subgoal 1:
Variables: Low High Diff
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Acc : acc Diff @
============================
exists R, intRange Low High R
< Or: apply integer_compare_total to IsLow IsHigh.
Subgoal 1:
Variables: Low High Diff
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Acc : acc Diff @
Or : Low <= High \/ Low > High
============================
exists R, intRange Low High R
< Comp: case Or.
Subgoal 1.1:
Variables: Low High Diff
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Acc : acc Diff @
Comp : Low <= High
============================
exists R, intRange Low High R
< P: apply plus_integer_total to _ IsLow with
N1 = 1.
Subgoal 1.1:
Variables: Low High Diff N3
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Acc : acc Diff @
Comp : Low <= High
P : 1 + Low = N3
============================
exists R, intRange Low High R
< IsN3: apply plus_integer_is_integer to _ _ P.
Subgoal 1.1:
Variables: Low High Diff N3
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Acc : acc Diff @
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
============================
exists R, intRange Low High R
< LowN3: apply lt_plus_one to P _.
Subgoal 1.1:
Variables: Low High Diff N3
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Acc : acc Diff @
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
============================
exists R, intRange Low High R
< Minus': apply minus_integer_total to IsHigh IsN3.
Subgoal 1.1:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Acc : acc Diff @
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
============================
exists R, intRange Low High R
< L: apply minus_larger to _ Minus Minus' LowN3.
Subgoal 1.1:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Acc : acc Diff @
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
============================
exists R, intRange Low High R
< Acc: case Acc.
Subgoal 1.1:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
============================
exists R, intRange Low High R
< Or: apply integer_compare_total to IsN3 IsHigh.
Subgoal 1.1:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Or : N3 <= High \/ N3 > High
============================
exists R, intRange Low High R
< Comp: case Or.
Subgoal 1.1.1:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : N3 <= High
============================
exists R, intRange Low High R
< Or: apply lesseq_integer_less_or_eq to Comp1.
Subgoal 1.1.1:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : N3 <= High
Or : N3 < High \/ N3 = High
============================
exists R, intRange Low High R
< L': case Or.
Subgoal 1.1.1.1:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : N3 <= High
L' : N3 < High
============================
exists R, intRange Low High R
< L0N1: apply minus_smaller_positive to Minus' L'.
Subgoal 1.1.1.1:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : N3 <= High
L' : N3 < High
L0N1 : 0 < N1
============================
exists R, intRange Low High R
< LEq: apply less_integer_lesseq to L0N1.
Subgoal 1.1.1.1:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : N3 <= High
L' : N3 < High
L0N1 : 0 < N1
LEq : 0 <= N1
============================
exists R, intRange Low High R
< A: apply Acc to LEq L.
Subgoal 1.1.1.1:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : N3 <= High
L' : N3 < High
L0N1 : 0 < N1
LEq : 0 <= N1
A : acc N1 *
============================
exists R, intRange Low High R
< apply IH to _ _ Minus' A.
Subgoal 1.1.1.1:
Variables: Low High Diff N3 N1 R
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : N3 <= High
L' : N3 < High
L0N1 : 0 < N1
LEq : 0 <= N1
A : acc N1 *
H1 : intRange N3 High R
============================
exists R, intRange Low High R
< search.
Subgoal 1.1.1.2:
Variables: Low High Diff N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = High
IsN3 : is_integer High
LowN3 : Low < High
Minus' : High - High = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : High <= High
============================
exists R, intRange Low High R
< M: apply minus_integer_same to IsHigh.
Subgoal 1.1.1.2:
Variables: Low High Diff N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = High
IsN3 : is_integer High
LowN3 : Low < High
Minus' : High - High = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : High <= High
M : High - High = 0
============================
exists R, intRange Low High R
< apply minus_integer_unique to M Minus'.
Subgoal 1.1.1.2:
Variables: Low High Diff
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = High
IsN3 : is_integer High
LowN3 : Low < High
Minus' : High - High = 0
L : 0 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : High <= High
M : High - High = 0
============================
exists R, intRange Low High R
< A: apply Acc to _ L.
Subgoal 1.1.1.2:
Variables: Low High Diff
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = High
IsN3 : is_integer High
LowN3 : Low < High
Minus' : High - High = 0
L : 0 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : High <= High
M : High - High = 0
A : acc 0 *
============================
exists R, intRange Low High R
< apply IH to _ _ Minus' A.
Subgoal 1.1.1.2:
Variables: Low High Diff R
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = High
IsN3 : is_integer High
LowN3 : Low < High
Minus' : High - High = 0
L : 0 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : High <= High
M : High - High = 0
A : acc 0 *
H1 : intRange High High R
============================
exists R, intRange Low High R
< search.
Subgoal 1.1.2:
Variables: Low High Diff N3 N1
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Comp : Low <= High
P : 1 + Low = N3
IsN3 : is_integer N3
LowN3 : Low < N3
Minus' : High - N3 = N1
L : N1 < Diff
Acc : forall M, 0 <= M -> M < Diff -> acc M *
Comp1 : N3 > High
============================
exists R, intRange Low High R
< search.
Subgoal 1.2:
Variables: Low High Diff
IH : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff * -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = Diff
Acc : acc Diff @
Comp : Low > High
============================
exists R, intRange Low High R
< search.
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
============================
forall Low High,
is_integer Low -> is_integer High -> exists R, intRange Low High R
< intros IsLow IsHigh.
Variables: Low High
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
============================
exists R, intRange Low High R
< Minus: apply minus_integer_total to IsHigh IsLow.
Variables: Low High N3
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = N3
============================
exists R, intRange Low High R
< IsN3: apply minus_integer_is_integer to _ _ Minus.
Variables: Low High N3
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = N3
IsN3 : is_integer N3
============================
exists R, intRange Low High R
< Or: apply integer_compare_total to _ IsN3 with
A = 0.
Variables: Low High N3
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = N3
IsN3 : is_integer N3
Or : 0 <= N3 \/ 0 > N3
============================
exists R, intRange Low High R
< Comp: case Or.
Subgoal 2:
Variables: Low High N3
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = N3
IsN3 : is_integer N3
Comp : 0 <= N3
============================
exists R, intRange Low High R
< apply all_acc to IsN3 Comp.
Subgoal 2:
Variables: Low High N3
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = N3
IsN3 : is_integer N3
Comp : 0 <= N3
H2 : acc N3
============================
exists R, intRange Low High R
< apply H1 to _ _ Minus _.
Subgoal 2:
Variables: Low High N3 R
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = N3
IsN3 : is_integer N3
Comp : 0 <= N3
H2 : acc N3
H3 : intRange Low High R
============================
exists R, intRange Low High R
< search.
Subgoal 3:
Variables: Low High N3
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = N3
IsN3 : is_integer N3
Comp : 0 > N3
============================
exists R, intRange Low High R
< NegN3: apply greater_integer_flip_less to Comp.
Subgoal 3:
Variables: Low High N3
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = N3
IsN3 : is_integer N3
Comp : 0 > N3
NegN3 : N3 < 0
============================
exists R, intRange Low High R
< apply minus_integer_diff_neg to NegN3 Minus.
Subgoal 3:
Variables: Low High N3
H1 : forall Low High Diff,
is_integer Low -> is_integer High -> High - Low = Diff -> acc Diff -> exists R,
intRange Low High R
IsLow : is_integer Low
IsHigh : is_integer High
Minus : High - Low = N3
IsN3 : is_integer N3
Comp : 0 > N3
NegN3 : N3 < 0
H2 : High < Low
============================
exists R, intRange Low High R
< search.
Proof completed.