Reasoning Details

 < Module unsat_proofs:drat.
 < Prove_Constraint unsat_proofs:lrat:proj_lit_unique.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:proj_lit_is.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:proj_clause_unique.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:proj_clause_is.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:proj_formula_unique.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:proj_formula_is.

Proof completed.
 < Add_Proj_Rel unsat_proofs:lrat:is_clause.

Proof completed.
 < Prove_Ext_Ind unsat_proofs:lrat:is_clause.

Warning:  No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Proof completed.
 < Add_Proj_Rel unsat_proofs:lrat:is_formula.

Proof completed.
 < Prove_Ext_Ind unsat_proofs:lrat:is_formula.

Warning:  No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Proof completed.
 < Prove unsat_proofs:lrat:is_lit_pos_or_neg.

Proof completed.
 < Prove unsat_proofs:lrat:is_clause_empty_or_not.

Proof completed.
 < Prove unsat_proofs:lrat:is_clause_or_or_not.

Proof completed.
 < Prove unsat_proofs:lrat:is_clause_eq_or_not.

Proof completed.
 < Prove unsat_proofs:lrat:is_formula_empty_or_not.

Proof completed.
 < Prove unsat_proofs:lrat:is_formula_and_or_not.

Proof completed.
 < Prove unsat_proofs:lrat:is_formula_eq_or_not.

Proof completed.
 < Prove unsat_proofs:lrat:negate_lit_unique.

Proof completed.
 < Prove unsat_proofs:lrat:negate_lit_reverse.

Proof completed.
 < Prove unsat_proofs:lrat:negate_lit_not_same.

Proof completed.
 < Prove unsat_proofs:lrat:negate_lit_is_lit.

Proof completed.
 < Prove unsat_proofs:lrat:negate_lit_is_lit_back.

Proof completed.
 < Prove unsat_proofs:lrat:negate_lit_exists.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:sat_clause_ext_to_proj.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:sat_clause_proj_to_ext.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:unsat_clause_ext_to_proj.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:unsat_clause_proj_to_ext.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:sat_formula_ext_to_proj.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:sat_formula_proj_to_ext.

Proof completed.
 < Prove unsat_proofs:lrat:unsat_sat_clause.

Proof completed.
 < Prove unsat_proofs:lrat:sat_clause_orderless.

Proof completed.
 < Prove unsat_proofs:lrat:sat_formula_orderless.

Proof completed.
 < Prove unsat_proofs:lrat:unsat_clause_orderless.

Proof completed.
 < Prove unsat_proofs:lrat:unit_clause_is.

Proof completed.
 < Prove unsat_proofs:lrat:unit_clause_unique.

Proof completed.
 < Prove unsat_proofs:lrat:unit_clause_not_assigned.

Proof completed.
 < Prove unsat_proofs:lrat:unit_clause_not_assigned_negate.

Proof completed.
 < Prove unsat_proofs:lrat:unit_clause_expand.

Proof completed.
 < Prove unsat_proofs:lrat:unit_clause_add.

Proof completed.
 < Prove unsat_proofs:lrat:gatherLits_is.

Proof completed.
 < Prove unsat_proofs:lrat:gatherLits_exists.

Proof completed.
 < Prove unsat_proofs:lrat:gatherLits_permutation.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:proj_gatherLits.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:proj_gatherLits_permutation.

Proof completed.
 < Prove unsat_proofs:lrat:gatherLits_sat.

Proof completed.
 < Prove unsat_proofs:lrat:gatherLits_mem_sat.

Proof completed.
 < Prove unsat_proofs:lrat:gatherLits_unsat.

Proof completed.
 < Prove unsat_proofs:lrat:negate_lits_unsat.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:proj_proof_is.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:proj_proof_extend.

Proof completed.
 < Prove unsat_proofs:lrat:check_proof_correct.

Proof completed.
 < Prove unsat_proofs:lrat:checkProof_orderless.

Proof completed.
 < Add_Ext_Size unsat_proofs:lrat:checkProof.

Proof completed.
 < Add_Proj_Rel unsat_proofs:lrat:checkProof.

Proof completed.
 < Prove_Ext_Ind unsat_proofs:lrat:checkProof.

Proof completed.
 < Prove_Constraint unsat_proofs:lrat:proj_checkProof.

Proof completed.
 < Prove unsat_proofs:lrat:formulaToKnown_unique.

Proof completed.
 < Prove unsat_proofs:lrat:formulaToKnown_all_greater.

Proof completed.
 < Prove unsat_proofs:lrat:formulaToKnown_all_unique.

Proof completed.
 < Prove unsat_proofs:lrat:formulaToKnown_sat_formula.

Proof completed.
 < Prove unsat_proofs:lrat:formulaToKnown_is.

Proof completed.
 < Theorem rupProof_help__drup_help :
     forall KnownL KnownD A Prf,
       rupProof_help KnownL A Prf -> values KnownL KnownD -> drup_help KnownD A.

============================
 forall KnownL KnownD A Prf,
   rupProof_help KnownL A Prf -> values KnownL KnownD -> drup_help KnownD A
 < induction on 1.

IH : forall KnownL KnownD A Prf,
       rupProof_help KnownL A Prf * -> values KnownL KnownD -> drup_help KnownD A
============================
 forall KnownL KnownD A Prf,
   rupProof_help KnownL A Prf @ -> values KnownL KnownD -> drup_help KnownD A
 < intros RUP V.

Variables: KnownL KnownD A Prf
IH : forall KnownL KnownD A Prf,
       rupProof_help KnownL A Prf * -> values KnownL KnownD -> drup_help KnownD A
RUP : rupProof_help KnownL A Prf @
V : values KnownL KnownD
============================
 drup_help KnownD A
 < RUP: case RUP.

Subgoal 1:

Variables: KnownL KnownD A C ID
IH : forall KnownL KnownD A Prf,
       rupProof_help KnownL A Prf * -> values KnownL KnownD -> drup_help KnownD A
V : values KnownL KnownD
RUP : lookup KnownL ID C
RUP1 : unsat_clause A C
============================
 drup_help KnownD A
 < MemL: apply lookup_mem to RUP.

Subgoal 1:

Variables: KnownL KnownD A C ID
IH : forall KnownL KnownD A Prf,
       rupProof_help KnownL A Prf * -> values KnownL KnownD -> drup_help KnownD A
V : values KnownL KnownD
RUP : lookup KnownL ID C
RUP1 : unsat_clause A C
MemL : mem (ID, C) KnownL
============================
 drup_help KnownD A
 < MemD: apply values_mem to MemL V.

Subgoal 1:

Variables: KnownL KnownD A C ID
IH : forall KnownL KnownD A Prf,
       rupProof_help KnownL A Prf * -> values KnownL KnownD -> drup_help KnownD A
V : values KnownL KnownD
RUP : lookup KnownL ID C
RUP1 : unsat_clause A C
MemL : mem (ID, C) KnownL
MemD : mem C KnownD
============================
 drup_help KnownD A
 < search.

Subgoal 2:

Variables: KnownL KnownD A C L Prf1 ID
IH : forall KnownL KnownD A Prf,
       rupProof_help KnownL A Prf * -> values KnownL KnownD -> drup_help KnownD A
V : values KnownL KnownD
RUP : lookup KnownL ID C
RUP1 : unit_clause A C L
RUP2 : rupProof_help KnownL (L::A) Prf1 *
============================
 drup_help KnownD A
 < MemL: apply lookup_mem to RUP.

Subgoal 2:

Variables: KnownL KnownD A C L Prf1 ID
IH : forall KnownL KnownD A Prf,
       rupProof_help KnownL A Prf * -> values KnownL KnownD -> drup_help KnownD A
V : values KnownL KnownD
RUP : lookup KnownL ID C
RUP1 : unit_clause A C L
RUP2 : rupProof_help KnownL (L::A) Prf1 *
MemL : mem (ID, C) KnownL
============================
 drup_help KnownD A
 < MemD: apply values_mem to MemL V.

Subgoal 2:

Variables: KnownL KnownD A C L Prf1 ID
IH : forall KnownL KnownD A Prf,
       rupProof_help KnownL A Prf * -> values KnownL KnownD -> drup_help KnownD A
V : values KnownL KnownD
RUP : lookup KnownL ID C
RUP1 : unit_clause A C L
RUP2 : rupProof_help KnownL (L::A) Prf1 *
MemL : mem (ID, C) KnownL
MemD : mem C KnownD
============================
 drup_help KnownD A
 < apply IH to RUP2 _.

Subgoal 2:

Variables: KnownL KnownD A C L Prf1 ID
IH : forall KnownL KnownD A Prf,
       rupProof_help KnownL A Prf * -> values KnownL KnownD -> drup_help KnownD A
V : values KnownL KnownD
RUP : lookup KnownL ID C
RUP1 : unit_clause A C L
RUP2 : rupProof_help KnownL (L::A) Prf1 *
MemL : mem (ID, C) KnownL
MemD : mem C KnownD
H1 : drup_help KnownD (L::A)
============================
 drup_help KnownD A
 < search.

Proof completed.
 < Theorem rupProof__drup :
     forall KnownL KnownD C Prf,
       rupProof KnownL C Prf -> values KnownL KnownD -> drup KnownD C.

============================
 forall KnownL KnownD C Prf,
   rupProof KnownL C Prf -> values KnownL KnownD -> drup KnownD C
 < intros R Vals.

Variables: KnownL KnownD C Prf
R : rupProof KnownL C Prf
Vals : values KnownL KnownD
============================
 drup KnownD C
 < R: case R.

Variables: KnownL KnownD C Prf Lits A
Vals : values KnownL KnownD
R : gatherLits C Lits
R1 : negateLitList Lits A
R2 : rupProof_help KnownL A Prf
============================
 drup KnownD C
 < apply rupProof_help__drup_help to R2 Vals.

Variables: KnownL KnownD C Prf Lits A
Vals : values KnownL KnownD
R : gatherLits C Lits
R1 : negateLitList Lits A
R2 : rupProof_help KnownL A Prf
H1 : drup_help KnownD A
============================
 drup KnownD C
 < search.

Proof completed.
 < Theorem remove_all_no_mem_same :
     forall K ID KRest,
       remove_all K ID KRest -> ((exists C, mem (ID, C) K) -> false) -> K = KRest.

============================
 forall K ID KRest,
   remove_all K ID KRest -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
 < induction on 1.

IH : forall K ID KRest,
       remove_all K ID KRest * -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
============================
 forall K ID KRest,
   remove_all K ID KRest @ -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
 < intros RA NEq.

Variables: K ID KRest
IH : forall K ID KRest,
       remove_all K ID KRest * -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
RA : remove_all K ID KRest @
NEq : (exists C, mem (ID, C) K) -> false
============================
 K = KRest
 < RA: case RA.

Subgoal 1:

Variables: ID
IH : forall K ID KRest,
       remove_all K ID KRest * -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
NEq : (exists C, mem (ID, C) []) -> false
============================
 [] = []
 < search.

Subgoal 2:

Variables: ID KRest IRest C
IH : forall K ID KRest,
       remove_all K ID KRest * -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
NEq : (exists C1, mem (ID, C1) ((ID, C)::IRest)) -> false
RA : remove_all IRest ID KRest *
============================
 (ID, C)::IRest = KRest
 < apply NEq to _.

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall K ID KRest,
       remove_all K ID KRest * -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
NEq : (exists C1, mem (ID, C1) ((A, C)::IRest)) -> false
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 (A, C)::IRest = (A, C)::Rest
 < assert (exists C, mem (ID, C) IRest) -> false.

Subgoal 3.1:

Variables: ID Rest C A IRest
IH : forall K ID KRest,
       remove_all K ID KRest * -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
NEq : (exists C1, mem (ID, C1) ((A, C)::IRest)) -> false
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 (exists C1, mem (ID, C1) IRest) -> false
 < intros Ex.

Subgoal 3.1:

Variables: ID Rest C A IRest
IH : forall K ID KRest,
       remove_all K ID KRest * -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
NEq : (exists C1, mem (ID, C1) ((A, C)::IRest)) -> false
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
Ex : exists C1, mem (ID, C1) IRest
============================
 false
 < case Ex.

Subgoal 3.1:

Variables: ID Rest C A IRest C1
IH : forall K ID KRest,
       remove_all K ID KRest * -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
NEq : (exists C1, mem (ID, C1) ((A, C)::IRest)) -> false
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
H1 : mem (ID, C1) IRest
============================
 false
 < backchain NEq.

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall K ID KRest,
       remove_all K ID KRest * -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
NEq : (exists C1, mem (ID, C1) ((A, C)::IRest)) -> false
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
H1 : (exists C1, mem (ID, C1) IRest) -> false
============================
 (A, C)::IRest = (A, C)::Rest
 < apply IH to RA1 _.

Subgoal 3:

Variables: ID Rest C A
IH : forall K ID KRest,
       remove_all K ID KRest * -> ((exists C, mem (ID, C) K) -> false) -> K = KRest
NEq : (exists C1, mem (ID, C1) ((A, C)::Rest)) -> false
RA : A = ID -> false
RA1 : remove_all Rest ID Rest *
H1 : (exists C1, mem (ID, C1) Rest) -> false
============================
 (A, C)::Rest = (A, C)::Rest
 < search.

