< 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.