Proof completed.
 < Theorem remove_all_good_clause_list_select :
     forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA -> select (ID, C) KS K -> KRA = KS.

============================
 forall K ID KRA C KS,
   good_clause_list K -> remove_all K ID KRA -> select (ID, C) KS K -> KRA = KS
 < induction on 2.

IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
============================
 forall K ID KRA C KS,
   good_clause_list K -> remove_all K ID KRA @ -> select (ID, C) KS K -> KRA = KS
 < intros GCL RA Slct.

Variables: K ID KRA C KS
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list K
RA : remove_all K ID KRA @
Slct : select (ID, C) KS K
============================
 KRA = KS
 < RA: case RA.

Subgoal 1:

Variables: ID C KS
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list []
Slct : select (ID, C) KS []
============================
 [] = KS
 < case Slct.

Subgoal 2:

Variables: ID KRA C KS IRest C1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((ID, C1)::IRest)
Slct : select (ID, C) KS ((ID, C1)::IRest)
RA : remove_all IRest ID KRA *
============================
 KRA = KS
 < Slct: case Slct.

Subgoal 2.1:

Variables: ID KRA IRest C1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((ID, C1)::IRest)
RA : remove_all IRest ID KRA *
============================
 KRA = IRest
 < assert (exists C', mem (ID, C') IRest) -> false.

Subgoal 2.1.1:

Variables: ID KRA IRest C1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((ID, C1)::IRest)
RA : remove_all IRest ID KRA *
============================
 (exists C', mem (ID, C') IRest) -> false
 < intros Ex.

Subgoal 2.1.1:

Variables: ID KRA IRest C1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((ID, C1)::IRest)
RA : remove_all IRest ID KRA *
Ex : exists C', mem (ID, C') IRest
============================
 false
 < M: case Ex.

Subgoal 2.1.1:

Variables: ID KRA IRest C1 C'
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((ID, C1)::IRest)
RA : remove_all IRest ID KRA *
M : mem (ID, C') IRest
============================
 false
 < GCL: case GCL.

Subgoal 2.1.1:

Variables: ID KRA IRest C1 C'
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
RA : remove_all IRest ID KRA *
M : mem (ID, C') IRest
GCL : forall ID1 C2 KRest C3,
        select (ID1, C2) KRest ((ID, C1)::IRest) -> mem (ID1, C3) KRest -> false
============================
 false
 < backchain GCL.

Subgoal 2.1:

Variables: ID KRA IRest C1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((ID, C1)::IRest)
RA : remove_all IRest ID KRA *
H1 : (exists C', mem (ID, C') IRest) -> false
============================
 KRA = IRest
 < apply remove_all_no_mem_same to RA _.

Subgoal 2.1:

Variables: ID KRA C1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((ID, C1)::KRA)
RA : remove_all KRA ID KRA *
H1 : (exists C', mem (ID, C') KRA) -> false
============================
 KRA = KRA
 < search.

Subgoal 2.2:

Variables: ID KRA C IRest C1 L1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((ID, C1)::IRest)
RA : remove_all IRest ID KRA *
Slct : select (ID, C) L1 IRest
============================
 KRA = (ID, C1)::L1
 < M: apply select_mem to Slct.

Subgoal 2.2:

Variables: ID KRA C IRest C1 L1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((ID, C1)::IRest)
RA : remove_all IRest ID KRA *
Slct : select (ID, C) L1 IRest
M : mem (ID, C) IRest
============================
 KRA = (ID, C1)::L1
 < GCL: case GCL.

Subgoal 2.2:

Variables: ID KRA C IRest C1 L1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
RA : remove_all IRest ID KRA *
Slct : select (ID, C) L1 IRest
M : mem (ID, C) IRest
GCL : forall ID1 C2 KRest C3,
        select (ID1, C2) KRest ((ID, C1)::IRest) -> mem (ID1, C3) KRest -> false
============================
 KRA = (ID, C1)::L1
 < apply GCL to _ M.

Subgoal 3:

Variables: ID C KS Rest C1 A IRest
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((A, C1)::IRest)
Slct : select (ID, C) KS ((A, C1)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 (A, C1)::Rest = KS
 < Slct: case Slct.

Subgoal 3.1:

Variables: Rest C1 A IRest
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((A, C1)::IRest)
RA : A = A -> false
RA1 : remove_all IRest A Rest *
============================
 (A, C1)::Rest = IRest
 < apply RA to _.

Subgoal 3.2:

Variables: ID C Rest C1 A IRest L1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((A, C1)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
Slct : select (ID, C) L1 IRest
============================
 (A, C1)::Rest = (A, C1)::L1
 < apply good_clause_list_drop to GCL.

Subgoal 3.2:

Variables: ID C Rest C1 A IRest L1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((A, C1)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
Slct : select (ID, C) L1 IRest
H1 : good_clause_list IRest
============================
 (A, C1)::Rest = (A, C1)::L1
 < apply IH to _ RA1 Slct.

Subgoal 3.2:

Variables: ID C C1 A IRest L1
IH : forall K ID KRA C KS,
       good_clause_list K -> remove_all K ID KRA * -> select (ID, C) KS K -> KRA = KS
GCL : good_clause_list ((A, C1)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID L1 *
Slct : select (ID, C) L1 IRest
H1 : good_clause_list IRest
============================
 (A, C1)::L1 = (A, C1)::L1
 < search.

Proof completed.
 < Theorem remove_all_subset :
     forall K ID KRest, remove_all K ID KRest -> subset KRest K.

============================
 forall K ID KRest, remove_all K ID KRest -> subset KRest K
 < induction on 1.

IH : forall K ID KRest, remove_all K ID KRest * -> subset KRest K
============================
 forall K ID KRest, remove_all K ID KRest @ -> subset KRest K
 < intros RA.

Variables: K ID KRest
IH : forall K ID KRest, remove_all K ID KRest * -> subset KRest K
RA : remove_all K ID KRest @
============================
 subset KRest K
 < RA: case RA.

Subgoal 1:

Variables: ID
IH : forall K ID KRest, remove_all K ID KRest * -> subset KRest K
============================
 subset [] []
 < search.

Subgoal 2:

Variables: ID KRest IRest C
IH : forall K ID KRest, remove_all K ID KRest * -> subset KRest K
RA : remove_all IRest ID KRest *
============================
 subset KRest ((ID, C)::IRest)
 < S: apply IH to RA.

Subgoal 2:

Variables: ID KRest IRest C
IH : forall K ID KRest, remove_all K ID KRest * -> subset KRest K
RA : remove_all IRest ID KRest *
S : subset KRest IRest
============================
 subset KRest ((ID, C)::IRest)
 < backchain subset_add_right.

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall K ID KRest, remove_all K ID KRest * -> subset KRest K
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 subset ((A, C)::Rest) ((A, C)::IRest)
 < S: apply IH to RA1.

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall K ID KRest, remove_all K ID KRest * -> subset KRest K
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
S : subset Rest IRest
============================
 subset ((A, C)::Rest) ((A, C)::IRest)
 < apply subset_add_right to S with
     A = (A, C).

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall K ID KRest, remove_all K ID KRest * -> subset KRest K
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
S : subset Rest IRest
H1 : subset Rest ((A, C)::IRest)
============================
 subset ((A, C)::Rest) ((A, C)::IRest)
 < search.

Proof completed.
 < Theorem subset_values  [A, B] :
     forall (A : list (pair A B)) (B : list (pair A B)) VA VB,
       subset A B -> values A VA -> values B VB -> subset VA VB.

============================
 forall A B VA VB, subset A B -> values A VA -> values B VB -> subset VA VB
 < induction on 1.

IH : forall A B VA VB,
       subset A B * -> values A VA -> values B VB -> subset VA VB
============================
 forall A B VA VB, subset A B @ -> values A VA -> values B VB -> subset VA VB
 < intros S VA VB.

Variables: A B VA VB
IH : forall A B VA VB,
       subset A B * -> values A VA -> values B VB -> subset VA VB
S : subset A B @
VA : values A VA
VB : values B VB
============================
 subset VA VB
 < S: case S.

Subgoal 1:

Variables: B VA VB
IH : forall A B VA VB,
       subset A B * -> values A VA -> values B VB -> subset VA VB
VA : values [] VA
VB : values B VB
============================
 subset VA VB
 < case VA.

Subgoal 1:

Variables: B VB
IH : forall A B VA VB,
       subset A B * -> values A VA -> values B VB -> subset VA VB
VB : values B VB
============================
 subset [] VB
 < search.

Subgoal 2:

Variables: B VA VB Rest X
IH : forall A B VA VB,
       subset A B * -> values A VA -> values B VB -> subset VA VB
VA : values (X::Rest) VA
VB : values B VB
S : mem X B
S1 : subset Rest B *
============================
 subset VA VB
 < VA: case VA.

Subgoal 2:

Variables: B VB Rest VRest B1 A1
IH : forall A B VA VB,
       subset A B * -> values A VA -> values B VB -> subset VA VB
VB : values B VB
S : mem (A1, B1) B
S1 : subset Rest B *
VA : values Rest VRest
============================
 subset (B1::VRest) VB
 < apply IH to S1 VA VB.

Subgoal 2:

Variables: B VB Rest VRest B1 A1
IH : forall A B VA VB,
       subset A B * -> values A VA -> values B VB -> subset VA VB
VB : values B VB
S : mem (A1, B1) B
S1 : subset Rest B *
VA : values Rest VRest
H1 : subset VRest VB
============================
 subset (B1::VRest) VB
 < apply values_mem to S VB.

Subgoal 2:

Variables: B VB Rest VRest B1 A1
IH : forall A B VA VB,
       subset A B * -> values A VA -> values B VB -> subset VA VB
VB : values B VB
S : mem (A1, B1) B
S1 : subset Rest B *
VA : values Rest VRest
H1 : subset VRest VB
H2 : mem B1 VB
============================
 subset (B1::VRest) VB
 < search.

Proof completed.
 < Theorem values_exist :
     forall K, is_list (is_pair is_integer is_clause) K -> exists V, values K V.

============================
 forall K, is_list (is_pair is_integer is_clause) K -> exists V, values K V
 < induction on 1.

IH : forall K,
       is_list (is_pair is_integer is_clause) K * -> exists V, values K V
============================
 forall K, is_list (is_pair is_integer is_clause) K @ -> exists V, values K V
 < intros Is.

Variables: K
IH : forall K,
       is_list (is_pair is_integer is_clause) K * -> exists V, values K V
Is : is_list (is_pair is_integer is_clause) K @
============================
 exists V, values K V
 < Is: case Is.

Subgoal 1:

IH : forall K,
       is_list (is_pair is_integer is_clause) K * -> exists V, values K V
============================
 exists V, values [] V
 < search.

Subgoal 2:

Variables: T H
IH : forall K,
       is_list (is_pair is_integer is_clause) K * -> exists V, values K V
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
============================
 exists V, values (H::T) V
 < case Is.

Subgoal 2:

Variables: T B A
IH : forall K,
       is_list (is_pair is_integer is_clause) K * -> exists V, values K V
Is1 : is_list (is_pair is_integer is_clause) T *
H1 : is_integer A
H2 : is_clause B
============================
 exists V, values ((A, B)::T) V
 < apply IH to Is1.

Subgoal 2:

Variables: T B A V
IH : forall K,
       is_list (is_pair is_integer is_clause) K * -> exists V, values K V
Is1 : is_list (is_pair is_integer is_clause) T *
H1 : is_integer A
H2 : is_clause B
H3 : values T V
============================
 exists V, values ((A, B)::T) V
 < search.

Proof completed.
 < Theorem remove_all_unique :
     forall K ID KA KB, remove_all K ID KA -> remove_all K ID KB -> KA = KB.

============================
 forall K ID KA KB, remove_all K ID KA -> remove_all K ID KB -> KA = KB
 < induction on 1.

IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
============================
 forall K ID KA KB, remove_all K ID KA @ -> remove_all K ID KB -> KA = KB
 < intros RAA RAB.

Variables: K ID KA KB
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
RAA : remove_all K ID KA @
RAB : remove_all K ID KB
============================
 KA = KB
 < RAA: case RAA.

Subgoal 1:

Variables: ID KB
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
RAB : remove_all [] ID KB
============================
 [] = KB
 < case RAB.

Subgoal 1:

Variables: ID
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
============================
 [] = []
 < search.

Subgoal 2:

Variables: ID KA KB IRest C
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
RAB : remove_all ((ID, C)::IRest) ID KB
RAA : remove_all IRest ID KA *
============================
 KA = KB
 < RAB: case RAB.

Subgoal 2.1:

Variables: ID KA KB IRest C
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
RAA : remove_all IRest ID KA *
RAB : remove_all IRest ID KB
============================
 KA = KB
 < apply IH to RAA RAB.

Subgoal 2.1:

Variables: ID KB IRest C
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
RAA : remove_all IRest ID KB *
RAB : remove_all IRest ID KB
============================
 KB = KB
 < search.

Subgoal 2.2:

Variables: ID KA IRest C Rest
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
RAA : remove_all IRest ID KA *
RAB : ID = ID -> false
RAB1 : remove_all IRest ID Rest
============================
 KA = (ID, C)::Rest
 < apply RAB to _.

Subgoal 3:

Variables: ID KB Rest C A IRest
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
RAB : remove_all ((A, C)::IRest) ID KB
RAA : A = ID -> false
RAA1 : remove_all IRest ID Rest *
============================
 (A, C)::Rest = KB
 < RAB: case RAB.

Subgoal 3.1:

Variables: ID KB Rest C IRest
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
RAA : ID = ID -> false
RAA1 : remove_all IRest ID Rest *
RAB : remove_all IRest ID KB
============================
 (ID, C)::Rest = KB
 < apply RAA to _.

Subgoal 3.2:

Variables: ID Rest C A IRest Rest1
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
RAA : A = ID -> false
RAA1 : remove_all IRest ID Rest *
RAB : A = ID -> false
RAB1 : remove_all IRest ID Rest1
============================
 (A, C)::Rest = (A, C)::Rest1
 < apply IH to RAA1 RAB1.

Subgoal 3.2:

Variables: ID C A IRest Rest1
IH : forall K ID KA KB, remove_all K ID KA * -> remove_all K ID KB -> KA = KB
RAA : A = ID -> false
RAA1 : remove_all IRest ID Rest1 *
RAB : A = ID -> false
RAB1 : remove_all IRest ID Rest1
============================
 (A, C)::Rest1 = (A, C)::Rest1
 < search.

Proof completed.
 < Theorem drup_help_subset :
     forall KA C KB, drup_help KA C -> subset KA KB -> drup_help KB C.

============================
 forall KA C KB, drup_help KA C -> subset KA KB -> drup_help KB C
 < induction on 1.

IH : forall KA C KB, drup_help KA C * -> subset KA KB -> drup_help KB C
============================
 forall KA C KB, drup_help KA C @ -> subset KA KB -> drup_help KB C
 < intros D S.

Variables: KA C KB
IH : forall KA C KB, drup_help KA C * -> subset KA KB -> drup_help KB C
D : drup_help KA C @
S : subset KA KB
============================
 drup_help KB C
 < D: case D.

Subgoal 1:

Variables: KA C KB C1
IH : forall KA C KB, drup_help KA C * -> subset KA KB -> drup_help KB C
S : subset KA KB
D : mem C1 KA
D1 : unsat_clause C C1
============================
 drup_help KB C
 < apply subset_mem to S D.

Subgoal 1:

Variables: KA C KB C1
IH : forall KA C KB, drup_help KA C * -> subset KA KB -> drup_help KB C
S : subset KA KB
D : mem C1 KA
D1 : unsat_clause C C1
H1 : mem C1 KB
============================
 drup_help KB C
 < search.

Subgoal 2:

Variables: KA C KB C1 L
IH : forall KA C KB, drup_help KA C * -> subset KA KB -> drup_help KB C
S : subset KA KB
D : mem C1 KA
D1 : unit_clause C C1 L
D2 : drup_help KA (L::C) *
============================
 drup_help KB C
 < apply IH to D2 S.

Subgoal 2:

Variables: KA C KB C1 L
IH : forall KA C KB, drup_help KA C * -> subset KA KB -> drup_help KB C
S : subset KA KB
D : mem C1 KA
D1 : unit_clause C C1 L
D2 : drup_help KA (L::C) *
H1 : drup_help KB (L::C)
============================
 drup_help KB C
 < apply subset_mem to S D.

Subgoal 2:

Variables: KA C KB C1 L
IH : forall KA C KB, drup_help KA C * -> subset KA KB -> drup_help KB C
S : subset KA KB
D : mem C1 KA
D1 : unit_clause C C1 L
D2 : drup_help KA (L::C) *
H1 : drup_help KB (L::C)
H2 : mem C1 KB
============================
 drup_help KB C
 < search.

Proof completed.
 < Theorem drup_subset :
     forall KA C KB, drup KA C -> subset KA KB -> drup KB C.

============================
 forall KA C KB, drup KA C -> subset KA KB -> drup KB C
 < intros D S.

Variables: KA C KB
D : drup KA C
S : subset KA KB
============================
 drup KB C
 < D: case D.

Variables: KA C KB L NL
S : subset KA KB
D : gatherLits C L
D1 : negateLitList L NL
D2 : drup_help KA NL
============================
 drup KB C
 < apply drup_help_subset to D2 S.

Variables: KA C KB L NL
S : subset KA KB
D : gatherLits C L
D1 : negateLitList L NL
D2 : drup_help KA NL
H1 : drup_help KB NL
============================
 drup KB C
 < search.

Proof completed.
 < Theorem good_clause_list_selects :
     forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K -> select (ID, CB) KB K -> KA = KB.

============================
 forall K ID CA KA CB KB,
   good_clause_list K -> select (ID, CA) KA K -> select (ID, CB) KB K -> KA = KB
 < induction on 2.

IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
============================
 forall K ID CA KA CB KB,
   good_clause_list K -> select (ID, CA) KA K @ -> select (ID, CB) KB K -> KA = KB
 < intros GCL SA SB.

Variables: K ID CA KA CB KB
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
GCL : good_clause_list K
SA : select (ID, CA) KA K @
SB : select (ID, CB) KB K
============================
 KA = KB
 < SA: case SA.

Subgoal 1:

Variables: ID CA KA CB KB
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
GCL : good_clause_list ((ID, CA)::KA)
SB : select (ID, CB) KB ((ID, CA)::KA)
============================
 KA = KB
 < SB: case SB.

Subgoal 1.1:

Variables: ID CA KA
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
GCL : good_clause_list ((ID, CA)::KA)
============================
 KA = KA
 < search.

Subgoal 1.2:

Variables: ID CA KA CB L1
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
GCL : good_clause_list ((ID, CA)::KA)
SB : select (ID, CB) L1 KA
============================
 KA = (ID, CA)::L1
 < GCL: case GCL.

Subgoal 1.2:

Variables: ID CA KA CB L1
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
SB : select (ID, CB) L1 KA
GCL : forall ID1 C1 KRest C2,
        select (ID1, C1) KRest ((ID, CA)::KA) -> mem (ID1, C2) KRest -> false
============================
 KA = (ID, CA)::L1
 < M: apply select_mem to SB.

Subgoal 1.2:

Variables: ID CA KA CB L1
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
SB : select (ID, CB) L1 KA
GCL : forall ID1 C1 KRest C2,
        select (ID1, C1) KRest ((ID, CA)::KA) -> mem (ID1, C2) KRest -> false
M : mem (ID, CB) KA
============================
 KA = (ID, CA)::L1
 < apply GCL to _ M.

Subgoal 2:

Variables: ID CA CB KB L2 I L1
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
GCL : good_clause_list (I::L2)
SB : select (ID, CB) KB (I::L2)
SA : select (ID, CA) L1 L2 *
============================
 I::L1 = KB
 < SB: case SB.

Subgoal 2.1:

Variables: ID CA CB L2 L1
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
GCL : good_clause_list ((ID, CB)::L2)
SA : select (ID, CA) L1 L2 *
============================
 (ID, CB)::L1 = L2
 < GCL: case GCL.

Subgoal 2.1:

Variables: ID CA CB L2 L1
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
SA : select (ID, CA) L1 L2 *
GCL : forall ID1 C1 KRest C2,
        select (ID1, C1) KRest ((ID, CB)::L2) -> mem (ID1, C2) KRest -> false
============================
 (ID, CB)::L1 = L2
 < M: apply select_mem to SA.

Subgoal 2.1:

Variables: ID CA CB L2 L1
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
SA : select (ID, CA) L1 L2 *
GCL : forall ID1 C1 KRest C2,
        select (ID1, C1) KRest ((ID, CB)::L2) -> mem (ID1, C2) KRest -> false
M : mem (ID, CA) L2
============================
 (ID, CB)::L1 = L2
 < apply GCL to _ M.

Subgoal 2.2:

Variables: ID CA CB L2 I L1 L3
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
GCL : good_clause_list (I::L2)
SA : select (ID, CA) L1 L2 *
SB : select (ID, CB) L3 L2
============================
 I::L1 = I::L3
 < apply good_clause_list_drop to GCL.

Subgoal 2.2:

Variables: ID CA CB L2 I L1 L3
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
GCL : good_clause_list (I::L2)
SA : select (ID, CA) L1 L2 *
SB : select (ID, CB) L3 L2
H1 : good_clause_list L2
============================
 I::L1 = I::L3
 < apply IH to _ SA SB.

Subgoal 2.2:

Variables: ID CA CB L2 I L3
IH : forall K ID CA KA CB KB,
       good_clause_list K -> select (ID, CA) KA K * -> select (ID, CB) KB K -> KA = KB
GCL : good_clause_list (I::L2)
SA : select (ID, CA) L3 L2 *
SB : select (ID, CB) L3 L2
H1 : good_clause_list L2
============================
 I::L3 = I::L3
 < search.

Proof completed.
 < Theorem values_is :
     forall K V,
       is_list (is_pair is_integer is_clause) K -> values K V -> is_list is_clause V.

============================
 forall K V,
   is_list (is_pair is_integer is_clause) K -> values K V -> is_list is_clause V
 < induction on 2.

IH : forall K V,
       is_list (is_pair is_integer is_clause) K -> values K V * -> is_list is_clause V
============================
 forall K V,
   is_list (is_pair is_integer is_clause) K -> values K V @ -> is_list is_clause V
 < intros IsK V.

Variables: K V
IH : forall K V,
       is_list (is_pair is_integer is_clause) K -> values K V * -> is_list is_clause V
IsK : is_list (is_pair is_integer is_clause) K
V : values K V @
============================
 is_list is_clause V
 < V: case V.

Subgoal 1:

IH : forall K V,
       is_list (is_pair is_integer is_clause) K -> values K V * -> is_list is_clause V
IsK : is_list (is_pair is_integer is_clause) []
============================
 is_list is_clause []
 < search.

Subgoal 2:

Variables: VRest B Rest A
IH : forall K V,
       is_list (is_pair is_integer is_clause) K -> values K V * -> is_list is_clause V
IsK : is_list (is_pair is_integer is_clause) ((A, B)::Rest)
V : values Rest VRest *
============================
 is_list is_clause (B::VRest)
 < Is: case IsK.

Subgoal 2:

Variables: VRest B Rest A
IH : forall K V,
       is_list (is_pair is_integer is_clause) K -> values K V * -> is_list is_clause V
V : values Rest VRest *
Is : is_pair is_integer is_clause (A, B)
Is1 : is_list (is_pair is_integer is_clause) Rest
============================
 is_list is_clause (B::VRest)
 < apply IH to Is1 V.

Subgoal 2:

Variables: VRest B Rest A
IH : forall K V,
       is_list (is_pair is_integer is_clause) K -> values K V * -> is_list is_clause V
V : values Rest VRest *
Is : is_pair is_integer is_clause (A, B)
Is1 : is_list (is_pair is_integer is_clause) Rest
H1 : is_list is_clause VRest
============================
 is_list is_clause (B::VRest)
 < case Is.

Subgoal 2:

Variables: VRest B Rest A
IH : forall K V,
       is_list (is_pair is_integer is_clause) K -> values K V * -> is_list is_clause V
V : values Rest VRest *
Is1 : is_list (is_pair is_integer is_clause) Rest
H1 : is_list is_clause VRest
H2 : is_integer A
H3 : is_clause B
============================
 is_list is_clause (B::VRest)
 < search.

Proof completed.
 < Theorem select_is_clause :
     forall Known KRest IDC,
       is_list is_clause Known -> select IDC KRest Known -> is_list is_clause KRest.

============================
 forall Known KRest IDC,
   is_list is_clause Known -> select IDC KRest Known -> is_list is_clause KRest
 < induction on 2.

IH : forall Known KRest IDC,
       is_list is_clause Known -> select IDC KRest Known * -> is_list is_clause KRest
============================
 forall Known KRest IDC,
   is_list is_clause Known -> select IDC KRest Known @ -> is_list is_clause KRest
 < intros Is Slct.

Variables: Known KRest IDC
IH : forall Known KRest IDC,
       is_list is_clause Known -> select IDC KRest Known * -> is_list is_clause KRest
Is : is_list is_clause Known
Slct : select IDC KRest Known @
============================
 is_list is_clause KRest
 < Slct: case Slct.

Subgoal 1:

Variables: KRest IDC
IH : forall Known KRest IDC,
       is_list is_clause Known -> select IDC KRest Known * -> is_list is_clause KRest
Is : is_list is_clause (IDC::KRest)
============================
 is_list is_clause KRest
 < case Is.

Subgoal 1:

Variables: KRest IDC
IH : forall Known KRest IDC,
       is_list is_clause Known -> select IDC KRest Known * -> is_list is_clause KRest
H1 : is_clause IDC
H2 : is_list is_clause KRest
============================
 is_list is_clause KRest
 < search.

Subgoal 2:

Variables: IDC L2 I L1
IH : forall Known KRest IDC,
       is_list is_clause Known -> select IDC KRest Known * -> is_list is_clause KRest
Is : is_list is_clause (I::L2)
Slct : select IDC L1 L2 *
============================
 is_list is_clause (I::L1)
 < Is: case Is.

Subgoal 2:

Variables: IDC L2 I L1
IH : forall Known KRest IDC,
       is_list is_clause Known -> select IDC KRest Known * -> is_list is_clause KRest
Slct : select IDC L1 L2 *
Is : is_clause I
Is1 : is_list is_clause L2
============================
 is_list is_clause (I::L1)
 < apply IH to _ Slct.

Subgoal 2:

Variables: IDC L2 I L1
IH : forall Known KRest IDC,
       is_list is_clause Known -> select IDC KRest Known * -> is_list is_clause KRest
Slct : select IDC L1 L2 *
Is : is_clause I
Is1 : is_list is_clause L2
H1 : is_list is_clause L1
============================
 is_list is_clause (I::L1)
 < search.

Proof completed.
 < Theorem mem_is_clause :
     forall Known C, is_list is_clause Known -> mem C Known -> is_clause C.

============================
 forall Known C, is_list is_clause Known -> mem C Known -> is_clause C
 < induction on 2.

IH : forall Known C, is_list is_clause Known -> mem C Known * -> is_clause C
============================
 forall Known C, is_list is_clause Known -> mem C Known @ -> is_clause C
 < intros Is Mem.

Variables: Known C
IH : forall Known C, is_list is_clause Known -> mem C Known * -> is_clause C
Is : is_list is_clause Known
Mem : mem C Known @
============================
 is_clause C
 < Mem: case Mem.

Subgoal 1:

Variables: C Rest
IH : forall Known C, is_list is_clause Known -> mem C Known * -> is_clause C
Is : is_list is_clause (C::Rest)
============================
 is_clause C
 < Is: case Is.

Subgoal 1:

Variables: C Rest
IH : forall Known C, is_list is_clause Known -> mem C Known * -> is_clause C
Is : is_clause C
Is1 : is_list is_clause Rest
============================
 is_clause C
 < search.

Subgoal 2:

Variables: C Rest I
IH : forall Known C, is_list is_clause Known -> mem C Known * -> is_clause C
Is : is_list is_clause (I::Rest)
Mem : mem C Rest *
============================
 is_clause C
 < Is: case Is.

Subgoal 2:

Variables: C Rest I
IH : forall Known C, is_list is_clause Known -> mem C Known * -> is_clause C
Mem : mem C Rest *
Is : is_clause I
Is1 : is_list is_clause Rest
============================
 is_clause C
 < apply IH to _ Mem.

Subgoal 2:

Variables: C Rest I
IH : forall Known C, is_list is_clause Known -> mem C Known * -> is_clause C
Mem : mem C Rest *
Is : is_clause I
Is1 : is_list is_clause Rest
H1 : is_clause C
============================
 is_clause C
 < search.

Proof completed.
 < Theorem is_count_exists_clause :
     forall L C, is_list is_clause L -> is_clause C -> exists N, count C L N.

============================
 forall L C, is_list is_clause L -> is_clause C -> exists N, count C L N
 < induction on 1.

IH : forall L C, is_list is_clause L * -> is_clause C -> exists N, count C L N
============================
 forall L C, is_list is_clause L @ -> is_clause C -> exists N, count C L N
 < intros IsL IsC.

Variables: L C
IH : forall L C, is_list is_clause L * -> is_clause C -> exists N, count C L N
IsL : is_list is_clause L @
IsC : is_clause C
============================
 exists N, count C L N
 < Is: case IsL.

Subgoal 1:

Variables: C
IH : forall L C, is_list is_clause L * -> is_clause C -> exists N, count C L N
IsC : is_clause C
============================
 exists N, count C [] N
 < search.

Subgoal 2:

Variables: C T H
IH : forall L C, is_list is_clause L * -> is_clause C -> exists N, count C L N
IsC : is_clause C
Is : is_clause H
Is1 : is_list is_clause T *
============================
 exists N, count C (H::T) N
 < Or: apply is_clause_eq_or_not to IsC Is.

Subgoal 2:

Variables: C T H
IH : forall L C, is_list is_clause L * -> is_clause C -> exists N, count C L N
IsC : is_clause C
Is : is_clause H
Is1 : is_list is_clause T *
Or : C = H \/ (C = H -> false)
============================
 exists N, count C (H::T) N
 < C: apply IH to Is1 IsC.

Subgoal 2:

Variables: C T H N
IH : forall L C, is_list is_clause L * -> is_clause C -> exists N, count C L N
IsC : is_clause C
Is : is_clause H
Is1 : is_list is_clause T *
Or : C = H \/ (C = H -> false)
C : count C T N
============================
 exists N, count C (H::T) N
 < Eq: case Or.

Subgoal 2.1:

Variables: T H N
IH : forall L C, is_list is_clause L * -> is_clause C -> exists N, count C L N
IsC : is_clause H
Is : is_clause H
Is1 : is_list is_clause T *
C : count H T N
============================
 exists N, count H (H::T) N
 < IsN: apply count_is_integer to C.

Subgoal 2.1:

Variables: T H N
IH : forall L C, is_list is_clause L * -> is_clause C -> exists N, count C L N
IsC : is_clause H
Is : is_clause H
Is1 : is_list is_clause T *
C : count H T N
IsN : is_integer N
============================
 exists N, count H (H::T) N
 < apply plus_integer_total to _ IsN with
     N1 = 1.

Subgoal 2.1:

Variables: T H N N3
IH : forall L C, is_list is_clause L * -> is_clause C -> exists N, count C L N
IsC : is_clause H
Is : is_clause H
Is1 : is_list is_clause T *
C : count H T N
IsN : is_integer N
H1 : 1 + N = N3
============================
 exists N, count H (H::T) N
 < search.

Subgoal 2.2:

Variables: C T H N
IH : forall L C, is_list is_clause L * -> is_clause C -> exists N, count C L N
IsC : is_clause C
Is : is_clause H
Is1 : is_list is_clause T *
C : count C T N
Eq : C = H -> false
============================
 exists N, count C (H::T) N
 < search.

Proof completed.
 < Theorem counts_drop_head  [A] :
     forall (H : A) T X N N', count X (H::T) N -> count X T N' -> N >= N'.

============================
 forall H T X N N', count X (H::T) N -> count X T N' -> N >= N'
 < intros C CT.

Variables: H T X N N'
C : count X (H::T) N
CT : count X T N'
============================
 N >= N'
 < C: case C.

Subgoal 1:

Variables: H T N N' N1
CT : count H T N'
C : count H T N1
C1 : 1 + N1 = N
============================
 N >= N'
 < apply count_unique to C CT.

Subgoal 1:

Variables: H T N N'
CT : count H T N'
C : count H T N'
C1 : 1 + N' = N
============================
 N >= N'
 < apply count_is_integer to C.

Subgoal 1:

Variables: H T N N'
CT : count H T N'
C : count H T N'
C1 : 1 + N' = N
H1 : is_integer N'
============================
 N >= N'
 < L: apply lt_plus_one to C1 _.

Subgoal 1:

Variables: H T N N'
CT : count H T N'
C : count H T N'
C1 : 1 + N' = N
H1 : is_integer N'
L : N' < N
============================
 N >= N'
 < apply less_integer_lesseq to L.

Subgoal 1:

Variables: H T N N'
CT : count H T N'
C : count H T N'
C1 : 1 + N' = N
H1 : is_integer N'
L : N' < N
H2 : N' <= N
============================
 N >= N'
 < search.

Subgoal 2:

Variables: H T X N N'
CT : count X T N'
C : X = H -> false
C1 : count X T N
============================
 N >= N'
 < apply count_unique to CT C1.

Subgoal 2:

Variables: H T X N
CT : count X T N
C : X = H -> false
C1 : count X T N
============================
 N >= N
 < apply count_is_integer to CT.

Subgoal 2:

Variables: H T X N
CT : count X T N
C : X = H -> false
C1 : count X T N
H1 : is_integer N
============================
 N >= N
 < backchain is_integer_greatereq.

Proof completed.
 < Theorem counts_subset :
     forall A B,
       is_list is_clause A -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B.

============================
 forall A B,
   is_list is_clause A -> is_list is_clause B -> (forall C NA NB,
     count C A NA -> count C B NB -> NB >= NA) -> subset A B
 < induction on 1.

IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
============================
 forall A B,
   is_list is_clause A @ -> is_list is_clause B -> (forall C NA NB,
     count C A NA -> count C B NB -> NB >= NA) -> subset A B
 < intros IsA IsB Counts.

Variables: A B
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsA : is_list is_clause A @
IsB : is_list is_clause B
Counts : forall C NA NB, count C A NA -> count C B NB -> NB >= NA
============================
 subset A B
 < IsA: case IsA.

Subgoal 1:

Variables: B
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C [] NA -> count C B NB -> NB >= NA
============================
 subset [] B
 < search.

Subgoal 2:

Variables: B T H
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
============================
 subset (H::T) B
 < CA: apply is_count_exists_clause to IsA1 IsA.

Subgoal 2:

Variables: B T H N
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
============================
 subset (H::T) B
 < IsN: apply count_is_integer to CA.

Subgoal 2:

Variables: B T H N
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
============================
 subset (H::T) B
 < P: apply plus_integer_total to _ IsN with
        N1 = 1.

Subgoal 2:

Variables: B T H N N3
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
============================
 subset (H::T) B
 < CB: apply is_count_exists_clause to IsB IsA.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
============================
 subset (H::T) B
 < CAA: assert count H (H::T) N3.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
============================
 subset (H::T) B
 < GEq: apply Counts to CAA CB.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
============================
 subset (H::T) B
 < IsN: apply count_is_integer to CA.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
============================
 subset (H::T) B
 < N0: apply count_geq_0 to CA.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
============================
 subset (H::T) B
 < NN3: apply lt_plus_one to P _.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
============================
 subset (H::T) B
 < G: assert N3 > 0.

Subgoal 2.1:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
============================
 N3 > 0
 < Or: apply greatereq_integer_greater_or_eq to N0.

Subgoal 2.1:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
Or : N > 0 \/ N = 0
============================
 N3 > 0
 < G: case Or.

Subgoal 2.1.1:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N > 0
============================
 N3 > 0
 < G2: apply less_integer_flip_greater to NN3.

Subgoal 2.1.1:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N > 0
G2 : N3 > N
============================
 N3 > 0
 < apply greater_integer_transitive to G2 G.

Subgoal 2.1.1:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N > 0
G2 : N3 > N
H1 : N3 > 0
============================
 N3 > 0
 < search.

Subgoal 2.1.2:

Variables: B T H N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T 0
IsN : is_integer 0
P : 1 + 0 = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer 0
N0 : 0 >= 0
NN3 : 0 < N3
============================
 N3 > 0
 < apply less_integer_flip_greater to NN3.

Subgoal 2.1.2:

Variables: B T H N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T 0
IsN : is_integer 0
P : 1 + 0 = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer 0
N0 : 0 >= 0
NN3 : 0 < N3
H1 : N3 > 0
============================
 N3 > 0
 < search.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
============================
 subset (H::T) B
 < N10: assert N1 > 0.

Subgoal 2.2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
============================
 N1 > 0
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 2.2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
Or : N1 > N3 \/ N1 = N3
============================
 N1 > 0
 < E: case Or.

Subgoal 2.2.1:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
E : N1 > N3
============================
 N1 > 0
 < apply greater_integer_transitive to E G.

Subgoal 2.2.1:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
E : N1 > N3
H1 : N1 > 0
============================
 N1 > 0
 < search.

Subgoal 2.2.2:

Variables: B T H N N3
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N3
CAA : count H (H::T) N3
GEq : N3 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
============================
 N3 > 0
 < search.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
============================
 subset (H::T) B
 < MHB: apply count_mem to CB N10.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
============================
 subset (H::T) B
 < assert forall C NA NB,
     count C T NA -> count C B NB -> NB >= NA.

Subgoal 2.3:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
============================
 forall C NA NB, count C T NA -> count C B NB -> NB >= NA
 < intros CT CB'.

Subgoal 2.3:

Variables: B T H N N3 N1 C NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count C T NA
CB' : count C B NB
============================
 NB >= NA
 < GEqNA: apply count_geq_0 to CT.

Subgoal 2.3:

Variables: B T H N N3 N1 C NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count C T NA
CB' : count C B NB
GEqNA : NA >= 0
============================
 NB >= NA
 < Or: apply greatereq_integer_greater_or_eq to GEqNA.

Subgoal 2.3:

Variables: B T H N N3 N1 C NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count C T NA
CB' : count C B NB
GEqNA : NA >= 0
Or : NA > 0 \/ NA = 0
============================
 NB >= NA
 < E: case Or.

Subgoal 2.3.1:

Variables: B T H N N3 N1 C NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count C T NA
CB' : count C B NB
GEqNA : NA >= 0
E : NA > 0
============================
 NB >= NA
 < M: apply count_mem to CT E.

Subgoal 2.3.1:

Variables: B T H N N3 N1 C NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count C T NA
CB' : count C B NB
GEqNA : NA >= 0
E : NA > 0
M : mem C T
============================
 NB >= NA
 < IsC: apply mem_is_clause to _ M.

Subgoal 2.3.1:

Variables: B T H N N3 N1 C NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count C T NA
CB' : count C B NB
GEqNA : NA >= 0
E : NA > 0
M : mem C T
IsC : is_clause C
============================
 NB >= NA
 < Or: apply is_clause_eq_or_not to IsC IsA.

Subgoal 2.3.1:

Variables: B T H N N3 N1 C NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count C T NA
CB' : count C B NB
GEqNA : NA >= 0
E : NA > 0
M : mem C T
IsC : is_clause C
Or : C = H \/ (C = H -> false)
============================
 NB >= NA
 < Eq: case Or.

Subgoal 2.3.1.1:

Variables: B T H N N3 N1 NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count H T NA
CB' : count H B NB
GEqNA : NA >= 0
E : NA > 0
M : mem H T
IsC : is_clause H
============================
 NB >= NA
 < apply count_unique to CA CT.

Subgoal 2.3.1.1:

Variables: B T H N3 N1 NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T NA
IsN : is_integer NA
P : 1 + NA = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer NA
N0 : NA >= 0
NN3 : NA < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count H T NA
CB' : count H B NB
GEqNA : NA >= 0
E : NA > 0
M : mem H T
IsC : is_clause H
============================
 NB >= NA
 < apply count_unique to CB CB'.

Subgoal 2.3.1.1:

Variables: B T H N3 NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T NA
IsN : is_integer NA
P : 1 + NA = N3
CB : count H B NB
CAA : count H (H::T) N3
GEq : NB >= N3
IsN1 : is_integer NA
N0 : NA >= 0
NN3 : NA < N3
G : N3 > 0
N10 : NB > 0
MHB : mem H B
CT : count H T NA
CB' : count H B NB
GEqNA : NA >= 0
E : NA > 0
M : mem H T
IsC : is_clause H
============================
 NB >= NA
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 2.3.1.1:

Variables: B T H N3 NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T NA
IsN : is_integer NA
P : 1 + NA = N3
CB : count H B NB
CAA : count H (H::T) N3
GEq : NB >= N3
IsN1 : is_integer NA
N0 : NA >= 0
NN3 : NA < N3
G : N3 > 0
N10 : NB > 0
MHB : mem H B
CT : count H T NA
CB' : count H B NB
GEqNA : NA >= 0
E : NA > 0
M : mem H T
IsC : is_clause H
Or : NB > N3 \/ NB = N3
============================
 NB >= NA
 < C: case Or.

Subgoal 2.3.1.1.1:

Variables: B T H N3 NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T NA
IsN : is_integer NA
P : 1 + NA = N3
CB : count H B NB
CAA : count H (H::T) N3
GEq : NB >= N3
IsN1 : is_integer NA
N0 : NA >= 0
NN3 : NA < N3
G : N3 > 0
N10 : NB > 0
MHB : mem H B
CT : count H T NA
CB' : count H B NB
GEqNA : NA >= 0
E : NA > 0
M : mem H T
IsC : is_clause H
C : NB > N3
============================
 NB >= NA
 < L: apply greater_integer_flip_less to C.

Subgoal 2.3.1.1.1:

Variables: B T H N3 NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T NA
IsN : is_integer NA
P : 1 + NA = N3
CB : count H B NB
CAA : count H (H::T) N3
GEq : NB >= N3
IsN1 : is_integer NA
N0 : NA >= 0
NN3 : NA < N3
G : N3 > 0
N10 : NB > 0
MHB : mem H B
CT : count H T NA
CB' : count H B NB
GEqNA : NA >= 0
E : NA > 0
M : mem H T
IsC : is_clause H
C : NB > N3
L : N3 < NB
============================
 NB >= NA
 < L': apply less_integer_transitive to NN3 L.

Subgoal 2.3.1.1.1:

Variables: B T H N3 NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T NA
IsN : is_integer NA
P : 1 + NA = N3
CB : count H B NB
CAA : count H (H::T) N3
GEq : NB >= N3
IsN1 : is_integer NA
N0 : NA >= 0
NN3 : NA < N3
G : N3 > 0
N10 : NB > 0
MHB : mem H B
CT : count H T NA
CB' : count H B NB
GEqNA : NA >= 0
E : NA > 0
M : mem H T
IsC : is_clause H
C : NB > N3
L : N3 < NB
L' : NA < NB
============================
 NB >= NA
 < apply less_integer_lesseq to L'.

Subgoal 2.3.1.1.1:

Variables: B T H N3 NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T NA
IsN : is_integer NA
P : 1 + NA = N3
CB : count H B NB
CAA : count H (H::T) N3
GEq : NB >= N3
IsN1 : is_integer NA
N0 : NA >= 0
NN3 : NA < N3
G : N3 > 0
N10 : NB > 0
MHB : mem H B
CT : count H T NA
CB' : count H B NB
GEqNA : NA >= 0
E : NA > 0
M : mem H T
IsC : is_clause H
C : NB > N3
L : N3 < NB
L' : NA < NB
H1 : NA <= NB
============================
 NB >= NA
 < search.

Subgoal 2.3.1.1.2:

Variables: B T H N3 NA
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T NA
IsN : is_integer NA
P : 1 + NA = N3
CB : count H B N3
CAA : count H (H::T) N3
GEq : N3 >= N3
IsN1 : is_integer NA
N0 : NA >= 0
NN3 : NA < N3
G : N3 > 0
N10 : N3 > 0
MHB : mem H B
CT : count H T NA
CB' : count H B N3
GEqNA : NA >= 0
E : NA > 0
M : mem H T
IsC : is_clause H
============================
 N3 >= NA
 < apply less_integer_lesseq to NN3.

Subgoal 2.3.1.1.2:

Variables: B T H N3 NA
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T NA
IsN : is_integer NA
P : 1 + NA = N3
CB : count H B N3
CAA : count H (H::T) N3
GEq : N3 >= N3
IsN1 : is_integer NA
N0 : NA >= 0
NN3 : NA < N3
G : N3 > 0
N10 : N3 > 0
MHB : mem H B
CT : count H T NA
CB' : count H B N3
GEqNA : NA >= 0
E : NA > 0
M : mem H T
IsC : is_clause H
H1 : NA <= N3
============================
 N3 >= NA
 < search.

Subgoal 2.3.1.2:

Variables: B T H N N3 N1 C NA NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count C T NA
CB' : count C B NB
GEqNA : NA >= 0
E : NA > 0
M : mem C T
IsC : is_clause C
Eq : C = H -> false
============================
 NB >= NA
 < backchain Counts.

Subgoal 2.3.2:

Variables: B T H N N3 N1 C NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count C T 0
CB' : count C B NB
GEqNA : 0 >= 0
============================
 NB >= 0
 < apply count_geq_0 to CB'.

Subgoal 2.3.2:

Variables: B T H N N3 N1 C NB
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
CT : count C T 0
CB' : count C B NB
GEqNA : 0 >= 0
H1 : NB >= 0
============================
 NB >= 0
 < search.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
H1 : forall C NA NB, count C T NA -> count C B NB -> NB >= NA
============================
 subset (H::T) B
 < apply IH to IsA1 IsB _.

Subgoal 2:

Variables: B T H N N3 N1
IH : forall A B,
       is_list is_clause A * -> is_list is_clause B -> (forall C NA NB,
         count C A NA -> count C B NB -> NB >= NA) -> subset A B
IsB : is_list is_clause B
Counts : forall C NA NB, count C (H::T) NA -> count C B NB -> NB >= NA
IsA : is_clause H
IsA1 : is_list is_clause T *
CA : count H T N
IsN : is_integer N
P : 1 + N = N3
CB : count H B N1
CAA : count H (H::T) N3
GEq : N1 >= N3
IsN1 : is_integer N
N0 : N >= 0
NN3 : N < N3
G : N3 > 0
N10 : N1 > 0
MHB : mem H B
H1 : forall C NA NB, count C T NA -> count C B NB -> NB >= NA
H2 : subset T B
============================
 subset (H::T) B
 < search.

Proof completed.
 < Theorem remove_all_reduce_counts :
     forall K ID KRest V VR X N N',
       remove_all K ID KRest -> values K V -> values KRest VR -> count X V N -> count X VR N' ->
       N >= N'.

============================
 forall K ID KRest V VR X N N',
   remove_all K ID KRest -> values K V -> values KRest VR -> count X V N -> count X VR N' ->
   N >= N'
 < induction on 1.

IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
============================
 forall K ID KRest V VR X N N',
   remove_all K ID KRest @ -> values K V -> values KRest VR -> count X V N -> count X VR N' ->
   N >= N'
 < intros RA VK VKR CV CVR.

Variables: K ID KRest V VR X N N'
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : remove_all K ID KRest @
VK : values K V
VKR : values KRest VR
CV : count X V N
CVR : count X VR N'
============================
 N >= N'
 < RA: case RA.

Subgoal 1:

Variables: ID V VR X N N'
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VK : values [] V
VKR : values [] VR
CV : count X V N
CVR : count X VR N'
============================
 N >= N'
 < case VK.

Subgoal 1:

Variables: ID VR X N N'
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values [] VR
CV : count X [] N
CVR : count X VR N'
============================
 N >= N'
 < case VKR.

Subgoal 1:

Variables: ID X N N'
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
CV : count X [] N
CVR : count X [] N'
============================
 N >= N'
 < case CV.

Subgoal 1:

Variables: ID X N'
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
CVR : count X [] N'
============================
 0 >= N'
 < case CVR.

Subgoal 1:

Variables: ID X
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
============================
 0 >= 0
 < search.

Subgoal 2:

Variables: ID KRest V VR X N N' IRest C
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VK : values ((ID, C)::IRest) V
VKR : values KRest VR
CV : count X V N
CVR : count X VR N'
RA : remove_all IRest ID KRest *
============================
 N >= N'
 < VK: case VK.

Subgoal 2:

Variables: ID KRest VR X N N' IRest C VRest
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CV : count X (C::VRest) N
CVR : count X VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
============================
 N >= N'
 < CV: case CV.

Subgoal 2.1:

Variables: ID KRest VR N N' IRest C VRest N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N1
CV1 : 1 + N1 = N
============================
 N >= N'
 < GEq: apply IH to RA VK VKR CV CVR.

Subgoal 2.1:

Variables: ID KRest VR N N' IRest C VRest N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N1
CV1 : 1 + N1 = N
GEq : N1 >= N'
============================
 N >= N'
 < apply count_is_integer to CV.

Subgoal 2.1:

Variables: ID KRest VR N N' IRest C VRest N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N1
CV1 : 1 + N1 = N
GEq : N1 >= N'
H1 : is_integer N1
============================
 N >= N'
 < L: apply lt_plus_one to CV1 _.

Subgoal 2.1:

Variables: ID KRest VR N N' IRest C VRest N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N1
CV1 : 1 + N1 = N
GEq : N1 >= N'
H1 : is_integer N1
L : N1 < N
============================
 N >= N'
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 2.1:

Variables: ID KRest VR N N' IRest C VRest N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N1
CV1 : 1 + N1 = N
GEq : N1 >= N'
H1 : is_integer N1
L : N1 < N
Or : N1 > N' \/ N1 = N'
============================
 N >= N'
 < E: case Or.

Subgoal 2.1.1:

Variables: ID KRest VR N N' IRest C VRest N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N1
CV1 : 1 + N1 = N
GEq : N1 >= N'
H1 : is_integer N1
L : N1 < N
E : N1 > N'
============================
 N >= N'
 < L': apply greater_integer_flip_less to E.

Subgoal 2.1.1:

Variables: ID KRest VR N N' IRest C VRest N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N1
CV1 : 1 + N1 = N
GEq : N1 >= N'
H1 : is_integer N1
L : N1 < N
E : N1 > N'
L' : N' < N1
============================
 N >= N'
 < L2: apply less_integer_transitive to L' L.

Subgoal 2.1.1:

Variables: ID KRest VR N N' IRest C VRest N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N1
CV1 : 1 + N1 = N
GEq : N1 >= N'
H1 : is_integer N1
L : N1 < N
E : N1 > N'
L' : N' < N1
L2 : N' < N
============================
 N >= N'
 < apply less_integer_lesseq to L2.

Subgoal 2.1.1:

Variables: ID KRest VR N N' IRest C VRest N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N1
CV1 : 1 + N1 = N
GEq : N1 >= N'
H1 : is_integer N1
L : N1 < N
E : N1 > N'
L' : N' < N1
L2 : N' < N
H2 : N' <= N
============================
 N >= N'
 < search.

Subgoal 2.1.2:

Variables: ID KRest VR N N' IRest C VRest
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N'
CV1 : 1 + N' = N
GEq : N' >= N'
H1 : is_integer N'
L : N' < N
============================
 N >= N'
 < apply less_integer_lesseq to L.

Subgoal 2.1.2:

Variables: ID KRest VR N N' IRest C VRest
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count C VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : count C VRest N'
CV1 : 1 + N' = N
GEq : N' >= N'
H1 : is_integer N'
L : N' < N
H2 : N' <= N
============================
 N >= N'
 < search.

Subgoal 2.2:

Variables: ID KRest VR X N N' IRest C VRest
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count X VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : X = C -> false
CV1 : count X VRest N
============================
 N >= N'
 < apply IH to RA VK VKR CV1 CVR.

Subgoal 2.2:

Variables: ID KRest VR X N N' IRest C VRest
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values KRest VR
CVR : count X VR N'
RA : remove_all IRest ID KRest *
VK : values IRest VRest
CV : X = C -> false
CV1 : count X VRest N
H1 : N >= N'
============================
 N >= N'
 < search.

Subgoal 3:

Variables: ID V VR X N N' Rest C A IRest
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VK : values ((A, C)::IRest) V
VKR : values ((A, C)::Rest) VR
CV : count X V N
CVR : count X VR N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 N >= N'
 < VK: case VK.

Subgoal 3:

Variables: ID VR X N N' Rest C A IRest VRest
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
VKR : values ((A, C)::Rest) VR
CV : count X (C::VRest) N
CVR : count X VR N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
============================
 N >= N'
 < VKR: case VKR.

Subgoal 3:

Variables: ID X N N' Rest C A IRest VRest VRest1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
CV : count X (C::VRest) N
CVR : count X (C::VRest1) N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
============================
 N >= N'
 < CV: case CV.

Subgoal 3.1:

Variables: ID N N' Rest C A IRest VRest VRest1 N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
CVR : count C (C::VRest1) N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N1
CV1 : 1 + N1 = N
============================
 N >= N'
 < CVR: case CVR.

Subgoal 3.1.1:

Variables: ID N N' Rest C A IRest VRest VRest1 N1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N1
CV1 : 1 + N1 = N
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
============================
 N >= N'
 < GEq: apply IH to RA1 VK VKR CV CVR.

Subgoal 3.1.1:

Variables: ID N N' Rest C A IRest VRest VRest1 N1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N1
CV1 : 1 + N1 = N
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
GEq : N1 >= N2
============================
 N >= N'
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 3.1.1:

Variables: ID N N' Rest C A IRest VRest VRest1 N1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N1
CV1 : 1 + N1 = N
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
GEq : N1 >= N2
Or : N1 > N2 \/ N1 = N2
============================
 N >= N'
 < E: case Or.

Subgoal 3.1.1.1:

Variables: ID N N' Rest C A IRest VRest VRest1 N1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N1
CV1 : 1 + N1 = N
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
GEq : N1 >= N2
E : N1 > N2
============================
 N >= N'
 < L: apply greater_integer_flip_less to E.

Subgoal 3.1.1.1:

Variables: ID N N' Rest C A IRest VRest VRest1 N1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N1
CV1 : 1 + N1 = N
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
GEq : N1 >= N2
E : N1 > N2
L : N2 < N1
============================
 N >= N'
 < L': apply less_sums to CVR1 CV1 _ _.

Subgoal 3.1.1.1:

Variables: ID N N' Rest C A IRest VRest VRest1 N1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N1
CV1 : 1 + N1 = N
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
GEq : N1 >= N2
E : N1 > N2
L : N2 < N1
L' : N' < N
============================
 N >= N'
 < apply less_integer_lesseq to L'.

Subgoal 3.1.1.1:

Variables: ID N N' Rest C A IRest VRest VRest1 N1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N1
CV1 : 1 + N1 = N
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
GEq : N1 >= N2
E : N1 > N2
L : N2 < N1
L' : N' < N
H1 : N' <= N
============================
 N >= N'
 < search.

Subgoal 3.1.1.2:

Variables: ID N N' Rest C A IRest VRest VRest1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N2
CV1 : 1 + N2 = N
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
GEq : N2 >= N2
============================
 N >= N'
 < apply plus_integer_unique to CV1 CVR1.

Subgoal 3.1.1.2:

Variables: ID N' Rest C A IRest VRest VRest1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N2
CV1 : 1 + N2 = N'
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
GEq : N2 >= N2
============================
 N' >= N'
 < apply count_is_integer to CV.

Subgoal 3.1.1.2:

Variables: ID N' Rest C A IRest VRest VRest1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N2
CV1 : 1 + N2 = N'
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
GEq : N2 >= N2
H1 : is_integer N2
============================
 N' >= N'
 < apply plus_integer_is_integer to _ _ CV1.

Subgoal 3.1.1.2:

Variables: ID N' Rest C A IRest VRest VRest1 N2
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N2
CV1 : 1 + N2 = N'
CVR : count C VRest1 N2
CVR1 : 1 + N2 = N'
GEq : N2 >= N2
H1 : is_integer N2
H2 : is_integer N'
============================
 N' >= N'
 < backchain is_integer_greatereq.

Subgoal 3.1.2:

Variables: ID N N' Rest C A IRest VRest VRest1 N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : count C VRest N1
CV1 : 1 + N1 = N
CVR : C = C -> false
CVR1 : count C VRest1 N'
============================
 N >= N'
 < apply CVR to _.

Subgoal 3.2:

Variables: ID X N N' Rest C A IRest VRest VRest1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
CVR : count X (C::VRest1) N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : X = C -> false
CV1 : count X VRest N
============================
 N >= N'
 < CVR: case CVR.

Subgoal 3.2.1:

Variables: ID N N' Rest C A IRest VRest VRest1 N1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : C = C -> false
CV1 : count C VRest N
CVR : count C VRest1 N1
CVR1 : 1 + N1 = N'
============================
 N >= N'
 < apply CV to _.

Subgoal 3.2.2:

Variables: ID X N N' Rest C A IRest VRest VRest1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : X = C -> false
CV1 : count X VRest N
CVR : X = C -> false
CVR1 : count X VRest1 N'
============================
 N >= N'
 < apply IH to RA1 VK VKR CV1 CVR1.

Subgoal 3.2.2:

Variables: ID X N N' Rest C A IRest VRest VRest1
IH : forall K ID KRest V VR X N N',
       remove_all K ID KRest * -> values K V -> values KRest VR -> count X V N ->
       count X VR N' -> N >= N'
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
VK : values IRest VRest
VKR : values Rest VRest1
CV : X = C -> false
CV1 : count X VRest N
CVR : X = C -> false
CVR1 : count X VRest1 N'
H1 : N >= N'
============================
 N >= N'
 < search.

Proof completed.
 < Extensible_Theorem
      toDrat_maintains_proof : forall P D KnownL KnownD V,
         IsKnownL : is_list (is_pair is_integer is_clause) KnownL ->
         IsKnownD : is_list is_clause KnownD ->
         IsP : is_proof P ->
         CP : checkProof KnownL P ->
         GCL : good_clause_list KnownL ->
         TD : toDrat KnownL P D ->
         Vals : values KnownL V ->
         Counts : (forall C NA NB,
           count C V NA -> count C KnownD NB -> NB >= NA) ->
         checkDrat KnownD D
      on TD.

Subgoal 1:

Variables: KnownL KnownD V Prf ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof (emptyLrat ID Prf)
CP : checkProof KnownL (emptyLrat ID Prf)
GCL : good_clause_list KnownL
TD : toDrat KnownL (emptyLrat ID Prf) addDratEmpty @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
============================
 checkDrat KnownD addDratEmpty
 < CP: case CP.

Subgoal 1:

Variables: KnownL KnownD V Prf ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof (emptyLrat ID Prf)
GCL : good_clause_list KnownL
TD : toDrat KnownL (emptyLrat ID Prf) addDratEmpty @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
CP : rupProof KnownL emptyClause Prf
============================
 checkDrat KnownD addDratEmpty
 < IsV: apply values_is to _ Vals.

Subgoal 1:

Variables: KnownL KnownD V Prf ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof (emptyLrat ID Prf)
GCL : good_clause_list KnownL
TD : toDrat KnownL (emptyLrat ID Prf) addDratEmpty @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
CP : rupProof KnownL emptyClause Prf
IsV : is_list is_clause V
============================
 checkDrat KnownD addDratEmpty
 < S: apply counts_subset to IsV IsKnownD Counts.

Subgoal 1:

Variables: KnownL KnownD V Prf ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof (emptyLrat ID Prf)
GCL : good_clause_list KnownL
TD : toDrat KnownL (emptyLrat ID Prf) addDratEmpty @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
CP : rupProof KnownL emptyClause Prf
IsV : is_list is_clause V
S : subset V KnownD
============================
 checkDrat KnownD addDratEmpty
 < D: apply rupProof__drup to CP Vals.

Subgoal 1:

Variables: KnownL KnownD V Prf ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof (emptyLrat ID Prf)
GCL : good_clause_list KnownL
TD : toDrat KnownL (emptyLrat ID Prf) addDratEmpty @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
CP : rupProof KnownL emptyClause Prf
IsV : is_list is_clause V
S : subset V KnownD
D : drup V emptyClause
============================
 checkDrat KnownD addDratEmpty
 < D': apply drup_subset to D S.

Subgoal 1:

Variables: KnownL KnownD V Prf ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof (emptyLrat ID Prf)
GCL : good_clause_list KnownL
TD : toDrat KnownL (emptyLrat ID Prf) addDratEmpty @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
CP : rupProof KnownL emptyClause Prf
IsV : is_list is_clause V
S : subset V KnownD
D : drup V emptyClause
D' : drup KnownD emptyClause
============================
 checkDrat KnownD addDratEmpty
 < search.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof (addLrupProof ID C Prf Rest)
CP : checkProof KnownL (addLrupProof ID C Prf Rest)
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
============================
 checkDrat KnownD (addDratClause C DRest)
 < CP: case CP.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID KRest1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof (addLrupProof ID C Prf Rest)
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest1
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest1) Rest
============================
 checkDrat KnownD (addDratClause C DRest)
 < Is: case IsP.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID KRest1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest1
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest1) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
============================
 checkDrat KnownD (addDratClause C DRest)
 < IsV: apply values_is to _ Vals.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID KRest1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest1
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest1) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
============================
 checkDrat KnownD (addDratClause C DRest)
 < S: apply counts_subset to IsV IsKnownD Counts.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID KRest1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest1
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest1) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
============================
 checkDrat KnownD (addDratClause C DRest)
 < D: apply rupProof__drup to CP1 Vals.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID KRest1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest1
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest1) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
============================
 checkDrat KnownD (addDratClause C DRest)
 < D': apply drup_subset to D S.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID KRest1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest1
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest1) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
============================
 checkDrat KnownD (addDratClause C DRest)
 < apply remove_all_unique to CP TD1.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
============================
 checkDrat KnownD (addDratClause C DRest)
 < GCL_KR: apply good_clause_list_remove_all_add to _ TD1 with
             C = C.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
============================
 checkDrat KnownD (addDratClause C DRest)
 < IsKR: apply remove_all_is to _ TD1.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
============================
 checkDrat KnownD (addDratClause C DRest)
 < VKR: apply values_exist to IsKR.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
============================
 checkDrat KnownD (addDratClause C DRest)
 < VKR+: assert values ((ID, C)::KRest) (C::V1).

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
============================
 checkDrat KnownD (addDratClause C DRest)
 < assert forall C1 NA NB,
     count C1 (C::V1) NA -> count C1 (C::KnownD) NB -> NB >= NA.

Subgoal 2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
============================
 forall C1 NA NB, count C1 (C::V1) NA -> count C1 (C::KnownD) NB -> NB >= NA
 < intros CA CB.

Subgoal 2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C1 (C::V1) NA
CB : count C1 (C::KnownD) NB
============================
 NB >= NA
 < CA: case CA.

Subgoal 2.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CB : count C (C::KnownD) NB
CA : count C V1 N
CA1 : 1 + N = NA
============================
 NB >= NA
 < CB: case CB.

Subgoal 2.1.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N1
CB1 : 1 + N1 = NB
============================
 NB >= NA
 < CV: apply is_count_exists_clause to IsV Is1.

Subgoal 2.1.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N1 N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N1
CB1 : 1 + N1 = NB
CV : count C V N2
============================
 NB >= NA
 < GEq: apply Counts to CV CB.

Subgoal 2.1.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N1 N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N1
CB1 : 1 + N1 = NB
CV : count C V N2
GEq : N1 >= N2
============================
 NB >= NA
 < GEq': apply remove_all_reduce_counts to TD1 Vals VKR CV CA.

Subgoal 2.1.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N1 N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N1
CB1 : 1 + N1 = NB
CV : count C V N2
GEq : N1 >= N2
GEq' : N2 >= N
============================
 NB >= NA
 < GEq'': apply greatereq_integer_transitive to GEq GEq'.

Subgoal 2.1.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N1 N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N1
CB1 : 1 + N1 = NB
CV : count C V N2
GEq : N1 >= N2
GEq' : N2 >= N
GEq'' : N1 >= N
============================
 NB >= NA
 < Or: apply greatereq_integer_greater_or_eq to GEq''.

Subgoal 2.1.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N1 N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N1
CB1 : 1 + N1 = NB
CV : count C V N2
GEq : N1 >= N2
GEq' : N2 >= N
GEq'' : N1 >= N
Or : N1 > N \/ N1 = N
============================
 NB >= NA
 < E: case Or.

Subgoal 2.1.1.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N1 N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N1
CB1 : 1 + N1 = NB
CV : count C V N2
GEq : N1 >= N2
GEq' : N2 >= N
GEq'' : N1 >= N
E : N1 > N
============================
 NB >= NA
 < L: apply greater_integer_flip_less to E.

Subgoal 2.1.1.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N1 N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N1
CB1 : 1 + N1 = NB
CV : count C V N2
GEq : N1 >= N2
GEq' : N2 >= N
GEq'' : N1 >= N
E : N1 > N
L : N < N1
============================
 NB >= NA
 < L': apply less_sums to CA1 CB1 _ _.

Subgoal 2.1.1.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N1 N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N1
CB1 : 1 + N1 = NB
CV : count C V N2
GEq : N1 >= N2
GEq' : N2 >= N
GEq'' : N1 >= N
E : N1 > N
L : N < N1
L' : NA < NB
============================
 NB >= NA
 < apply less_integer_lesseq to L'.

Subgoal 2.1.1.1.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N1 N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N1
CB1 : 1 + N1 = NB
CV : count C V N2
GEq : N1 >= N2
GEq' : N2 >= N
GEq'' : N1 >= N
E : N1 > N
L : N < N1
L' : NA < NB
H1 : NA <= NB
============================
 NB >= NA
 < search.

Subgoal 2.1.1.1.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : count C KnownD N
CB1 : 1 + N = NB
CV : count C V N2
GEq : N >= N2
GEq' : N2 >= N
GEq'' : N >= N
============================
 NB >= NA
 < apply plus_integer_unique to CA1 CB1.

Subgoal 2.1.1.1.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NB N N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NB
CB : count C KnownD N
CB1 : 1 + N = NB
CV : count C V N2
GEq : N >= N2
GEq' : N2 >= N
GEq'' : N >= N
============================
 NB >= NB
 < apply count_is_integer to CA.

Subgoal 2.1.1.1.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NB N N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NB
CB : count C KnownD N
CB1 : 1 + N = NB
CV : count C V N2
GEq : N >= N2
GEq' : N2 >= N
GEq'' : N >= N
H1 : is_integer N
============================
 NB >= NB
 < apply plus_integer_is_integer to _ _ CB1.

Subgoal 2.1.1.1.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NB N N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NB
CB : count C KnownD N
CB1 : 1 + N = NB
CV : count C V N2
GEq : N >= N2
GEq' : N2 >= N
GEq'' : N >= N
H1 : is_integer N
H2 : is_integer NB
============================
 NB >= NB
 < backchain is_integer_greatereq.

Subgoal 2.1.1.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : count C V1 N
CA1 : 1 + N = NA
CB : C = C -> false
CB1 : count C KnownD NB
============================
 NB >= NA
 < apply CB to _.

Subgoal 2.1.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CB : count C1 (C::KnownD) NB
CA : C1 = C -> false
CA1 : count C1 V1 NA
============================
 NB >= NA
 < CB: case CB.

Subgoal 2.1.2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 NA NB N
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C = C -> false
CA1 : count C V1 NA
CB : count C KnownD N
CB1 : 1 + N = NB
============================
 NB >= NA
 < apply CA to _.

Subgoal 2.1.2.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
============================
 NB >= NA
 < GEq: apply count_geq_0 to CB1.

Subgoal 2.1.2.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
============================
 NB >= NA
 < GEq': apply count_geq_0 to CA1.

Subgoal 2.1.2.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
============================
 NB >= NA
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 2.1.2.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
============================
 NB >= NA
 < Or': apply greatereq_integer_greater_or_eq to GEq'.

Subgoal 2.1.2.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
Or' : NA > 0 \/ NA = 0
============================
 NB >= NA
 < E: case Or'.

Subgoal 2.1.2.2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
============================
 NB >= NA
 < M: apply count_mem to CA1 E.

Subgoal 2.1.2.2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M : mem C1 V1
============================
 NB >= NA
 < IsV1: apply values_is to _ VKR.

Subgoal 2.1.2.2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M : mem C1 V1
IsV1 : is_list is_clause V1
============================
 NB >= NA
 < IsC1: apply mem_is_clause to _ M.

Subgoal 2.1.2.2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M : mem C1 V1
IsV1 : is_list is_clause V1
IsC1 : is_clause C1
============================
 NB >= NA
 < CV: apply is_count_exists_clause to IsV IsC1.

Subgoal 2.1.2.2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB N
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M : mem C1 V1
IsV1 : is_list is_clause V1
IsC1 : is_clause C1
CV : count C1 V N
============================
 NB >= NA
 < GEq2: apply Counts to CV CB1.

Subgoal 2.1.2.2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB N
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M : mem C1 V1
IsV1 : is_list is_clause V1
IsC1 : is_clause C1
CV : count C1 V N
GEq2 : NB >= N
============================
 NB >= NA
 < GEq3: apply remove_all_reduce_counts to TD1 Vals VKR CV CA1.

Subgoal 2.1.2.2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB N
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M : mem C1 V1
IsV1 : is_list is_clause V1
IsC1 : is_clause C1
CV : count C1 V N
GEq2 : NB >= N
GEq3 : N >= NA
============================
 NB >= NA
 < apply greatereq_integer_transitive to GEq2 GEq3.

Subgoal 2.1.2.2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NA NB N
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 NA
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M : mem C1 V1
IsV1 : is_list is_clause V1
IsC1 : is_clause C1
CV : count C1 V N
GEq2 : NB >= N
GEq3 : N >= NA
H1 : NB >= NA
============================
 NB >= NA
 < search.

Subgoal 2.1.2.2.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 0
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : 0 >= 0
Or : NB > 0 \/ NB = 0
============================
 NB >= 0
 < E: case Or.

Subgoal 2.1.2.2.2.1:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1 NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 0
CB : C1 = C -> false
CB1 : count C1 KnownD NB
GEq : NB >= 0
GEq' : 0 >= 0
E : NB > 0
============================
 NB >= 0
 < search.

Subgoal 2.1.2.2.2.2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1 C1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
CA : C1 = C -> false
CA1 : count C1 V1 0
CB : C1 = C -> false
CB1 : count C1 KnownD 0
GEq : 0 >= 0
GEq' : 0 >= 0
============================
 0 >= 0
 < search.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
H1 : forall C1 NA NB, count C1 (C::V1) NA -> count C1 (C::KnownD) NB -> NB >= NA
============================
 checkDrat KnownD (addDratClause C DRest)
 < apply IH to _ _ Is3 CP2 GCL_KR TD2 VKR+ _ with
     KnownD = C::KnownD.

Subgoal 2:

Variables: KnownL KnownD V KRest DRest C Rest Prf ID V1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (addLrupProof ID C Prf Rest) (addDratClause C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : remove_all KnownL ID KRest
TD2 : toDrat ((ID, C)::KRest) Rest DRest *
CP : remove_all KnownL ID KRest
CP1 : rupProof KnownL C Prf
CP2 : checkProof ((ID, C)::KRest) Rest
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
IsV : is_list is_clause V
S : subset V KnownD
D : drup V C
D' : drup KnownD C
GCL_KR : good_clause_list ((ID, C)::KRest)
IsKR : is_list (is_pair is_integer is_clause) KRest
VKR : values KRest V1
VKR+ : values ((ID, C)::KRest) (C::V1)
H1 : forall C1 NA NB, count C1 (C::V1) NA -> count C1 (C::KnownD) NB -> NB >= NA
H2 : checkDrat (C::KnownD) DRest
============================
 checkDrat KnownD (addDratClause C DRest)
 < search.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest C Rest ID
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof (deleteLratProof ID Rest)
CP : checkProof KnownL (deleteLratProof ID Rest)
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID Rest) (deleteDrat C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID, C) KRest KnownL
TD2 : toDrat KRest Rest DRest *
============================
 checkDrat KnownD (deleteDrat C DRest)
 < CP: case CP.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest C Rest ID C1 KRest1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof (deleteLratProof ID Rest)
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID Rest) (deleteDrat C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID, C) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID, C1) KRest1 KnownL
CP1 : checkProof KRest1 Rest
============================
 checkDrat KnownD (deleteDrat C DRest)
 < Is: case IsP.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest C Rest ID C1 KRest1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID Rest) (deleteDrat C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID, C) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID, C1) KRest1 KnownL
CP1 : checkProof KRest1 Rest
Is : is_integer ID
Is1 : is_proof Rest
============================
 checkDrat KnownD (deleteDrat C DRest)
 < IsKR: apply select_is to _ TD1.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest C Rest ID C1 KRest1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID Rest) (deleteDrat C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID, C) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID, C1) KRest1 KnownL
CP1 : checkProof KRest1 Rest
Is : is_integer ID
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
============================
 checkDrat KnownD (deleteDrat C DRest)
 < apply good_clause_list_selects to _ CP TD1.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest C Rest ID C1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID Rest) (deleteDrat C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID, C) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
============================
 checkDrat KnownD (deleteDrat C DRest)
 < VS: apply values_select to _ TD1.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest C Rest ID C1 VRest
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID Rest) (deleteDrat C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID, C) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C VRest V
VS1 : values KRest VRest
============================
 checkDrat KnownD (deleteDrat C DRest)
 < M: apply select_mem to TD1.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest C Rest ID C1 VRest
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID Rest) (deleteDrat C DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID, C) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C VRest V
VS1 : values KRest VRest
M : mem (ID, C) KnownL
============================
 checkDrat KnownD (deleteDrat C DRest)
 < Is: apply mem_is to _ M.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < IsV: apply values_is to _ Vals.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < CV: apply is_count_exists_clause to IsV Is3.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < CKD: apply is_count_exists_clause to IsKnownD Is3.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < NPos: assert N > 0.

Subgoal 3.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
============================
 N > 0
 < GEq: apply count_geq_0 to CV.

Subgoal 3.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
GEq : N >= 0
============================
 N > 0
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 3.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
GEq : N >= 0
Or : N > 0 \/ N = 0
============================
 N > 0
 < L: case Or.

Subgoal 3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
GEq : N >= 0
L : N > 0
============================
 N > 0
 < search.

Subgoal 3.1.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V 0
CKD : count C2 KnownD N1
GEq : 0 >= 0
============================
 0 > 0
 < MV: apply select_mem to VS.

Subgoal 3.1.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V 0
CKD : count C2 KnownD N1
GEq : 0 >= 0
MV : mem C2 V
============================
 0 > 0
 < apply count_not_mem to CV MV.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < N1N: apply Counts to CV CKD.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1N : N1 >= N
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < N1Pos: assert N1 > 0.

Subgoal 3.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1N : N1 >= N
============================
 N1 > 0
 < Or: apply greatereq_integer_greater_or_eq to N1N.

Subgoal 3.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1N : N1 >= N
Or : N1 > N \/ N1 = N
============================
 N1 > 0
 < G: case Or.

Subgoal 3.2.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1N : N1 >= N
G : N1 > N
============================
 N1 > 0
 < apply greater_integer_transitive to G NPos.

Subgoal 3.2.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1N : N1 >= N
G : N1 > N
H1 : N1 > 0
============================
 N1 > 0
 < search.

Subgoal 3.2.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N
NPos : N > 0
N1N : N >= N
============================
 N > 0
 < search.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1N : N1 >= N
N1Pos : N1 > 0
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < clear N1N.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < MKD: apply count_mem to CKD N1Pos.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < SKD: apply mem_select to MKD.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L'
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < IsL': apply select_is_clause to _ SKD.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L'
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < GCL_KR: apply good_clause_list_select to _ TD1.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L'
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < assert forall C NA NB,
     count C VRest NA -> count C L' NB -> NB >= NA.

Subgoal 3.3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L'
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
============================
 forall C NA NB, count C VRest NA -> count C L' NB -> NB >= NA
 < intros CA CB.

Subgoal 3.3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
============================
 NB >= NA
 < GEq: apply count_geq_0 to CB.

Subgoal 3.3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
============================
 NB >= NA
 < GEq': apply count_geq_0 to CA.

Subgoal 3.3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
============================
 NB >= NA
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 3.3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
============================
 NB >= NA
 < Or': apply greatereq_integer_greater_or_eq to GEq'.

Subgoal 3.3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
Or' : NA > 0 \/ NA = 0
============================
 NB >= NA
 < E: case Or'.

Subgoal 3.3.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
============================
 NB >= NA
 < M': apply count_mem to CA E.

Subgoal 3.3.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C3 VRest
============================
 NB >= NA
 < IsVRest: apply values_is to _ VS1.

Subgoal 3.3.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C3 VRest
IsVRest : is_list is_clause VRest
============================
 NB >= NA
 < IsC3: apply mem_is_clause to _ M'.

Subgoal 3.3.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C3 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C3
============================
 NB >= NA
 < CV: apply is_count_exists_clause to IsV IsC3.

Subgoal 3.3.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C3 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C3
CV1 : count C3 V N2
============================
 NB >= NA
 < IsC2: apply mem_is_clause to _ MKD.

Subgoal 3.3.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C3 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C3
CV1 : count C3 V N2
IsC2 : is_clause C2
============================
 NB >= NA
 < Or'': apply is_clause_eq_or_not to IsC3 IsC2.

Subgoal 3.3.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C3 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C3
CV1 : count C3 V N2
IsC2 : is_clause C2
Or'' : C3 = C2 \/ (C3 = C2 -> false)
============================
 NB >= NA
 < CE: case Or''.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
============================
 NB >= NA
 < IsN2: apply count_is_integer to CV1.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
============================
 NB >= NA
 < Minus: apply minus_integer_total to IsN2 _ with
            N2 = 1.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2 N3
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = N3
============================
 NB >= NA
 < P: apply minus_plus_same_integer to _ _ Minus.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2 N3
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = N3
P : N3 + 1 = N2
============================
 NB >= NA
 < IsN3: apply minus_integer_is_integer to _ _ Minus.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2 N3
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = N3
P : N3 + 1 = N2
IsN3 : is_integer N3
============================
 NB >= NA
 < P': apply plus_integer_comm to _ _ P.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2 N3
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = N3
P : N3 + 1 = N2
IsN3 : is_integer N3
P' : 1 + N3 = N2
============================
 NB >= NA
 < CVRest: apply select_count to CV1 VS _.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2 N3
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = N3
P : N3 + 1 = N2
IsN3 : is_integer N3
P' : 1 + N3 = N2
CVRest : count C2 VRest N3
============================
 NB >= NA
 < apply count_unique to CVRest CA.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = NA
P : NA + 1 = N2
IsN3 : is_integer NA
P' : 1 + NA = N2
CVRest : count C2 VRest NA
============================
 NB >= NA
 < IsN1: apply count_is_integer to CKD.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = NA
P : NA + 1 = N2
IsN3 : is_integer NA
P' : 1 + NA = N2
CVRest : count C2 VRest NA
IsN1 : is_integer N1
============================
 NB >= NA
 < Minus': apply minus_integer_total to IsN1 _ with
             N2 = 1.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2 N4
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = NA
P : NA + 1 = N2
IsN3 : is_integer NA
P' : 1 + NA = N2
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = N4
============================
 NB >= NA
 < P1: apply minus_plus_same_integer to _ _ Minus'.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2 N4
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = NA
P : NA + 1 = N2
IsN3 : is_integer NA
P' : 1 + NA = N2
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = N4
P1 : N4 + 1 = N1
============================
 NB >= NA
 < IsN4: apply minus_integer_is_integer to _ _ Minus'.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2 N4
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = NA
P : NA + 1 = N2
IsN3 : is_integer NA
P' : 1 + NA = N2
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = N4
P1 : N4 + 1 = N1
IsN4 : is_integer N4
============================
 NB >= NA
 < P2: apply plus_integer_comm to _ _ P1.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2 N4
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = NA
P : NA + 1 = N2
IsN3 : is_integer NA
P' : 1 + NA = N2
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = N4
P1 : N4 + 1 = N1
IsN4 : is_integer N4
P2 : 1 + N4 = N1
============================
 NB >= NA
 < CDRest: apply select_count to CKD SKD Minus'.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2 N4
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = NA
P : NA + 1 = N2
IsN3 : is_integer NA
P' : 1 + NA = N2
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = N4
P1 : N4 + 1 = N1
IsN4 : is_integer N4
P2 : 1 + N4 = N1
CDRest : count C2 L' N4
============================
 NB >= NA
 < apply count_unique to CDRest CB.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = NA
P : NA + 1 = N2
IsN3 : is_integer NA
P' : 1 + NA = N2
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
============================
 NB >= NA
 < GEq1: apply Counts to CV CKD.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N2
IsC2 : is_clause C2
IsN2 : is_integer N2
Minus : N2 - 1 = NA
P : NA + 1 = N2
IsN3 : is_integer NA
P' : 1 + NA = N2
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
============================
 NB >= NA
 < apply count_unique to CV1 CV.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
============================
 NB >= NA
 < Or1: apply greatereq_integer_greater_or_eq to GEq1.

Subgoal 3.3.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
Or1 : N1 > N \/ N1 = N
============================
 NB >= NA
 < G: case Or1.

Subgoal 3.3.1.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
G : N1 > N
============================
 NB >= NA
 < L: apply greater_integer_flip_less to G.

Subgoal 3.3.1.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
G : N1 > N
L : N < N1
============================
 NB >= NA
 < OrRel: apply is_integer_related to IsN3 IsN4.

Subgoal 3.3.1.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
G : N1 > N
L : N < N1
OrRel : (NA = NB \/ NA < NB) \/ NA > NB
============================
 NB >= NA
 < C: case OrRel.

Subgoal 3.3.1.1.1.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NB
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NB >= 0
Or : NB > 0 \/ NB = 0
E : NB > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NB
P : NB + 1 = N
IsN3 : is_integer NB
P' : 1 + NB = N
CVRest : count C2 VRest NB
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
G : N1 > N
L : N < N1
============================
 NB >= NB
 < backchain is_integer_greatereq.

Subgoal 3.3.1.1.1.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
G : N1 > N
L : N < N1
C : NA < NB
============================
 NB >= NA
 < G': apply less_integer_flip_greater to C.

Subgoal 3.3.1.1.1.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
G : N1 > N
L : N < N1
C : NA < NB
G' : NB > NA
============================
 NB >= NA
 < backchain greater_integer_greatereq.

Subgoal 3.3.1.1.1.3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
G : N1 > N
L : N < N1
C : NA > NB
============================
 NB >= NA
 < apply greater_integer_flip_less to C.

Subgoal 3.3.1.1.1.3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
G : N1 > N
L : N < N1
C : NA > NB
H1 : NB < NA
============================
 NB >= NA
 < L': apply less_sums to P2 P' _ _.

Subgoal 3.3.1.1.1.3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
G : N1 > N
L : N < N1
C : NA > NB
H1 : NB < NA
L' : N1 < N
============================
 NB >= NA
 < G': assert N > N1.

Subgoal 3.3.1.1.1.3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N1
Minus' : N1 - 1 = NB
P1 : NB + 1 = N1
IsN4 : is_integer NB
P2 : 1 + NB = N1
CDRest : count C2 L' NB
GEq1 : N1 >= N
G : N1 > N
L : N < N1
C : NA > NB
H1 : NB < NA
L' : N1 < N
G' : N > N1
============================
 NB >= NA
 < apply greater_less_impossible to G' L.

Subgoal 3.3.1.1.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N L' NA NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N
NPos : N > 0
N1Pos : N > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NA
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NA
P : NA + 1 = N
IsN3 : is_integer NA
P' : 1 + NA = N
CVRest : count C2 VRest NA
IsN1 : is_integer N
Minus' : N - 1 = NB
P1 : NB + 1 = N
IsN4 : is_integer NB
P2 : 1 + NB = N
CDRest : count C2 L' NB
GEq1 : N >= N
============================
 NB >= NA
 < apply minus_integer_unique to Minus Minus'.

Subgoal 3.3.1.1.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N L' NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N
NPos : N > 0
N1Pos : N > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C2 VRest NB
CB : count C2 L' NB
GEq : NB >= 0
GEq' : NB >= 0
Or : NB > 0 \/ NB = 0
E : NB > 0
M' : mem C2 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C2
CV1 : count C2 V N
IsC2 : is_clause C2
IsN2 : is_integer N
Minus : N - 1 = NB
P : NB + 1 = N
IsN3 : is_integer NB
P' : 1 + NB = N
CVRest : count C2 VRest NB
IsN1 : is_integer N
Minus' : N - 1 = NB
P1 : NB + 1 = N
IsN4 : is_integer NB
P2 : 1 + NB = N
CDRest : count C2 L' NB
GEq1 : N >= N
============================
 NB >= NB
 < backchain is_integer_greatereq.

Subgoal 3.3.1.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C3 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C3
CV1 : count C3 V N2
IsC2 : is_clause C2
CE : C3 = C2 -> false
============================
 NB >= NA
 < CV: apply count_select_neq to CA VS _.

Subgoal 3.3.1.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C3 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C3
CV1 : count C3 V N2
IsC2 : is_clause C2
CE : C3 = C2 -> false
CV2 : count C3 V NA
============================
 NB >= NA
 < CKD': apply count_select_neq to CB SKD _.

Subgoal 3.3.1.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C3 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C3
CV1 : count C3 V N2
IsC2 : is_clause C2
CE : C3 = C2 -> false
CV2 : count C3 V NA
CKD' : count C3 KnownD NB
============================
 NB >= NA
 < apply Counts to CV2 CKD'.

Subgoal 3.3.1.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NA NB N2
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest NA
CB : count C3 L' NB
GEq : NB >= 0
GEq' : NA >= 0
Or : NB > 0 \/ NB = 0
E : NA > 0
M' : mem C3 VRest
IsVRest : is_list is_clause VRest
IsC3 : is_clause C3
CV1 : count C3 V N2
IsC2 : is_clause C2
CE : C3 = C2 -> false
CV2 : count C3 V NA
CKD' : count C3 KnownD NB
H1 : NB >= NA
============================
 NB >= NA
 < search.

Subgoal 3.3.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest 0
CB : count C3 L' NB
GEq : NB >= 0
GEq' : 0 >= 0
Or : NB > 0 \/ NB = 0
============================
 NB >= 0
 < E: case Or.

Subgoal 3.3.2.1:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3 NB
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest 0
CB : count C3 L' NB
GEq : NB >= 0
GEq' : 0 >= 0
E : NB > 0
============================
 NB >= 0
 < search.

Subgoal 3.3.2.2:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L' C3
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
CA : count C3 VRest 0
CB : count C3 L' 0
GEq : 0 >= 0
GEq' : 0 >= 0
============================
 0 >= 0
 < search.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L'
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
H1 : forall C NA NB, count C VRest NA -> count C L' NB -> NB >= NA
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < apply IH to _ IsL' Is1 CP1 _ TD2 VS1 _.

Subgoal 3:

Variables: KnownL KnownD V KRest DRest Rest C1 VRest ID1 C2 N N1 L'
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
GCL : good_clause_list KnownL
TD : toDrat KnownL (deleteLratProof ID1 Rest) (deleteDrat C2 DRest) @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : select (ID1, C2) KRest KnownL
TD2 : toDrat KRest Rest DRest *
CP : select (ID1, C1) KRest KnownL
CP1 : checkProof KRest Rest
Is : is_integer ID1
Is1 : is_proof Rest
IsKR : is_list (is_pair is_integer is_clause) KRest
VS : select C2 VRest V
VS1 : values KRest VRest
M : mem (ID1, C2) KnownL
Is2 : is_integer ID1
Is3 : is_clause C2
IsV : is_list is_clause V
CV : count C2 V N
CKD : count C2 KnownD N1
NPos : N > 0
N1Pos : N1 > 0
MKD : mem C2 KnownD
SKD : select C2 L' KnownD
IsL' : is_list is_clause L'
GCL_KR : good_clause_list KRest
H1 : forall C NA NB, count C VRest NA -> count C L' NB -> NB >= NA
H2 : checkDrat L' DRest
============================
 checkDrat KnownD (deleteDrat C2 DRest)
 < search.

Subgoal 4:

Variables: D KnownL KnownD V PT
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof <unknown I proof>
CP : checkProof KnownL <unknown I proof>
GCL : good_clause_list KnownL
TD : toDrat KnownL <unknown I proof> D @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : KnownL |{proof}- <unknown I proof> ~~> PT
TD2 : toDrat KnownL PT D *
============================
 checkDrat KnownD D
 < CP': apply proj_checkProof to TD1 CP _ _.

Subgoal 4:

Variables: D KnownL KnownD V PT
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof <unknown I proof>
CP : checkProof KnownL <unknown I proof>
GCL : good_clause_list KnownL
TD : toDrat KnownL <unknown I proof> D @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : KnownL |{proof}- <unknown I proof> ~~> PT
TD2 : toDrat KnownL PT D *
CP' : checkProof KnownL PT
============================
 checkDrat KnownD D
 < apply proj_proof_is to TD1 IsP _ _.

Subgoal 4:

Variables: D KnownL KnownD V PT
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof <unknown I proof>
CP : checkProof KnownL <unknown I proof>
GCL : good_clause_list KnownL
TD : toDrat KnownL <unknown I proof> D @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : KnownL |{proof}- <unknown I proof> ~~> PT
TD2 : toDrat KnownL PT D *
CP' : checkProof KnownL PT
H1 : is_proof PT
============================
 checkDrat KnownD D
 < apply IH to _ _ _ CP' _ TD2 _ _.

Subgoal 4:

Variables: D KnownL KnownD V PT
IH : forall P D KnownL KnownD V,
       is_list (is_pair is_integer is_clause) KnownL -> is_list is_clause KnownD ->
       is_proof P -> checkProof KnownL P -> good_clause_list KnownL -> toDrat KnownL P D * ->
       values KnownL V -> (forall C NA NB,
         count C V NA -> count C KnownD NB -> NB >= NA) -> checkDrat KnownD D
IsKnownL : is_list (is_pair is_integer is_clause) KnownL
IsKnownD : is_list is_clause KnownD
IsP : is_proof <unknown I proof>
CP : checkProof KnownL <unknown I proof>
GCL : good_clause_list KnownL
TD : toDrat KnownL <unknown I proof> D @
Vals : values KnownL V
Counts : forall C NA NB, count C V NA -> count C KnownD NB -> NB >= NA
TD1 : KnownL |{proof}- <unknown I proof> ~~> PT
TD2 : toDrat KnownL PT D *
CP' : checkProof KnownL PT
H1 : is_proof PT
H2 : checkDrat KnownD D
============================
 checkDrat KnownD D
 < search.

Proof completed.
Back to example home