< Module unsat_proofs:clauses.
< 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. Subgoal 1: Variables: CB High PlusOne Low ProjA : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) ProjB : |{clause}- rangeClause Low High ~~> CB ProjA1 : Low <= High ProjA2 : 1 + Low = PlusOne ============================ or (pos Low) (rangeClause PlusOne High) = CB
< ProjB: case ProjB. Subgoal 1.1: Variables: High PlusOne Low PlusOne1 ProjA : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) ProjA1 : Low <= High ProjA2 : 1 + Low = PlusOne ProjB : Low <= High ProjB1 : 1 + Low = PlusOne1 ============================ or (pos Low) (rangeClause PlusOne High) = or (pos Low) (rangeClause PlusOne1 High)
< apply plus_integer_unique to ProjA2 ProjB1. Subgoal 1.1: Variables: High Low PlusOne1 ProjA : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne1 High) ProjA1 : Low <= High ProjA2 : 1 + Low = PlusOne1 ProjB : Low <= High ProjB1 : 1 + Low = PlusOne1 ============================ or (pos Low) (rangeClause PlusOne1 High) = or (pos Low) (rangeClause PlusOne1 High)
< search. Subgoal 1.2: Variables: High PlusOne Low ProjA : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) ProjA1 : Low <= High ProjA2 : 1 + Low = PlusOne ProjB : Low > High ============================ or (pos Low) (rangeClause PlusOne High) = emptyClause
< apply greater_lesseq_integer_false to ProjB ProjA1. Subgoal 2: Variables: CB High Low ProjA : |{clause}- rangeClause Low High ~~> emptyClause ProjB : |{clause}- rangeClause Low High ~~> CB ProjA1 : Low > High ============================ emptyClause = CB
< ProjB: case ProjB. Subgoal 2.1: Variables: High Low PlusOne ProjA : |{clause}- rangeClause Low High ~~> emptyClause ProjA1 : Low > High ProjB : Low <= High ProjB1 : 1 + Low = PlusOne ============================ emptyClause = or (pos Low) (rangeClause PlusOne High)
< apply greater_lesseq_integer_false to ProjA1 ProjB. Subgoal 2.2: Variables: High Low ProjA : |{clause}- rangeClause Low High ~~> emptyClause ProjA1 : Low > High ProjB : Low > High ============================ emptyClause = emptyClause
< search. Subgoal 3: Variables: CA CB Note ProjA : |{clause}- noteClause Note CA ~~> CA ProjB : |{clause}- noteClause Note CA ~~> CB ============================ CA = CB
< case ProjB. Subgoal 3: Variables: CB Note ProjA : |{clause}- noteClause Note CB ~~> CB ============================ CB = CB
< search. Proof completed.
< Prove_Constraint unsat_proofs:lrat:proj_clause_is. Subgoal 1: Variables: High PlusOne Low Proj : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) IsC : is_clause (rangeClause Low High) Proj1 : Low <= High Proj2 : 1 + Low = PlusOne ============================ is_clause (or (pos Low) (rangeClause PlusOne High))
< Is: case IsC. Subgoal 1: Variables: High PlusOne Low Proj : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Proj1 : Low <= High Proj2 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High ============================ is_clause (or (pos Low) (rangeClause PlusOne High))
< apply plus_integer_is_integer to _ _ Proj2. Subgoal 1: Variables: High PlusOne Low Proj : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Proj1 : Low <= High Proj2 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High H1 : is_integer PlusOne ============================ is_clause (or (pos Low) (rangeClause PlusOne High))
< search. Subgoal 2: Variables: High Low Proj : |{clause}- rangeClause Low High ~~> emptyClause IsC : is_clause (rangeClause Low High) Proj1 : Low > High ============================ is_clause emptyClause
< search. Subgoal 3: Variables: CT Note Proj : |{clause}- noteClause Note CT ~~> CT IsC : is_clause (noteClause Note CT) ============================ is_clause CT
< case IsC. Subgoal 3: Variables: CT Note Proj : |{clause}- noteClause Note CT ~~> CT H1 : is_string Note H2 : is_clause CT ============================ is_clause CT
< search. 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 Subgoal 3: Variables: I I1 IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I ============================ <is_clause {P}> (rangeClause I1 I)
< Helper: assert forall Low High R, is_integer Low -> is_integer High -> range Low High R -> <is_clause {P}> (rangeClause Low High). Subgoal 3.1: Variables: I I1 IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I ============================ forall Low High R, is_integer Low -> is_integer High -> range Low High R -> <is_clause {P}> (rangeClause Low High)
< induction on 3. Subgoal 3.1: Variables: I I1 IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I IH1 : forall Low High R, is_integer Low -> is_integer High -> range Low High R ** -> <is_clause {P}> (rangeClause Low High) ============================ forall Low High R, is_integer Low -> is_integer High -> range Low High R @@ -> <is_clause {P}> (rangeClause Low High)
< intros IsLow IsHigh Range. Subgoal 3.1: Variables: I I1 Low High R IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I IH1 : forall Low High R, is_integer Low -> is_integer High -> range Low High R ** -> <is_clause {P}> (rangeClause Low High) IsLow : is_integer Low IsHigh : is_integer High Range : range Low High R @@ ============================ <is_clause {P}> (rangeClause Low High)
< Range: case Range. Subgoal 3.1.1: Variables: I I1 Low High IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I IH1 : forall Low High R, is_integer Low -> is_integer High -> range Low High R ** -> <is_clause {P}> (rangeClause Low High) IsLow : is_integer Low IsHigh : is_integer High Range : Low > High ============================ <is_clause {P}> (rangeClause Low High)
< unfold . Subgoal 3.1.1: Variables: I I1 Low High IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I IH1 : forall Low High R, is_integer Low -> is_integer High -> range Low High R ** -> <is_clause {P}> (rangeClause Low High) IsLow : is_integer Low IsHigh : is_integer High Range : Low > High ============================ exists X_T, (is_integer Low /\ is_integer High) /\ (|{clause}- rangeClause Low High ~~> X_T /\ <is_clause {P}> X_T)
< exists emptyClause. Subgoal 3.1.1: Variables: I I1 Low High IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I IH1 : forall Low High R, is_integer Low -> is_integer High -> range Low High R ** -> <is_clause {P}> (rangeClause Low High) IsLow : is_integer Low IsHigh : is_integer High Range : Low > High ============================ (is_integer Low /\ is_integer High) /\ (|{clause}- rangeClause Low High ~~> emptyClause /\ <is_clause {P}> emptyClause)
< search. Subgoal 3.1.2: Variables: I I1 Low High PlusOne Rest IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I IH1 : forall Low High R, is_integer Low -> is_integer High -> range Low High R ** -> <is_clause {P}> (rangeClause Low High) IsLow : is_integer Low IsHigh : is_integer High Range : Low <= High Range1 : 1 + Low = PlusOne Range2 : range PlusOne High Rest ** ============================ <is_clause {P}> (rangeClause Low High)
< unfold . Subgoal 3.1.2: Variables: I I1 Low High PlusOne Rest IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I IH1 : forall Low High R, is_integer Low -> is_integer High -> range Low High R ** -> <is_clause {P}> (rangeClause Low High) IsLow : is_integer Low IsHigh : is_integer High Range : Low <= High Range1 : 1 + Low = PlusOne Range2 : range PlusOne High Rest ** ============================ exists X_T, (is_integer Low /\ is_integer High) /\ (|{clause}- rangeClause Low High ~~> X_T /\ <is_clause {P}> X_T)
< IsPlusOne: apply plus_integer_is_integer to _ _ Range1. Subgoal 3.1.2: Variables: I I1 Low High PlusOne Rest IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I IH1 : forall Low High R, is_integer Low -> is_integer High -> range Low High R ** -> <is_clause {P}> (rangeClause Low High) IsLow : is_integer Low IsHigh : is_integer High Range : Low <= High Range1 : 1 + Low = PlusOne Range2 : range PlusOne High Rest ** IsPlusOne : is_integer PlusOne ============================ exists X_T, (is_integer Low /\ is_integer High) /\ (|{clause}- rangeClause Low High ~~> X_T /\ <is_clause {P}> X_T)
< IsCT: apply IH1 to _ _ Range2. Subgoal 3.1.2: Variables: I I1 Low High PlusOne Rest IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I IH1 : forall Low High R, is_integer Low -> is_integer High -> range Low High R ** -> <is_clause {P}> (rangeClause Low High) IsLow : is_integer Low IsHigh : is_integer High Range : Low <= High Range1 : 1 + Low = PlusOne Range2 : range PlusOne High Rest ** IsPlusOne : is_integer PlusOne IsCT : <is_clause {P}> (rangeClause PlusOne High) ============================ exists X_T, (is_integer Low /\ is_integer High) /\ (|{clause}- rangeClause Low High ~~> X_T /\ <is_clause {P}> X_T)
< Tr: assert |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High). Subgoal 3.1.2: Variables: I I1 Low High PlusOne Rest IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I IH1 : forall Low High R, is_integer Low -> is_integer High -> range Low High R ** -> <is_clause {P}> (rangeClause Low High) IsLow : is_integer Low IsHigh : is_integer High Range : Low <= High Range1 : 1 + Low = PlusOne Range2 : range PlusOne High Rest ** IsPlusOne : is_integer PlusOne IsCT : <is_clause {P}> (rangeClause PlusOne High) Tr : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) ============================ exists X_T, (is_integer Low /\ is_integer High) /\ (|{clause}- rangeClause Low High ~~> X_T /\ <is_clause {P}> X_T)
< search. Subgoal 3: Variables: I I1 IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I Helper : forall Low High R, is_integer Low -> is_integer High -> range Low High R -> <is_clause {P}> (rangeClause Low High) ============================ <is_clause {P}> (rangeClause I1 I)
< Range: apply range_exists to R1 R2. Subgoal 3: Variables: I I1 R IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I Helper : forall Low High R, is_integer Low -> is_integer High -> range Low High R -> <is_clause {P}> (rangeClause Low High) Range : range I1 I R ============================ <is_clause {P}> (rangeClause I1 I)
< apply Helper to _ _ Range. Subgoal 3: Variables: I I1 R IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (rangeClause I1 I) @ R1 : is_integer I1 R2 : is_integer I Helper : forall Low High R, is_integer Low -> is_integer High -> range Low High R -> <is_clause {P}> (rangeClause Low High) Range : range I1 I R H1 : <is_clause {P}> (rangeClause I1 I) ============================ <is_clause {P}> (rangeClause I1 I)
< search. Subgoal 4: Variables: Clause S IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (noteClause S Clause) @ R1 : is_string S R2 : is_clause Clause * ============================ <is_clause {P}> (noteClause S Clause)
< assert |{clause}- noteClause S Clause ~~> Clause. Subgoal 4: Variables: Clause S IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (noteClause S Clause) @ R1 : is_string S R2 : is_clause Clause * H1 : |{clause}- noteClause S Clause ~~> Clause ============================ <is_clause {P}> (noteClause S Clause)
< apply IH to R2. Subgoal 4: Variables: Clause S IH : forall C, is_clause C * -> <is_clause {P}> C R : is_clause (noteClause S Clause) @ R1 : is_string S R2 : is_clause Clause * H1 : |{clause}- noteClause S Clause ~~> Clause H2 : <is_clause {P}> Clause ============================ <is_clause {P}> (noteClause S Clause)
< search. 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. Subgoal 3: Variables: I I1 IH : forall C, is_clause C * -> emptyClause = C \/ (emptyClause = C -> false) IsC : is_clause (rangeClause I1 I) @ IsC1 : is_integer I1 IsC2 : is_integer I ============================ emptyClause = rangeClause I1 I \/ (emptyClause = rangeClause I1 I -> false)
< search. Subgoal 4: Variables: Clause S IH : forall C, is_clause C * -> emptyClause = C \/ (emptyClause = C -> false) IsC : is_clause (noteClause S Clause) @ IsC1 : is_string S IsC2 : is_clause Clause * ============================ emptyClause = noteClause S Clause \/ (emptyClause = noteClause S Clause -> false)
< search. Proof completed.
< Prove unsat_proofs:lrat:is_clause_or_or_not. Subgoal 3: Variables: I I1 IH : forall C, is_clause C * -> (exists L R, or L R = C) \/ ((exists L R, or L R = C) -> false) IsC : is_clause (rangeClause I1 I) @ IsC1 : is_integer I1 IsC2 : is_integer I ============================ (exists L R, or L R = rangeClause I1 I) \/ ((exists L R, or L R = rangeClause I1 I) -> false)
< search. Subgoal 4: Variables: Clause S IH : forall C, is_clause C * -> (exists L R, or L R = C) \/ ((exists L R, or L R = C) -> false) IsC : is_clause (noteClause S Clause) @ IsC1 : is_string S IsC2 : is_clause Clause * ============================ (exists L R, or L R = noteClause S Clause) \/ ((exists L R, or L R = noteClause S Clause) -> false)
< search. Proof completed.
< Extensible_Theorem is_clause_rangeClause_or_not : forall C, IsC : is_clause C -> (exists Low High, C = rangeClause Low High) \/ ((exists Low High, C = rangeClause Low High) -> false) on IsC. Subgoal 1: IH : forall C, is_clause C * -> (exists Low High, C = rangeClause Low High) \/ ((exists Low High, C = rangeClause Low High) -> false) IsC : is_clause emptyClause @ ============================ (exists Low High, emptyClause = rangeClause Low High) \/ ((exists Low High, emptyClause = rangeClause Low High) -> false)
< search. Subgoal 2: Variables: Clause Lit IH : forall C, is_clause C * -> (exists Low High, C = rangeClause Low High) \/ ((exists Low High, C = rangeClause Low High) -> false) IsC : is_clause (or Lit Clause) @ IsC1 : is_lit Lit IsC2 : is_clause Clause * ============================ (exists Low High, or Lit Clause = rangeClause Low High) \/ ((exists Low High, or Lit Clause = rangeClause Low High) -> false)
< search. Subgoal 3: Variables: I I1 IH : forall C, is_clause C * -> (exists Low High, C = rangeClause Low High) \/ ((exists Low High, C = rangeClause Low High) -> false) IsC : is_clause (rangeClause I1 I) @ IsC1 : is_integer I1 IsC2 : is_integer I ============================ (exists Low High, rangeClause I1 I = rangeClause Low High) \/ ((exists Low High, rangeClause I1 I = rangeClause Low High) -> false)
< search. Subgoal 4: Variables: Clause S IH : forall C, is_clause C * -> (exists Low High, C = rangeClause Low High) \/ ((exists Low High, C = rangeClause Low High) -> false) IsC : is_clause (noteClause S Clause) @ IsC1 : is_string S IsC2 : is_clause Clause * ============================ (exists Low High, noteClause S Clause = rangeClause Low High) \/ ((exists Low High, noteClause S Clause = rangeClause Low High) -> false)
< search. Subgoal 5: Variables: X_T IH : forall C, is_clause C * -> (exists Low High, C = rangeClause Low High) \/ ((exists Low High, C = rangeClause Low High) -> false) IsC : is_clause <unknown K is_clause> @ IsC1 : |{clause}- <unknown K is_clause> ~~> X_T IsC2 : is_clause X_T * ============================ (exists Low High, <unknown K is_clause> = rangeClause Low High) \/ ((exists Low High, <unknown K is_clause> = rangeClause Low High) -> false)
< search. Proof completed.
< Extensible_Theorem is_clause_noteClause_or_not : forall C, IsC : is_clause C -> (exists Note C', C = noteClause Note C') \/ ((exists Note C', C = noteClause Note C') -> false) on IsC. Subgoal 1: IH : forall C, is_clause C * -> (exists Note C', C = noteClause Note C') \/ ((exists Note C', C = noteClause Note C') -> false) IsC : is_clause emptyClause @ ============================ (exists Note C', emptyClause = noteClause Note C') \/ ((exists Note C', emptyClause = noteClause Note C') -> false)
< search. Subgoal 2: Variables: Clause Lit IH : forall C, is_clause C * -> (exists Note C', C = noteClause Note C') \/ ((exists Note C', C = noteClause Note C') -> false) IsC : is_clause (or Lit Clause) @ IsC1 : is_lit Lit IsC2 : is_clause Clause * ============================ (exists Note C', or Lit Clause = noteClause Note C') \/ ((exists Note C', or Lit Clause = noteClause Note C') -> false)
< search. Subgoal 3: Variables: I I1 IH : forall C, is_clause C * -> (exists Note C', C = noteClause Note C') \/ ((exists Note C', C = noteClause Note C') -> false) IsC : is_clause (rangeClause I1 I) @ IsC1 : is_integer I1 IsC2 : is_integer I ============================ (exists Note C', rangeClause I1 I = noteClause Note C') \/ ((exists Note C', rangeClause I1 I = noteClause Note C') -> false)
< search. Subgoal 4: Variables: Clause S IH : forall C, is_clause C * -> (exists Note C', C = noteClause Note C') \/ ((exists Note C', C = noteClause Note C') -> false) IsC : is_clause (noteClause S Clause) @ IsC1 : is_string S IsC2 : is_clause Clause * ============================ (exists Note C', noteClause S Clause = noteClause Note C') \/ ((exists Note C', noteClause S Clause = noteClause Note C') -> false)
< search. Subgoal 5: Variables: X_T IH : forall C, is_clause C * -> (exists Note C', C = noteClause Note C') \/ ((exists Note C', C = noteClause Note C') -> false) IsC : is_clause <unknown K is_clause> @ IsC1 : |{clause}- <unknown K is_clause> ~~> X_T IsC2 : is_clause X_T * ============================ (exists Note C', <unknown K is_clause> = noteClause Note C') \/ ((exists Note C', <unknown K is_clause> = noteClause Note C') -> false)
< search. Proof completed.
< Prove unsat_proofs:lrat:is_clause_eq_or_not. Subgoal 3: Variables: C2 I I1 IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC2 : is_clause C2 IsC3 : is_integer I1 IsC4 : is_integer I ============================ rangeClause I1 I = C2 \/ (rangeClause I1 I = C2 -> false)
< Or: apply is_clause_rangeClause_or_not to IsC2. Subgoal 3: Variables: C2 I I1 IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC2 : is_clause C2 IsC3 : is_integer I1 IsC4 : is_integer I Or : (exists Low High, C2 = rangeClause Low High) \/ ((exists Low High, C2 = rangeClause Low High) -> false) ============================ rangeClause I1 I = C2 \/ (rangeClause I1 I = C2 -> false)
< N: case Or. Subgoal 3.1: Variables: I I1 Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC2 : is_clause (rangeClause Low High) IsC3 : is_integer I1 IsC4 : is_integer I ============================ rangeClause I1 I = rangeClause Low High \/ (rangeClause I1 I = rangeClause Low High -> false)
< Is': case IsC2. Subgoal 3.1: Variables: I I1 Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC3 : is_integer I1 IsC4 : is_integer I Is' : is_integer Low Is'1 : is_integer High ============================ rangeClause I1 I = rangeClause Low High \/ (rangeClause I1 I = rangeClause Low High -> false)
< Or: apply is_integer_eq_or_not to IsC3 Is'. Subgoal 3.1: Variables: I I1 Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC3 : is_integer I1 IsC4 : is_integer I Is' : is_integer Low Is'1 : is_integer High Or : I1 = Low \/ (I1 = Low -> false) ============================ rangeClause I1 I = rangeClause Low High \/ (rangeClause I1 I = rangeClause Low High -> false)
< N: case Or. Subgoal 3.1.1: Variables: I Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause Low I) @ IsC3 : is_integer Low IsC4 : is_integer I Is' : is_integer Low Is'1 : is_integer High ============================ rangeClause Low I = rangeClause Low High \/ (rangeClause Low I = rangeClause Low High -> false)
< Or: apply is_integer_eq_or_not to IsC4 Is'1. Subgoal 3.1.1: Variables: I Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause Low I) @ IsC3 : is_integer Low IsC4 : is_integer I Is' : is_integer Low Is'1 : is_integer High Or : I = High \/ (I = High -> false) ============================ rangeClause Low I = rangeClause Low High \/ (rangeClause Low I = rangeClause Low High -> false)
< N: case Or. Subgoal 3.1.1.1: Variables: Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause Low High) @ IsC3 : is_integer Low IsC4 : is_integer High Is' : is_integer Low Is'1 : is_integer High ============================ rangeClause Low High = rangeClause Low High \/ (rangeClause Low High = rangeClause Low High -> false)
< search. Subgoal 3.1.1.2: Variables: I Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause Low I) @ IsC3 : is_integer Low IsC4 : is_integer I Is' : is_integer Low Is'1 : is_integer High N : I = High -> false ============================ rangeClause Low I = rangeClause Low High \/ (rangeClause Low I = rangeClause Low High -> false)
< right. Subgoal 3.1.1.2: Variables: I Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause Low I) @ IsC3 : is_integer Low IsC4 : is_integer I Is' : is_integer Low Is'1 : is_integer High N : I = High -> false ============================ rangeClause Low I = rangeClause Low High -> false
< intros E. Subgoal 3.1.1.2: Variables: I Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause Low I) @ IsC3 : is_integer Low IsC4 : is_integer I Is' : is_integer Low Is'1 : is_integer High N : I = High -> false E : rangeClause Low I = rangeClause Low High ============================ false
< case E. Subgoal 3.1.1.2: Variables: Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause Low High) @ IsC3 : is_integer Low IsC4 : is_integer High Is' : is_integer Low Is'1 : is_integer High N : High = High -> false ============================ false
< backchain N. Subgoal 3.1.2: Variables: I I1 Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC3 : is_integer I1 IsC4 : is_integer I Is' : is_integer Low Is'1 : is_integer High N : I1 = Low -> false ============================ rangeClause I1 I = rangeClause Low High \/ (rangeClause I1 I = rangeClause Low High -> false)
< right. Subgoal 3.1.2: Variables: I I1 Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC3 : is_integer I1 IsC4 : is_integer I Is' : is_integer Low Is'1 : is_integer High N : I1 = Low -> false ============================ rangeClause I1 I = rangeClause Low High -> false
< intros E. Subgoal 3.1.2: Variables: I I1 Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC3 : is_integer I1 IsC4 : is_integer I Is' : is_integer Low Is'1 : is_integer High N : I1 = Low -> false E : rangeClause I1 I = rangeClause Low High ============================ false
< case E. Subgoal 3.1.2: Variables: Low High IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause Low High) @ IsC3 : is_integer Low IsC4 : is_integer High Is' : is_integer Low Is'1 : is_integer High N : Low = Low -> false ============================ false
< backchain N. Subgoal 3.2: Variables: C2 I I1 IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC2 : is_clause C2 IsC3 : is_integer I1 IsC4 : is_integer I N : (exists Low High, C2 = rangeClause Low High) -> false ============================ rangeClause I1 I = C2 \/ (rangeClause I1 I = C2 -> false)
< right. Subgoal 3.2: Variables: C2 I I1 IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC2 : is_clause C2 IsC3 : is_integer I1 IsC4 : is_integer I N : (exists Low High, C2 = rangeClause Low High) -> false ============================ rangeClause I1 I = C2 -> false
< intros E. Subgoal 3.2: Variables: C2 I I1 IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC2 : is_clause C2 IsC3 : is_integer I1 IsC4 : is_integer I N : (exists Low High, C2 = rangeClause Low High) -> false E : rangeClause I1 I = C2 ============================ false
< case E. Subgoal 3.2: Variables: I I1 IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (rangeClause I1 I) @ IsC2 : is_clause (rangeClause I1 I) IsC3 : is_integer I1 IsC4 : is_integer I N : (exists Low High, rangeClause I1 I = rangeClause Low High) -> false ============================ false
< backchain N. Subgoal 4: Variables: C2 Clause S IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC2 : is_clause C2 IsC3 : is_string S IsC4 : is_clause Clause * ============================ noteClause S Clause = C2 \/ (noteClause S Clause = C2 -> false)
< Or: apply is_clause_noteClause_or_not to IsC2. Subgoal 4: Variables: C2 Clause S IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC2 : is_clause C2 IsC3 : is_string S IsC4 : is_clause Clause * Or : (exists Note C', C2 = noteClause Note C') \/ ((exists Note C', C2 = noteClause Note C') -> false) ============================ noteClause S Clause = C2 \/ (noteClause S Clause = C2 -> false)
< N: case Or. Subgoal 4.1: Variables: Clause S Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC2 : is_clause (noteClause Note C') IsC3 : is_string S IsC4 : is_clause Clause * ============================ noteClause S Clause = noteClause Note C' \/ (noteClause S Clause = noteClause Note C' -> false)
< Is': case IsC2. Subgoal 4.1: Variables: Clause S Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC3 : is_string S IsC4 : is_clause Clause * Is' : is_string Note Is'1 : is_clause C' ============================ noteClause S Clause = noteClause Note C' \/ (noteClause S Clause = noteClause Note C' -> false)
< Or: apply is_string_eq_or_not to IsC3 Is'. Subgoal 4.1: Variables: Clause S Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC3 : is_string S IsC4 : is_clause Clause * Is' : is_string Note Is'1 : is_clause C' Or : S = Note \/ (S = Note -> false) ============================ noteClause S Clause = noteClause Note C' \/ (noteClause S Clause = noteClause Note C' -> false)
< N: case Or. Subgoal 4.1.1: Variables: Clause Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause Note Clause) @ IsC3 : is_string Note IsC4 : is_clause Clause * Is' : is_string Note Is'1 : is_clause C' ============================ noteClause Note Clause = noteClause Note C' \/ (noteClause Note Clause = noteClause Note C' -> false)
< Or: apply IH to IsC4 Is'1. Subgoal 4.1.1: Variables: Clause Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause Note Clause) @ IsC3 : is_string Note IsC4 : is_clause Clause * Is' : is_string Note Is'1 : is_clause C' Or : Clause = C' \/ (Clause = C' -> false) ============================ noteClause Note Clause = noteClause Note C' \/ (noteClause Note Clause = noteClause Note C' -> false)
< N: case Or. Subgoal 4.1.1.1: Variables: Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause Note C') @ IsC3 : is_string Note IsC4 : is_clause C' * Is' : is_string Note Is'1 : is_clause C' ============================ noteClause Note C' = noteClause Note C' \/ (noteClause Note C' = noteClause Note C' -> false)
< search. Subgoal 4.1.1.2: Variables: Clause Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause Note Clause) @ IsC3 : is_string Note IsC4 : is_clause Clause * Is' : is_string Note Is'1 : is_clause C' N : Clause = C' -> false ============================ noteClause Note Clause = noteClause Note C' \/ (noteClause Note Clause = noteClause Note C' -> false)
< right. Subgoal 4.1.1.2: Variables: Clause Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause Note Clause) @ IsC3 : is_string Note IsC4 : is_clause Clause * Is' : is_string Note Is'1 : is_clause C' N : Clause = C' -> false ============================ noteClause Note Clause = noteClause Note C' -> false
< intros E. Subgoal 4.1.1.2: Variables: Clause Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause Note Clause) @ IsC3 : is_string Note IsC4 : is_clause Clause * Is' : is_string Note Is'1 : is_clause C' N : Clause = C' -> false E : noteClause Note Clause = noteClause Note C' ============================ false
< case E. Subgoal 4.1.1.2: Variables: Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause Note C') @ IsC3 : is_string Note IsC4 : is_clause C' * Is' : is_string Note Is'1 : is_clause C' N : C' = C' -> false ============================ false
< backchain N. Subgoal 4.1.2: Variables: Clause S Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC3 : is_string S IsC4 : is_clause Clause * Is' : is_string Note Is'1 : is_clause C' N : S = Note -> false ============================ noteClause S Clause = noteClause Note C' \/ (noteClause S Clause = noteClause Note C' -> false)
< right. Subgoal 4.1.2: Variables: Clause S Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC3 : is_string S IsC4 : is_clause Clause * Is' : is_string Note Is'1 : is_clause C' N : S = Note -> false ============================ noteClause S Clause = noteClause Note C' -> false
< intros E. Subgoal 4.1.2: Variables: Clause S Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC3 : is_string S IsC4 : is_clause Clause * Is' : is_string Note Is'1 : is_clause C' N : S = Note -> false E : noteClause S Clause = noteClause Note C' ============================ false
< case E. Subgoal 4.1.2: Variables: Note C' IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause Note C') @ IsC3 : is_string Note IsC4 : is_clause C' * Is' : is_string Note Is'1 : is_clause C' N : Note = Note -> false ============================ false
< backchain N. Subgoal 4.2: Variables: C2 Clause S IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC2 : is_clause C2 IsC3 : is_string S IsC4 : is_clause Clause * N : (exists Note C', C2 = noteClause Note C') -> false ============================ noteClause S Clause = C2 \/ (noteClause S Clause = C2 -> false)
< right. Subgoal 4.2: Variables: C2 Clause S IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC2 : is_clause C2 IsC3 : is_string S IsC4 : is_clause Clause * N : (exists Note C', C2 = noteClause Note C') -> false ============================ noteClause S Clause = C2 -> false
< intros E. Subgoal 4.2: Variables: C2 Clause S IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC2 : is_clause C2 IsC3 : is_string S IsC4 : is_clause Clause * N : (exists Note C', C2 = noteClause Note C') -> false E : noteClause S Clause = C2 ============================ false
< case E. Subgoal 4.2: Variables: Clause S IH : forall C1 C2, is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false) IsC1 : is_clause (noteClause S Clause) @ IsC2 : is_clause (noteClause S Clause) IsC3 : is_string S IsC4 : is_clause Clause * N : (exists Note C', noteClause S Clause = noteClause Note C') -> false ============================ false
< backchain N. 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. Subgoal 1: Variables: Sat High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp3 : sat_clause Sat (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne ============================ sat_clause Sat (or (pos Low) (rangeClause PlusOne High))
< Sat: case Hyp3. Subgoal 1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat ============================ sat_clause Sat (or (pos Low) (rangeClause PlusOne High))
< Or: apply lesseq_integer_less_or_eq to Sat. Subgoal 1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat Or : Low < X \/ Low = X ============================ sat_clause Sat (or (pos Low) (rangeClause PlusOne High))
< L: case Or. Subgoal 1.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat L : Low < X ============================ sat_clause Sat (or (pos Low) (rangeClause PlusOne High))
< Is: case Hyp2. Subgoal 1.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat L : Low < X Is : is_integer Low Is1 : is_integer High ============================ sat_clause Sat (or (pos Low) (rangeClause PlusOne High))
< P: apply plus_integer_comm to _ _ Hyp5. Subgoal 1.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat L : Low < X Is : is_integer Low Is1 : is_integer High P : Low + 1 = PlusOne ============================ sat_clause Sat (or (pos Low) (rangeClause PlusOne High))
< IsPosX: apply mem_is_lit to _ Sat2. Subgoal 1.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat L : Low < X Is : is_integer Low Is1 : is_integer High P : Low + 1 = PlusOne IsPosX : is_lit (pos X) ============================ sat_clause Sat (or (pos Low) (rangeClause PlusOne High))
< case IsPosX. Subgoal 1.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat L : Low < X Is : is_integer Low Is1 : is_integer High P : Low + 1 = PlusOne H1 : is_integer X ============================ sat_clause Sat (or (pos Low) (rangeClause PlusOne High))
< apply less_lesseq_plus_one to _ _ L P. Subgoal 1.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat L : Low < X Is : is_integer Low Is1 : is_integer High P : Low + 1 = PlusOne H1 : is_integer X H2 : PlusOne <= X ============================ sat_clause Sat (or (pos Low) (rangeClause PlusOne High))
< search. Subgoal 1.2: Variables: Sat High PlusOne X Hyp : |{clause}- rangeClause X High ~~> or (pos X) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause X High) Hyp4 : X <= High Hyp5 : 1 + X = PlusOne Sat : X <= X Sat1 : X <= High Sat2 : mem (pos X) Sat ============================ sat_clause Sat (or (pos X) (rangeClause PlusOne High))
< search. Subgoal 2: Variables: Sat High Low Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp3 : sat_clause Sat (rangeClause Low High) Hyp4 : Low > High ============================ sat_clause Sat emptyClause
< Sat: case Hyp3. Subgoal 2: Variables: Sat High Low X Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low > High Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat ============================ sat_clause Sat emptyClause
< Or: apply lesseq_integer_less_or_eq to Sat. Subgoal 2: Variables: Sat High Low X Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low > High Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat Or : Low < X \/ Low = X ============================ sat_clause Sat emptyClause
< L: case Or. Subgoal 2.1: Variables: Sat High Low X Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low > High Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat L : Low < X ============================ sat_clause Sat emptyClause
< HL: apply greater_integer_flip_less to Hyp4. Subgoal 2.1: Variables: Sat High Low X Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low > High Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat L : Low < X HL : High < Low ============================ sat_clause Sat emptyClause
< HX: apply less_integer_transitive to HL L. Subgoal 2.1: Variables: Sat High Low X Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low > High Sat : Low <= X Sat1 : X <= High Sat2 : mem (pos X) Sat L : Low < X HL : High < Low HX : High < X ============================ sat_clause Sat emptyClause
< apply greater_lesseq_integer_false to _ Sat1. Subgoal 2.2: Variables: Sat High X Hyp : |{clause}- rangeClause X High ~~> emptyClause Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause X High) Hyp4 : X > High Sat : X <= X Sat1 : X <= High Sat2 : mem (pos X) Sat ============================ sat_clause Sat emptyClause
< apply greater_lesseq_integer_false to Hyp4 Sat1. Subgoal 3: Variables: C' Sat Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp1 : is_list is_lit Sat Hyp2 : is_clause (noteClause Note C') Hyp3 : sat_clause Sat (noteClause Note C') ============================ sat_clause Sat C'
< case Hyp3. Subgoal 3: Variables: C' Sat Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp1 : is_list is_lit Sat Hyp2 : is_clause (noteClause Note C') H1 : sat_clause Sat C' ============================ sat_clause Sat C'
< search. Proof completed.
< Prove_Constraint unsat_proofs:lrat:sat_clause_proj_to_ext. Subgoal 1: Variables: Sat High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp3 : sat_clause Sat (or (pos Low) (rangeClause PlusOne High)) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne ============================ sat_clause Sat (rangeClause Low High)
< Sat: case Hyp3. Subgoal 1.1: Variables: Sat High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : mem (pos Low) Sat ============================ sat_clause Sat (rangeClause Low High)
< Is: case Hyp2. Subgoal 1.1: Variables: Sat High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : mem (pos Low) Sat Is : is_integer Low Is1 : is_integer High ============================ sat_clause Sat (rangeClause Low High)
< apply is_integer_lesseq to Is. Subgoal 1.1: Variables: Sat High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : mem (pos Low) Sat Is : is_integer Low Is1 : is_integer High H1 : Low <= Low ============================ sat_clause Sat (rangeClause Low High)
< search. Subgoal 1.2: Variables: Sat High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : sat_clause Sat (rangeClause PlusOne High) ============================ sat_clause Sat (rangeClause Low High)
< Sat: case Sat. Subgoal 1.2: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : PlusOne <= X Sat1 : X <= High Sat2 : mem (pos X) Sat ============================ sat_clause Sat (rangeClause Low High)
< IsPosX: apply mem_is_lit to _ Sat2. Subgoal 1.2: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : PlusOne <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsPosX : is_lit (pos X) ============================ sat_clause Sat (rangeClause Low High)
< IsX: case IsPosX. Subgoal 1.2: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : PlusOne <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X ============================ sat_clause Sat (rangeClause Low High)
< Or: apply lesseq_integer_less_or_eq to Sat. Subgoal 1.2: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : PlusOne <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X Or : PlusOne < X \/ PlusOne = X ============================ sat_clause Sat (rangeClause Low High)
< L: case Or. Subgoal 1.2.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : PlusOne <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X L : PlusOne < X ============================ sat_clause Sat (rangeClause Low High)
< Is: case Hyp2. Subgoal 1.2.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : PlusOne <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X L : PlusOne < X Is : is_integer Low Is1 : is_integer High ============================ sat_clause Sat (rangeClause Low High)
< P: apply plus_integer_comm to _ _ Hyp5. Subgoal 1.2.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : PlusOne <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X L : PlusOne < X Is : is_integer Low Is1 : is_integer High P : Low + 1 = PlusOne ============================ sat_clause Sat (rangeClause Low High)
< L: apply lt_plus_one to Hyp5 _. Subgoal 1.2.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : PlusOne <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X L : PlusOne < X Is : is_integer Low Is1 : is_integer High P : Low + 1 = PlusOne L1 : Low < PlusOne ============================ sat_clause Sat (rangeClause Low High)
< LE: apply less_integer_lesseq to L1. Subgoal 1.2.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : PlusOne <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X L : PlusOne < X Is : is_integer Low Is1 : is_integer High P : Low + 1 = PlusOne L1 : Low < PlusOne LE : Low <= PlusOne ============================ sat_clause Sat (rangeClause Low High)
< apply lesseq_integer_transitive to LE Sat. Subgoal 1.2.1: Variables: Sat High PlusOne Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Sat : PlusOne <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X L : PlusOne < X Is : is_integer Low Is1 : is_integer High P : Low + 1 = PlusOne L1 : Low < PlusOne LE : Low <= PlusOne H1 : Low <= X ============================ sat_clause Sat (rangeClause Low High)
< search. Subgoal 1.2.2: Variables: Sat High Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause X High) Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = X Sat : X <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X ============================ sat_clause Sat (rangeClause Low High)
< Is: case Hyp2. Subgoal 1.2.2: Variables: Sat High Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause X High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = X Sat : X <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X Is : is_integer Low Is1 : is_integer High ============================ sat_clause Sat (rangeClause Low High)
< L: apply lt_plus_one to Hyp5 _. Subgoal 1.2.2: Variables: Sat High Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause X High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = X Sat : X <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X Is : is_integer Low Is1 : is_integer High L : Low < X ============================ sat_clause Sat (rangeClause Low High)
< apply less_integer_lesseq to L. Subgoal 1.2.2: Variables: Sat High Low X Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause X High) Hyp1 : is_list is_lit Sat Hyp4 : Low <= High Hyp5 : 1 + Low = X Sat : X <= X Sat1 : X <= High Sat2 : mem (pos X) Sat IsX : is_integer X Is : is_integer Low Is1 : is_integer High L : Low < X H1 : Low <= X ============================ sat_clause Sat (rangeClause Low High)
< search. Subgoal 2: Variables: Sat High Low Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Sat Hyp2 : is_clause (rangeClause Low High) Hyp3 : sat_clause Sat emptyClause Hyp4 : Low > High ============================ sat_clause Sat (rangeClause Low High)
< case Hyp3. Subgoal 3: Variables: C' Sat Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp1 : is_list is_lit Sat Hyp2 : is_clause (noteClause Note C') Hyp3 : sat_clause Sat C' ============================ sat_clause Sat (noteClause Note C')
< search. Proof completed.
< Theorem negs_total : forall L, is_list is_integer L -> exists N, negs L N. ============================ forall L, is_list is_integer L -> exists N, negs L N
< induction on 1. IH : forall L, is_list is_integer L * -> exists N, negs L N ============================ forall L, is_list is_integer L @ -> exists N, negs L N
< intros IsL. Variables: L IH : forall L, is_list is_integer L * -> exists N, negs L N IsL : is_list is_integer L @ ============================ exists N, negs L N
< IsL: case IsL. Subgoal 1: IH : forall L, is_list is_integer L * -> exists N, negs L N ============================ exists N, negs [] N
< search. Subgoal 2: Variables: T H IH : forall L, is_list is_integer L * -> exists N, negs L N IsL : is_integer H IsL1 : is_list is_integer T * ============================ exists N, negs (H::T) N
< apply IH to IsL1. Subgoal 2: Variables: T H N IH : forall L, is_list is_integer L * -> exists N, negs L N IsL : is_integer H IsL1 : is_list is_integer T * H1 : negs T N ============================ exists N, negs (H::T) N
< search. Proof completed.
< Theorem negs_mem : forall L N X, mem X L -> negs L N -> mem (neg X) N. ============================ forall L N X, mem X L -> negs L N -> mem (neg X) N
< induction on 1. IH : forall L N X, mem X L * -> negs L N -> mem (neg X) N ============================ forall L N X, mem X L @ -> negs L N -> mem (neg X) N
< intros Mem Negs. Variables: L N X IH : forall L N X, mem X L * -> negs L N -> mem (neg X) N Mem : mem X L @ Negs : negs L N ============================ mem (neg X) N
< Mem: case Mem. Subgoal 1: Variables: N X Rest IH : forall L N X, mem X L * -> negs L N -> mem (neg X) N Negs : negs (X::Rest) N ============================ mem (neg X) N
< case Negs. Subgoal 1: Variables: X Rest LRest IH : forall L N X, mem X L * -> negs L N -> mem (neg X) N H1 : negs Rest LRest ============================ mem (neg X) ((neg X)::LRest)
< search. Subgoal 2: Variables: N X Rest I IH : forall L N X, mem X L * -> negs L N -> mem (neg X) N Negs : negs (I::Rest) N Mem : mem X Rest * ============================ mem (neg X) N
< Negs: case Negs. Subgoal 2: Variables: X Rest I LRest IH : forall L N X, mem X L * -> negs L N -> mem (neg X) N Mem : mem X Rest * Negs : negs Rest LRest ============================ mem (neg X) ((neg I)::LRest)
< apply IH to Mem Negs. Subgoal 2: Variables: X Rest I LRest IH : forall L N X, mem X L * -> negs L N -> mem (neg X) N Mem : mem X Rest * Negs : negs Rest LRest H1 : mem (neg X) LRest ============================ mem (neg X) ((neg I)::LRest)
< search. Proof completed.
< Theorem negs_subset : forall LA LB NA NB, subset LA LB -> negs LA NA -> negs LB NB -> subset NA NB. ============================ forall LA LB NA NB, subset LA LB -> negs LA NA -> negs LB NB -> subset NA NB
< induction on 1. IH : forall LA LB NA NB, subset LA LB * -> negs LA NA -> negs LB NB -> subset NA NB ============================ forall LA LB NA NB, subset LA LB @ -> negs LA NA -> negs LB NB -> subset NA NB
< intros S NA NB. Variables: LA LB NA NB IH : forall LA LB NA NB, subset LA LB * -> negs LA NA -> negs LB NB -> subset NA NB S : subset LA LB @ NA : negs LA NA NB : negs LB NB ============================ subset NA NB
< S: case S. Subgoal 1: Variables: LB NA NB IH : forall LA LB NA NB, subset LA LB * -> negs LA NA -> negs LB NB -> subset NA NB NA : negs [] NA NB : negs LB NB ============================ subset NA NB
< case NA. Subgoal 1: Variables: LB NB IH : forall LA LB NA NB, subset LA LB * -> negs LA NA -> negs LB NB -> subset NA NB NB : negs LB NB ============================ subset [] NB
< search. Subgoal 2: Variables: LB NA NB Rest X IH : forall LA LB NA NB, subset LA LB * -> negs LA NA -> negs LB NB -> subset NA NB NA : negs (X::Rest) NA NB : negs LB NB S : mem X LB S1 : subset Rest LB * ============================ subset NA NB
< NA: case NA. Subgoal 2: Variables: LB NB Rest X LRest IH : forall LA LB NA NB, subset LA LB * -> negs LA NA -> negs LB NB -> subset NA NB NB : negs LB NB S : mem X LB S1 : subset Rest LB * NA : negs Rest LRest ============================ subset ((neg X)::LRest) NB
< apply IH to S1 NA NB. Subgoal 2: Variables: LB NB Rest X LRest IH : forall LA LB NA NB, subset LA LB * -> negs LA NA -> negs LB NB -> subset NA NB NB : negs LB NB S : mem X LB S1 : subset Rest LB * NA : negs Rest LRest H1 : subset LRest NB ============================ subset ((neg X)::LRest) NB
< apply negs_mem to S NB. Subgoal 2: Variables: LB NB Rest X LRest IH : forall LA LB NA NB, subset LA LB * -> negs LA NA -> negs LB NB -> subset NA NB NB : negs LB NB S : mem X LB S1 : subset Rest LB * NA : negs Rest LRest H1 : subset LRest NB H2 : mem (neg X) NB ============================ subset ((neg X)::LRest) NB
< search. Proof completed.
< Prove_Constraint unsat_proofs:lrat:unsat_clause_ext_to_proj. Subgoal 1: Variables: Unsat High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp2 : is_clause (rangeClause Low High) Hyp3 : unsat_clause Unsat (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< Is: case Hyp2. Subgoal 1: Variables: Unsat High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp3 : unsat_clause Unsat (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< IsPlusOne: apply plus_integer_is_integer to _ _ Hyp5. Subgoal 1: Variables: Unsat High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp3 : unsat_clause Unsat (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< Unsat: case Hyp3. Subgoal 1: Variables: Unsat High PlusOne Low R N Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< L: apply lt_plus_one to Hyp5 _. Subgoal 1: Variables: Unsat High PlusOne Low R N Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< R: apply range_smaller_exists to _ _ Unsat L. Subgoal 1: Variables: Unsat High PlusOne Low R N R' Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< SRR': apply range_subset to _ _ Unsat R _. Subgoal 1: Variables: Unsat High PlusOne Low R N R' Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< IsPlusOne: apply plus_integer_is_integer to _ _ Hyp5. Subgoal 1: Variables: Unsat High PlusOne Low R N R' Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< IsR': apply range_is to _ R. Subgoal 1: Variables: Unsat High PlusOne Low R N R' Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< N: apply negs_total to IsR'. Subgoal 1: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< S': apply negs_subset to SRR' N Unsat1. Subgoal 1: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< Mem: assert mem Low R. Subgoal 1.1: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N ============================ mem Low R
< case Unsat. Subgoal 1.1.1: Variables: Unsat High PlusOne Low N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat1 : negs [] N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' [] IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N H1 : Low > High ============================ mem Low []
< apply greater_lesseq_integer_false to _ Hyp4. Subgoal 1.1.2: Variables: Unsat High PlusOne Low N R' N1 PlusOne1 Rest Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat1 : negs (Low::Rest) N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' (Low::Rest) IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N H1 : Low <= High H2 : 1 + Low = PlusOne1 H3 : range PlusOne1 High Rest ============================ mem Low (Low::Rest)
< search. Subgoal 1: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< MemN: apply negs_mem to Mem Unsat1. Subgoal 1: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High))
< unfold . Subgoal 1: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ exists NL, negate_lit (pos Low) NL /\ (mem NL Unsat /\ unsat_clause Unsat (rangeClause PlusOne High))
< exists neg Low. Subgoal 1: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ negate_lit (pos Low) (neg Low) /\ (mem (neg Low) Unsat /\ unsat_clause Unsat (rangeClause PlusOne High))
< split. Subgoal 1.2: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ negate_lit (pos Low) (neg Low)
< search. Subgoal 1.3: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ mem (neg Low) Unsat
< apply subset_mem to Unsat2 MemN. Subgoal 1.3: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N H1 : mem (neg Low) Unsat ============================ mem (neg Low) Unsat
< search. Subgoal 1.4: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ unsat_clause Unsat (rangeClause PlusOne High)
< unfold . Subgoal 1.4: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ exists R N, range PlusOne High R /\ (negs R N /\ subset N Unsat)
< exists R', N1. Subgoal 1.4: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ range PlusOne High R' /\ (negs R' N1 /\ subset N1 Unsat)
< split. Subgoal 1.4.1: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ range PlusOne High R'
< search. Subgoal 1.4.2: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ negs R' N1
< search. Subgoal 1.4.3: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N ============================ subset N1 Unsat
< apply subset_trans to S' Unsat2. Subgoal 1.4.3: Variables: Unsat High PlusOne Low R N R' N1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Is : is_integer Low Is1 : is_integer High IsPlusOne : is_integer PlusOne Unsat : range Low High R Unsat1 : negs R N Unsat2 : subset N Unsat L : Low < PlusOne R : range PlusOne High R' SRR' : subset R' R IsPlusOne1 : is_integer PlusOne IsR' : is_list is_integer R' N : negs R' N1 S' : subset N1 N Mem : mem Low R MemN : mem (neg Low) N H1 : subset N1 Unsat ============================ subset N1 Unsat
< search. Subgoal 2: Variables: Unsat High Low Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Unsat Hyp2 : is_clause (rangeClause Low High) Hyp3 : unsat_clause Unsat (rangeClause Low High) Hyp4 : Low > High ============================ unsat_clause Unsat emptyClause
< search. Subgoal 3: Variables: C' Unsat Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp1 : is_list is_lit Unsat Hyp2 : is_clause (noteClause Note C') Hyp3 : unsat_clause Unsat (noteClause Note C') ============================ unsat_clause Unsat C'
< case Hyp3. Subgoal 3: Variables: C' Unsat Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp1 : is_list is_lit Unsat Hyp2 : is_clause (noteClause Note C') H1 : unsat_clause Unsat C' ============================ unsat_clause Unsat C'
< search. Proof completed.
< Prove_Constraint unsat_proofs:lrat:unsat_clause_proj_to_ext. Subgoal 1: Variables: Unsat High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp2 : is_clause (rangeClause Low High) Hyp3 : unsat_clause Unsat (or (pos Low) (rangeClause PlusOne High)) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne ============================ unsat_clause Unsat (rangeClause Low High)
< Unsat: case Hyp3. Subgoal 1: Variables: Unsat High PlusOne Low NL Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp2 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Unsat : negate_lit (pos Low) NL Unsat1 : mem NL Unsat Unsat2 : unsat_clause Unsat (rangeClause PlusOne High) ============================ unsat_clause Unsat (rangeClause Low High)
< Is: case Hyp2. Subgoal 1: Variables: Unsat High PlusOne Low NL Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Unsat : negate_lit (pos Low) NL Unsat1 : mem NL Unsat Unsat2 : unsat_clause Unsat (rangeClause PlusOne High) Is : is_integer Low Is1 : is_integer High ============================ unsat_clause Unsat (rangeClause Low High)
< US: case Unsat2. Subgoal 1: Variables: Unsat High PlusOne Low NL R N Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Unsat : negate_lit (pos Low) NL Unsat1 : mem NL Unsat Is : is_integer Low Is1 : is_integer High US : range PlusOne High R US1 : negs R N US2 : subset N Unsat ============================ unsat_clause Unsat (rangeClause Low High)
< R: assert range Low High (Low::R). Subgoal 1: Variables: Unsat High PlusOne Low NL R N Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Unsat : negate_lit (pos Low) NL Unsat1 : mem NL Unsat Is : is_integer Low Is1 : is_integer High US : range PlusOne High R US1 : negs R N US2 : subset N Unsat R : range Low High (Low::R) ============================ unsat_clause Unsat (rangeClause Low High)
< N: assert negs (Low::R) ((neg Low)::N). Subgoal 1: Variables: Unsat High PlusOne Low NL R N Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Unsat : negate_lit (pos Low) NL Unsat1 : mem NL Unsat Is : is_integer Low Is1 : is_integer High US : range PlusOne High R US1 : negs R N US2 : subset N Unsat R : range Low High (Low::R) N : negs (Low::R) ((neg Low)::N) ============================ unsat_clause Unsat (rangeClause Low High)
< case Unsat. Subgoal 1: Variables: Unsat High PlusOne Low R N Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Unsat1 : mem (neg Low) Unsat Is : is_integer Low Is1 : is_integer High US : range PlusOne High R US1 : negs R N US2 : subset N Unsat R : range Low High (Low::R) N : negs (Low::R) ((neg Low)::N) ============================ unsat_clause Unsat (rangeClause Low High)
< assert subset ((neg Low)::N) Unsat. Subgoal 1: Variables: Unsat High PlusOne Low R N Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_list is_lit Unsat Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne Unsat1 : mem (neg Low) Unsat Is : is_integer Low Is1 : is_integer High US : range PlusOne High R US1 : negs R N US2 : subset N Unsat R : range Low High (Low::R) N : negs (Low::R) ((neg Low)::N) H1 : subset ((neg Low)::N) Unsat ============================ unsat_clause Unsat (rangeClause Low High)
< search. Subgoal 2: Variables: Unsat High Low Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Unsat Hyp2 : is_clause (rangeClause Low High) Hyp3 : unsat_clause Unsat emptyClause Hyp4 : Low > High ============================ unsat_clause Unsat (rangeClause Low High)
< R: assert range Low High []. Subgoal 2: Variables: Unsat High Low Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Unsat Hyp2 : is_clause (rangeClause Low High) Hyp3 : unsat_clause Unsat emptyClause Hyp4 : Low > High R : range Low High [] ============================ unsat_clause Unsat (rangeClause Low High)
< assert negs [] []. Subgoal 2: Variables: Unsat High Low Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_list is_lit Unsat Hyp2 : is_clause (rangeClause Low High) Hyp3 : unsat_clause Unsat emptyClause Hyp4 : Low > High R : range Low High [] H1 : negs [] [] ============================ unsat_clause Unsat (rangeClause Low High)
< search. Subgoal 3: Variables: C' Unsat Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp1 : is_list is_lit Unsat Hyp2 : is_clause (noteClause Note C') Hyp3 : unsat_clause Unsat C' ============================ unsat_clause Unsat (noteClause Note C')
< search. 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.
< Theorem negs_form : forall L N X, negs L N -> mem X N -> exists I, X = neg I. ============================ forall L N X, negs L N -> mem X N -> exists I, X = neg I
< induction on 2. IH : forall L N X, negs L N -> mem X N * -> exists I, X = neg I ============================ forall L N X, negs L N -> mem X N @ -> exists I, X = neg I
< intros N M. Variables: L N X IH : forall L N X, negs L N -> mem X N * -> exists I, X = neg I N : negs L N M : mem X N @ ============================ exists I, X = neg I
< M: case M. Subgoal 1: Variables: L X Rest IH : forall L N X, negs L N -> mem X N * -> exists I, X = neg I N : negs L (X::Rest) ============================ exists I, X = neg I
< case N. Subgoal 1: Variables: Rest I Rest1 IH : forall L N X, negs L N -> mem X N * -> exists I, X = neg I H1 : negs Rest1 Rest ============================ exists I1, neg I = neg I1
< search. Subgoal 2: Variables: L X Rest I IH : forall L N X, negs L N -> mem X N * -> exists I, X = neg I N : negs L (I::Rest) M : mem X Rest * ============================ exists I, X = neg I
< N: case N. Subgoal 2: Variables: X Rest I1 Rest1 IH : forall L N X, negs L N -> mem X N * -> exists I, X = neg I M : mem X Rest * N : negs Rest1 Rest ============================ exists I, X = neg I
< apply IH to _ M. Subgoal 2: Variables: Rest I1 Rest1 I2 IH : forall L N X, negs L N -> mem X N * -> exists I, X = neg I M : mem (neg I2) Rest * N : negs Rest1 Rest ============================ exists I, neg I2 = neg I
< search. Proof completed.
< Prove unsat_proofs:lrat:unsat_sat_clause. Subgoal 3: Variables: A R N High Low IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A UNSAT : unsat_clause A (rangeClause Low High) @ SAT : sat_clause A (rangeClause Low High) GA : good_assignment A UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A ============================ false
< SAT: case SAT. Subgoal 3: Variables: A R N High Low X IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A UNSAT : unsat_clause A (rangeClause Low High) @ GA : good_assignment A UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) A ============================ false
< Is: case IsC. Subgoal 3: Variables: A R N High Low X IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsA : is_list is_lit A UNSAT : unsat_clause A (rangeClause Low High) @ GA : good_assignment A UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) A Is : is_integer Low Is1 : is_integer High ============================ false
< IsR: apply range_is to _ UNSAT1. Subgoal 3: Variables: A R N High Low X IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsA : is_list is_lit A UNSAT : unsat_clause A (rangeClause Low High) @ GA : good_assignment A UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) A Is : is_integer Low Is1 : is_integer High IsR : is_list is_integer R ============================ false
< IsX: apply between_integers_is_integer to _ _ SAT SAT1. Subgoal 3: Variables: A R N High Low X IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsA : is_list is_lit A UNSAT : unsat_clause A (rangeClause Low High) @ GA : good_assignment A UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) A Is : is_integer Low Is1 : is_integer High IsR : is_list is_integer R IsX : is_integer X ============================ false
< M: apply in_range to _ _ UNSAT1 SAT SAT1. Subgoal 3: Variables: A R N High Low X IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsA : is_list is_lit A UNSAT : unsat_clause A (rangeClause Low High) @ GA : good_assignment A UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) A Is : is_integer Low Is1 : is_integer High IsR : is_list is_integer R IsX : is_integer X M : mem X R ============================ false
< M': apply negs_mem to M UNSAT2. Subgoal 3: Variables: A R N High Low X IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsA : is_list is_lit A UNSAT : unsat_clause A (rangeClause Low High) @ GA : good_assignment A UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) A Is : is_integer Low Is1 : is_integer High IsR : is_list is_integer R IsX : is_integer X M : mem X R M' : mem (neg X) N ============================ false
< M3: apply subset_mem to UNSAT3 M'. Subgoal 3: Variables: A R N High Low X IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsA : is_list is_lit A UNSAT : unsat_clause A (rangeClause Low High) @ GA : good_assignment A UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) A Is : is_integer Low Is1 : is_integer High IsR : is_list is_integer R IsX : is_integer X M : mem X R M' : mem (neg X) N M3 : mem (neg X) A ============================ false
< GA: case GA. Subgoal 3: Variables: A R N High Low X IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsA : is_list is_lit A UNSAT : unsat_clause A (rangeClause Low High) @ UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) A Is : is_integer Low Is1 : is_integer High IsR : is_list is_integer R IsX : is_integer X M : mem X R M' : mem (neg X) N M3 : mem (neg X) A GA : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false ============================ false
< apply GA to SAT2 _ M3. Subgoal 4: Variables: A Clause Note IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsC : is_clause (noteClause Note Clause) IsA : is_list is_lit A UNSAT : unsat_clause A (noteClause Note Clause) @ SAT : sat_clause A (noteClause Note Clause) GA : good_assignment A UNSAT1 : unsat_clause A Clause * ============================ false
< SAT: case SAT. Subgoal 4: Variables: A Clause Note IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsC : is_clause (noteClause Note Clause) IsA : is_list is_lit A UNSAT : unsat_clause A (noteClause Note Clause) @ GA : good_assignment A UNSAT1 : unsat_clause A Clause * SAT : sat_clause A Clause ============================ false
< case IsC. Subgoal 4: Variables: A Clause Note IH : forall A C, is_clause C -> is_list is_lit A -> unsat_clause A C * -> sat_clause A C -> good_assignment A -> false IsA : is_list is_lit A UNSAT : unsat_clause A (noteClause Note Clause) @ GA : good_assignment A UNSAT1 : unsat_clause A Clause * SAT : sat_clause A Clause H1 : is_string Note H2 : is_clause Clause ============================ false
< apply IH to _ _ UNSAT1 SAT GA. Proof completed.
< Prove unsat_proofs:lrat:sat_clause_orderless. Subgoal 3: Variables: A1 A2 X High Low IH : forall A1 A2 C, is_clause C -> is_list is_lit A1 -> is_list is_lit A2 -> sat_clause A1 C * -> (forall L, mem L A1 -> mem L A2) -> sat_clause A2 C IsC : is_clause (rangeClause Low High) IsA1 : is_list is_lit A1 IsA2 : is_list is_lit A2 SAT : sat_clause A1 (rangeClause Low High) @ MemA1A2 : forall L, mem L A1 -> mem L A2 SAT1 : Low <= X SAT2 : X <= High SAT3 : mem (pos X) A1 ============================ sat_clause A2 (rangeClause Low High)
< apply MemA1A2 to SAT3. Subgoal 3: Variables: A1 A2 X High Low IH : forall A1 A2 C, is_clause C -> is_list is_lit A1 -> is_list is_lit A2 -> sat_clause A1 C * -> (forall L, mem L A1 -> mem L A2) -> sat_clause A2 C IsC : is_clause (rangeClause Low High) IsA1 : is_list is_lit A1 IsA2 : is_list is_lit A2 SAT : sat_clause A1 (rangeClause Low High) @ MemA1A2 : forall L, mem L A1 -> mem L A2 SAT1 : Low <= X SAT2 : X <= High SAT3 : mem (pos X) A1 H1 : mem (pos X) A2 ============================ sat_clause A2 (rangeClause Low High)
< search. Subgoal 4: Variables: A1 A2 Clause Note IH : forall A1 A2 C, is_clause C -> is_list is_lit A1 -> is_list is_lit A2 -> sat_clause A1 C * -> (forall L, mem L A1 -> mem L A2) -> sat_clause A2 C IsC : is_clause (noteClause Note Clause) IsA1 : is_list is_lit A1 IsA2 : is_list is_lit A2 SAT : sat_clause A1 (noteClause Note Clause) @ MemA1A2 : forall L, mem L A1 -> mem L A2 SAT1 : sat_clause A1 Clause * ============================ sat_clause A2 (noteClause Note Clause)
< case IsC. Subgoal 4: Variables: A1 A2 Clause Note IH : forall A1 A2 C, is_clause C -> is_list is_lit A1 -> is_list is_lit A2 -> sat_clause A1 C * -> (forall L, mem L A1 -> mem L A2) -> sat_clause A2 C IsA1 : is_list is_lit A1 IsA2 : is_list is_lit A2 SAT : sat_clause A1 (noteClause Note Clause) @ MemA1A2 : forall L, mem L A1 -> mem L A2 SAT1 : sat_clause A1 Clause * H1 : is_string Note H2 : is_clause Clause ============================ sat_clause A2 (noteClause Note Clause)
< apply IH to _ _ _ SAT1 MemA1A2. Subgoal 4: Variables: A1 A2 Clause Note IH : forall A1 A2 C, is_clause C -> is_list is_lit A1 -> is_list is_lit A2 -> sat_clause A1 C * -> (forall L, mem L A1 -> mem L A2) -> sat_clause A2 C IsA1 : is_list is_lit A1 IsA2 : is_list is_lit A2 SAT : sat_clause A1 (noteClause Note Clause) @ MemA1A2 : forall L, mem L A1 -> mem L A2 SAT1 : sat_clause A1 Clause * H1 : is_string Note H2 : is_clause Clause H3 : sat_clause A2 Clause ============================ sat_clause A2 (noteClause Note Clause)
< search. Proof completed.
< Prove unsat_proofs:lrat:sat_formula_orderless. Proof completed.
< Theorem mems_subset : forall Sub Sup, is_list is_lit Sub -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup. ============================ forall Sub Sup, is_list is_lit Sub -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup
< induction on 1. IH : forall Sub Sup, is_list is_lit Sub * -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup ============================ forall Sub Sup, is_list is_lit Sub @ -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup
< intros Is Mems. Variables: Sub Sup IH : forall Sub Sup, is_list is_lit Sub * -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup Is : is_list is_lit Sub @ Mems : forall X, mem X Sub -> mem X Sup ============================ subset Sub Sup
< Is: case Is. Subgoal 1: Variables: Sup IH : forall Sub Sup, is_list is_lit Sub * -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup Mems : forall X, mem X [] -> mem X Sup ============================ subset [] Sup
< search. Subgoal 2: Variables: Sup T H IH : forall Sub Sup, is_list is_lit Sub * -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup Mems : forall X, mem X (H::T) -> mem X Sup Is : is_lit H Is1 : is_list is_lit T * ============================ subset (H::T) Sup
< Mems': assert forall X, mem X T -> mem X Sup. Subgoal 2.1: Variables: Sup T H IH : forall Sub Sup, is_list is_lit Sub * -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup Mems : forall X, mem X (H::T) -> mem X Sup Is : is_lit H Is1 : is_list is_lit T * ============================ forall X, mem X T -> mem X Sup
< intros M. Subgoal 2.1: Variables: Sup T H X IH : forall Sub Sup, is_list is_lit Sub * -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup Mems : forall X, mem X (H::T) -> mem X Sup Is : is_lit H Is1 : is_list is_lit T * M : mem X T ============================ mem X Sup
< apply Mems to _ with X = X. Subgoal 2.1: Variables: Sup T H X IH : forall Sub Sup, is_list is_lit Sub * -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup Mems : forall X, mem X (H::T) -> mem X Sup Is : is_lit H Is1 : is_list is_lit T * M : mem X T H1 : mem X Sup ============================ mem X Sup
< search. Subgoal 2: Variables: Sup T H IH : forall Sub Sup, is_list is_lit Sub * -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup Mems : forall X, mem X (H::T) -> mem X Sup Is : is_lit H Is1 : is_list is_lit T * Mems' : forall X, mem X T -> mem X Sup ============================ subset (H::T) Sup
< M: apply Mems to _ with X = H. Subgoal 2: Variables: Sup T H IH : forall Sub Sup, is_list is_lit Sub * -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup Mems : forall X, mem X (H::T) -> mem X Sup Is : is_lit H Is1 : is_list is_lit T * Mems' : forall X, mem X T -> mem X Sup M : mem H Sup ============================ subset (H::T) Sup
< apply IH to Is1 Mems'. Subgoal 2: Variables: Sup T H IH : forall Sub Sup, is_list is_lit Sub * -> (forall X, mem X Sub -> mem X Sup) -> subset Sub Sup Mems : forall X, mem X (H::T) -> mem X Sup Is : is_lit H Is1 : is_list is_lit T * Mems' : forall X, mem X T -> mem X Sup M : mem H Sup H1 : subset T Sup ============================ subset (H::T) Sup
< search. Proof completed.
< Theorem mems_subset2 [A] : forall (Sup1 : list A) (Sup2 : list A) (Sub : list A), subset Sub Sup1 -> (forall X, mem X Sup1 -> mem X Sup2) -> subset Sub Sup2. ============================ forall Sup1 Sup2 Sub, subset Sub Sup1 -> (forall X, mem X Sup1 -> mem X Sup2) -> subset Sub Sup2
< induction on 1. IH : forall Sup1 Sup2 Sub, subset Sub Sup1 * -> (forall X, mem X Sup1 -> mem X Sup2) -> subset Sub Sup2 ============================ forall Sup1 Sup2 Sub, subset Sub Sup1 @ -> (forall X, mem X Sup1 -> mem X Sup2) -> subset Sub Sup2
< intros S Mems. Variables: Sup1 Sup2 Sub IH : forall Sup1 Sup2 Sub, subset Sub Sup1 * -> (forall X, mem X Sup1 -> mem X Sup2) -> subset Sub Sup2 S : subset Sub Sup1 @ Mems : forall X, mem X Sup1 -> mem X Sup2 ============================ subset Sub Sup2
< S: case S. Subgoal 1: Variables: Sup1 Sup2 IH : forall Sup1 Sup2 Sub, subset Sub Sup1 * -> (forall X, mem X Sup1 -> mem X Sup2) -> subset Sub Sup2 Mems : forall X, mem X Sup1 -> mem X Sup2 ============================ subset [] Sup2
< search. Subgoal 2: Variables: Sup1 Sup2 Rest X IH : forall Sup1 Sup2 Sub, subset Sub Sup1 * -> (forall X, mem X Sup1 -> mem X Sup2) -> subset Sub Sup2 Mems : forall X, mem X Sup1 -> mem X Sup2 S : mem X Sup1 S1 : subset Rest Sup1 * ============================ subset (X::Rest) Sup2
< apply Mems to S. Subgoal 2: Variables: Sup1 Sup2 Rest X IH : forall Sup1 Sup2 Sub, subset Sub Sup1 * -> (forall X, mem X Sup1 -> mem X Sup2) -> subset Sub Sup2 Mems : forall X, mem X Sup1 -> mem X Sup2 S : mem X Sup1 S1 : subset Rest Sup1 * H1 : mem X Sup2 ============================ subset (X::Rest) Sup2
< apply IH to S1 _. Subgoal 2: Variables: Sup1 Sup2 Rest X IH : forall Sup1 Sup2 Sub, subset Sub Sup1 * -> (forall X, mem X Sup1 -> mem X Sup2) -> subset Sub Sup2 Mems : forall X, mem X Sup1 -> mem X Sup2 S : mem X Sup1 S1 : subset Rest Sup1 * H1 : mem X Sup2 H2 : subset Rest Sup2 ============================ subset (X::Rest) Sup2
< search. Proof completed.
< Prove unsat_proofs:lrat:unsat_clause_orderless. Subgoal 3: Variables: A1 A2 R N High Low IH : forall A1 A2 C, is_clause C -> is_list is_lit A1 -> is_list is_lit A2 -> unsat_clause A1 C * -> (forall L, mem L A1 -> mem L A2) -> unsat_clause A2 C IsC : is_clause (rangeClause Low High) IsA1 : is_list is_lit A1 IsA2 : is_list is_lit A2 UNSAT : unsat_clause A1 (rangeClause Low High) @ MemA1A2 : forall L, mem L A1 -> mem L A2 UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A1 ============================ unsat_clause A2 (rangeClause Low High)
< apply mems_subset2 to UNSAT3 MemA1A2. Subgoal 3: Variables: A1 A2 R N High Low IH : forall A1 A2 C, is_clause C -> is_list is_lit A1 -> is_list is_lit A2 -> unsat_clause A1 C * -> (forall L, mem L A1 -> mem L A2) -> unsat_clause A2 C IsC : is_clause (rangeClause Low High) IsA1 : is_list is_lit A1 IsA2 : is_list is_lit A2 UNSAT : unsat_clause A1 (rangeClause Low High) @ MemA1A2 : forall L, mem L A1 -> mem L A2 UNSAT1 : range Low High R UNSAT2 : negs R N UNSAT3 : subset N A1 H1 : subset N A2 ============================ unsat_clause A2 (rangeClause Low High)
< search. Subgoal 4: Variables: A1 A2 Clause Note IH : forall A1 A2 C, is_clause C -> is_list is_lit A1 -> is_list is_lit A2 -> unsat_clause A1 C * -> (forall L, mem L A1 -> mem L A2) -> unsat_clause A2 C IsC : is_clause (noteClause Note Clause) IsA1 : is_list is_lit A1 IsA2 : is_list is_lit A2 UNSAT : unsat_clause A1 (noteClause Note Clause) @ MemA1A2 : forall L, mem L A1 -> mem L A2 UNSAT1 : unsat_clause A1 Clause * ============================ unsat_clause A2 (noteClause Note Clause)
< Is: case IsC. Subgoal 4: Variables: A1 A2 Clause Note IH : forall A1 A2 C, is_clause C -> is_list is_lit A1 -> is_list is_lit A2 -> unsat_clause A1 C * -> (forall L, mem L A1 -> mem L A2) -> unsat_clause A2 C IsA1 : is_list is_lit A1 IsA2 : is_list is_lit A2 UNSAT : unsat_clause A1 (noteClause Note Clause) @ MemA1A2 : forall L, mem L A1 -> mem L A2 UNSAT1 : unsat_clause A1 Clause * Is : is_string Note Is1 : is_clause Clause ============================ unsat_clause A2 (noteClause Note Clause)
< apply IH to _ _ _ UNSAT1 MemA1A2. Subgoal 4: Variables: A1 A2 Clause Note IH : forall A1 A2 C, is_clause C -> is_list is_lit A1 -> is_list is_lit A2 -> unsat_clause A1 C * -> (forall L, mem L A1 -> mem L A2) -> unsat_clause A2 C IsA1 : is_list is_lit A1 IsA2 : is_list is_lit A2 UNSAT : unsat_clause A1 (noteClause Note Clause) @ MemA1A2 : forall L, mem L A1 -> mem L A2 UNSAT1 : unsat_clause A1 Clause * Is : is_string Note Is1 : is_clause Clause H1 : unsat_clause A2 Clause ============================ unsat_clause A2 (noteClause Note Clause)
< search. Proof completed.
< Prove unsat_proofs:lrat:unit_clause_is. Subgoal 3: Variables: A Range RangeRest N I High Low IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> is_lit L IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A Unit : unit_clause A (rangeClause Low High) (pos I) @ Unit1 : range Low High Range Unit2 : select I RangeRest Range Unit3 : mem (pos I) A -> false Unit4 : mem (neg I) A -> false Unit5 : negs RangeRest N Unit6 : subset N A ============================ is_lit (pos I)
< Is: case IsC. Subgoal 3: Variables: A Range RangeRest N I High Low IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> is_lit L IsA : is_list is_lit A Unit : unit_clause A (rangeClause Low High) (pos I) @ Unit1 : range Low High Range Unit2 : select I RangeRest Range Unit3 : mem (pos I) A -> false Unit4 : mem (neg I) A -> false Unit5 : negs RangeRest N Unit6 : subset N A Is : is_integer Low Is1 : is_integer High ============================ is_lit (pos I)
< IsRange: apply range_is to _ Unit1. Subgoal 3: Variables: A Range RangeRest N I High Low IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> is_lit L IsA : is_list is_lit A Unit : unit_clause A (rangeClause Low High) (pos I) @ Unit1 : range Low High Range Unit2 : select I RangeRest Range Unit3 : mem (pos I) A -> false Unit4 : mem (neg I) A -> false Unit5 : negs RangeRest N Unit6 : subset N A Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range ============================ is_lit (pos I)
< Mem: apply select_mem to Unit2. Subgoal 3: Variables: A Range RangeRest N I High Low IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> is_lit L IsA : is_list is_lit A Unit : unit_clause A (rangeClause Low High) (pos I) @ Unit1 : range Low High Range Unit2 : select I RangeRest Range Unit3 : mem (pos I) A -> false Unit4 : mem (neg I) A -> false Unit5 : negs RangeRest N Unit6 : subset N A Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range Mem : mem I Range ============================ is_lit (pos I)
< apply is_list_int_mem to _ Mem. Subgoal 3: Variables: A Range RangeRest N I High Low IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> is_lit L IsA : is_list is_lit A Unit : unit_clause A (rangeClause Low High) (pos I) @ Unit1 : range Low High Range Unit2 : select I RangeRest Range Unit3 : mem (pos I) A -> false Unit4 : mem (neg I) A -> false Unit5 : negs RangeRest N Unit6 : subset N A Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range Mem : mem I Range H1 : is_integer I ============================ is_lit (pos I)
< search. Subgoal 4: Variables: A L Clause Note IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> is_lit L IsC : is_clause (noteClause Note Clause) IsA : is_list is_lit A Unit : unit_clause A (noteClause Note Clause) L @ Unit1 : unit_clause A Clause L * ============================ is_lit L
< case IsC. Subgoal 4: Variables: A L Clause Note IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> is_lit L IsA : is_list is_lit A Unit : unit_clause A (noteClause Note Clause) L @ Unit1 : unit_clause A Clause L * H1 : is_string Note H2 : is_clause Clause ============================ is_lit L
< apply IH to _ _ Unit1. Subgoal 4: Variables: A L Clause Note IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> is_lit L IsA : is_list is_lit A Unit : unit_clause A (noteClause Note Clause) L @ Unit1 : unit_clause A Clause L * H1 : is_string Note H2 : is_clause Clause H3 : is_lit L ============================ is_lit L
< search. Proof completed.
< Prove unsat_proofs:lrat:unit_clause_unique. Subgoal 3: Variables: A B LB Range RangeRest N I High Low IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ UnitB : unit_clause B (rangeClause Low High) LB Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A ============================ pos I = LB
< UnitB: case UnitB. Subgoal 3: Variables: A B Range RangeRest N I High Low Range1 RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range1 UnitB1 : select I1 RangeRest1 Range1 UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B ============================ pos I = pos I1
< apply range_unique to UnitB UnitA1. Subgoal 3: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B ============================ pos I = pos I1
< Is: case IsC. Subgoal 3: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High ============================ pos I = pos I1
< IsRange: apply range_is to _ UnitB. Subgoal 3: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range ============================ pos I = pos I1
< MA: apply select_mem to UnitA2. Subgoal 3: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range ============================ pos I = pos I1
< MB: apply select_mem to UnitB1. Subgoal 3: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I1 Range ============================ pos I = pos I1
< IsI: apply is_list_int_mem to _ MA. Subgoal 3: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I1 Range IsI : is_integer I ============================ pos I = pos I1
< IsI1: apply is_list_int_mem to _ MB. Subgoal 3: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I1 Range IsI : is_integer I IsI1 : is_integer I1 ============================ pos I = pos I1
< Or: apply is_integer_eq_or_not to IsI1 IsI. Subgoal 3: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I1 Range IsI : is_integer I IsI1 : is_integer I1 Or : I1 = I \/ (I1 = I -> false) ============================ pos I = pos I1
< E: case Or. Subgoal 3.1: Variables: A B Range RangeRest N I High Low RangeRest1 N1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I RangeRest1 Range UnitB2 : mem (pos I) B -> false UnitB3 : mem (neg I) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I Range IsI : is_integer I IsI1 : is_integer I ============================ pos I = pos I
< search. Subgoal 3.2: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I1 Range IsI : is_integer I IsI1 : is_integer I1 E : I1 = I -> false ============================ pos I = pos I1
< M: apply mem_before_select_after to UnitB1 _ E. Subgoal 3.2: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I1 Range IsI : is_integer I IsI1 : is_integer I1 E : I1 = I -> false M : mem I RangeRest1 ============================ pos I = pos I1
< MN: apply negs_mem to M UnitB4. Subgoal 3.2: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I1 Range IsI : is_integer I IsI1 : is_integer I1 E : I1 = I -> false M : mem I RangeRest1 MN : mem (neg I) N1 ============================ pos I = pos I1
< MB: apply subset_mem to UnitB5 MN. Subgoal 3.2: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I1 Range IsI : is_integer I IsI1 : is_integer I1 E : I1 = I -> false M : mem I RangeRest1 MN : mem (neg I) N1 MB1 : mem (neg I) B ============================ pos I = pos I1
< Prm': apply permutation_symmetric to Prm. Subgoal 3.2: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I1 Range IsI : is_integer I IsI1 : is_integer I1 E : I1 = I -> false M : mem I RangeRest1 MN : mem (neg I) N1 MB1 : mem (neg I) B Prm' : permutation B A ============================ pos I = pos I1
< MA: apply permutation_mem to Prm' MB1. Subgoal 3.2: Variables: A B Range RangeRest N I High Low RangeRest1 N1 I1 IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (rangeClause Low High) (pos I) @ Prm : permutation A B UnitA1 : range Low High Range UnitA2 : select I RangeRest Range UnitA3 : mem (pos I) A -> false UnitA4 : mem (neg I) A -> false UnitA5 : negs RangeRest N UnitA6 : subset N A UnitB : range Low High Range UnitB1 : select I1 RangeRest1 Range UnitB2 : mem (pos I1) B -> false UnitB3 : mem (neg I1) B -> false UnitB4 : negs RangeRest1 N1 UnitB5 : subset N1 B Is : is_integer Low Is1 : is_integer High IsRange : is_list is_integer Range MA : mem I Range MB : mem I1 Range IsI : is_integer I IsI1 : is_integer I1 E : I1 = I -> false M : mem I RangeRest1 MN : mem (neg I) N1 MB1 : mem (neg I) B Prm' : permutation B A MA1 : mem (neg I) A ============================ pos I = pos I1
< apply UnitA4 to _. Subgoal 4: Variables: A B LA LB Clause Note IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsC : is_clause (noteClause Note Clause) IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (noteClause Note Clause) LA @ UnitB : unit_clause B (noteClause Note Clause) LB Prm : permutation A B UnitA1 : unit_clause A Clause LA * ============================ LA = LB
< UnitB: case UnitB. Subgoal 4: Variables: A B LA LB Clause Note IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsC : is_clause (noteClause Note Clause) IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (noteClause Note Clause) LA @ Prm : permutation A B UnitA1 : unit_clause A Clause LA * UnitB : unit_clause B Clause LB ============================ LA = LB
< Is: case IsC. Subgoal 4: Variables: A B LA LB Clause Note IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (noteClause Note Clause) LA @ Prm : permutation A B UnitA1 : unit_clause A Clause LA * UnitB : unit_clause B Clause LB Is : is_string Note Is1 : is_clause Clause ============================ LA = LB
< apply IH to _ _ _ UnitA1 _ _. Subgoal 4: Variables: A B LB Clause Note IH : forall A B C LA LB, is_clause C -> is_list is_lit A -> is_list is_lit B -> unit_clause A C LA * -> unit_clause B C LB -> permutation A B -> LA = LB IsA : is_list is_lit A IsB : is_list is_lit B UnitA : unit_clause A (noteClause Note Clause) LB @ Prm : permutation A B UnitA1 : unit_clause A Clause LB * UnitB : unit_clause B Clause LB Is : is_string Note Is1 : is_clause Clause ============================ LB = LB
< search. Proof completed.
< Prove unsat_proofs:lrat:unit_clause_not_assigned. Subgoal 3: Variables: A Range RangeRest N I High Low IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> mem L A -> false IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A UC : unit_clause A (rangeClause Low High) (pos I) @ Mem : mem (pos I) A UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A ============================ false
< backchain UC3. Subgoal 4: Variables: A L Clause Note IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> mem L A -> false IsC : is_clause (noteClause Note Clause) IsA : is_list is_lit A UC : unit_clause A (noteClause Note Clause) L @ Mem : mem L A UC1 : unit_clause A Clause L * ============================ false
< Is: case IsC. Subgoal 4: Variables: A L Clause Note IH : forall A C L, is_clause C -> is_list is_lit A -> unit_clause A C L * -> mem L A -> false IsA : is_list is_lit A UC : unit_clause A (noteClause Note Clause) L @ Mem : mem L A UC1 : unit_clause A Clause L * Is : is_string Note Is1 : is_clause Clause ============================ false
< apply IH to _ _ UC1 _. Proof completed.
< Prove unsat_proofs:lrat:unit_clause_not_assigned_negate. Subgoal 3: Variables: A NL Range RangeRest N I High Low IH : forall A C L NL, is_clause C -> is_list is_lit A -> unit_clause A C L * -> negate_lit L NL -> mem NL A -> false IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A UC : unit_clause A (rangeClause Low High) (pos I) @ Neg : negate_lit (pos I) NL Mem : mem NL A UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A ============================ false
< case Neg. Subgoal 3: Variables: A Range RangeRest N I High Low IH : forall A C L NL, is_clause C -> is_list is_lit A -> unit_clause A C L * -> negate_lit L NL -> mem NL A -> false IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A UC : unit_clause A (rangeClause Low High) (pos I) @ Mem : mem (neg I) A UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A ============================ false
< backchain UC4. Subgoal 4: Variables: A L NL Clause Note IH : forall A C L NL, is_clause C -> is_list is_lit A -> unit_clause A C L * -> negate_lit L NL -> mem NL A -> false IsC : is_clause (noteClause Note Clause) IsA : is_list is_lit A UC : unit_clause A (noteClause Note Clause) L @ Neg : negate_lit L NL Mem : mem NL A UC1 : unit_clause A Clause L * ============================ false
< case IsC. Subgoal 4: Variables: A L NL Clause Note IH : forall A C L NL, is_clause C -> is_list is_lit A -> unit_clause A C L * -> negate_lit L NL -> mem NL A -> false IsA : is_list is_lit A UC : unit_clause A (noteClause Note Clause) L @ Neg : negate_lit L NL Mem : mem NL A UC1 : unit_clause A Clause L * H1 : is_string Note H2 : is_clause Clause ============================ false
< apply IH to _ _ UC1 _ _. Proof completed.
< Prove unsat_proofs:lrat:unit_clause_expand. Subgoal 3: Variables: A E Range RangeRest N I High Low IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ SAT : sat_clause E (rangeClause Low High) GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A ============================ mem (pos I) E
< Is: case IsC. Subgoal 3: Variables: A E Range RangeRest N I High Low IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ SAT : sat_clause E (rangeClause Low High) GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High ============================ mem (pos I) E
< SAT: case SAT. Subgoal 3: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E ============================ mem (pos I) E
< IsPX: apply mem_is_lit to _ SAT2. Subgoal 3: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsPX : is_lit (pos X) ============================ mem (pos I) E
< IsX: case IsPX. Subgoal 3: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X ============================ mem (pos I) E
< MXR: apply in_range to _ _ UC1 SAT SAT1. Subgoal 3: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range ============================ mem (pos I) E
< M: apply select_mem to UC2. Subgoal 3: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem I Range ============================ mem (pos I) E
< apply range_is to _ UC1. Subgoal 3: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem I Range H1 : is_list is_integer Range ============================ mem (pos I) E
< IsI: apply is_list_int_mem to _ M. Subgoal 3: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem I Range H1 : is_list is_integer Range IsI : is_integer I ============================ mem (pos I) E
< Or: apply is_integer_eq_or_not to IsI IsX. Subgoal 3: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem I Range H1 : is_list is_integer Range IsI : is_integer I Or : I = X \/ (I = X -> false) ============================ mem (pos I) E
< E: case Or. Subgoal 3.1: Variables: A E Range RangeRest N High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos X) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select X RangeRest Range UC3 : mem (pos X) A -> false UC4 : mem (neg X) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem X Range H1 : is_list is_integer Range IsI : is_integer X ============================ mem (pos X) E
< search. Subgoal 3.2: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem I Range H1 : is_list is_integer Range IsI : is_integer I E : I = X -> false ============================ mem (pos I) E
< MXRR: apply mem_before_select_after to UC2 MXR _. Subgoal 3.2: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem I Range H1 : is_list is_integer Range IsI : is_integer I E : I = X -> false MXRR : mem X RangeRest ============================ mem (pos I) E
< MXN: apply negs_mem to MXRR UC5. Subgoal 3.2: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem I Range H1 : is_list is_integer Range IsI : is_integer I E : I = X -> false MXRR : mem X RangeRest MXN : mem (neg X) N ============================ mem (pos I) E
< MXA: apply subset_mem to UC6 MXN. Subgoal 3.2: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem I Range H1 : is_list is_integer Range IsI : is_integer I E : I = X -> false MXRR : mem X RangeRest MXN : mem (neg X) N MXA : mem (neg X) A ============================ mem (pos I) E
< MXE: apply Expand to MXA. Subgoal 3.2: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem I Range H1 : is_list is_integer Range IsI : is_integer I E : I = X -> false MXRR : mem X RangeRest MXN : mem (neg X) N MXA : mem (neg X) A MXE : mem (neg X) E ============================ mem (pos I) E
< GA_E: case GA_E. Subgoal 3.2: Variables: A E Range RangeRest N I High Low X IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (rangeClause Low High) (pos I) @ GA_A : good_assignment A Expand : forall L, mem L A -> mem L E UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High SAT : Low <= X SAT1 : X <= High SAT2 : mem (pos X) E IsX : is_integer X MXR : mem X Range M : mem I Range H1 : is_list is_integer Range IsI : is_integer I E : I = X -> false MXRR : mem X RangeRest MXN : mem (neg X) N MXA : mem (neg X) A MXE : mem (neg X) E GA_E : forall L NL, mem L E -> negate_lit L NL -> mem NL E -> false ============================ mem (pos I) E
< apply GA_E to MXE _ SAT2. Subgoal 4: Variables: A L E Clause Note IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsC : is_clause (noteClause Note Clause) IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (noteClause Note Clause) L @ SAT : sat_clause E (noteClause Note Clause) GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : unit_clause A Clause L * ============================ mem L E
< SAT: case SAT. Subgoal 4: Variables: A L E Clause Note IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsC : is_clause (noteClause Note Clause) IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (noteClause Note Clause) L @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : unit_clause A Clause L * SAT : sat_clause E Clause ============================ mem L E
< case IsC. Subgoal 4: Variables: A L E Clause Note IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (noteClause Note Clause) L @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : unit_clause A Clause L * SAT : sat_clause E Clause H1 : is_string Note H2 : is_clause Clause ============================ mem L E
< apply IH to _ _ _ UC1 SAT _ _ _. Subgoal 4: Variables: A L E Clause Note IH : forall A C L E, is_clause C -> is_list is_lit A -> is_list is_lit E -> unit_clause A C L * -> sat_clause E C -> good_assignment A -> good_assignment E -> (forall L1, mem L1 A -> mem L1 E) -> mem L E IsA : is_list is_lit A IsE : is_list is_lit E UC : unit_clause A (noteClause Note Clause) L @ GA_A : good_assignment A GA_E : good_assignment E Expand : forall L, mem L A -> mem L E UC1 : unit_clause A Clause L * SAT : sat_clause E Clause H1 : is_string Note H2 : is_clause Clause H3 : mem L E ============================ mem L E
< search. Proof completed.
< Prove unsat_proofs:lrat:unit_clause_add. Subgoal 3: Variables: A S Range RangeRest N I High Low IH : forall A S C L, is_clause C -> is_list is_lit A -> is_list is_lit S -> unit_clause A C L * -> mem L S -> sat_clause S C IsC : is_clause (rangeClause Low High) IsA : is_list is_lit A IsS : is_list is_lit S UC : unit_clause A (rangeClause Low High) (pos I) @ Mem : mem (pos I) S UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A ============================ sat_clause S (rangeClause Low High)
< Is: case IsC. Subgoal 3: Variables: A S Range RangeRest N I High Low IH : forall A S C L, is_clause C -> is_list is_lit A -> is_list is_lit S -> unit_clause A C L * -> mem L S -> sat_clause S C IsA : is_list is_lit A IsS : is_list is_lit S UC : unit_clause A (rangeClause Low High) (pos I) @ Mem : mem (pos I) S UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High ============================ sat_clause S (rangeClause Low High)
< M: apply select_mem to UC2. Subgoal 3: Variables: A S Range RangeRest N I High Low IH : forall A S C L, is_clause C -> is_list is_lit A -> is_list is_lit S -> unit_clause A C L * -> mem L S -> sat_clause S C IsA : is_list is_lit A IsS : is_list is_lit S UC : unit_clause A (rangeClause Low High) (pos I) @ Mem : mem (pos I) S UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High M : mem I Range ============================ sat_clause S (rangeClause Low High)
< Low: apply range_low_lesseq to _ UC1 _. Subgoal 3: Variables: A S Range RangeRest N I High Low IH : forall A S C L, is_clause C -> is_list is_lit A -> is_list is_lit S -> unit_clause A C L * -> mem L S -> sat_clause S C IsA : is_list is_lit A IsS : is_list is_lit S UC : unit_clause A (rangeClause Low High) (pos I) @ Mem : mem (pos I) S UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High M : mem I Range Low : Low <= I ============================ sat_clause S (rangeClause Low High)
< High: apply range_high_lesseq to _ UC1 _. Subgoal 3: Variables: A S Range RangeRest N I High Low IH : forall A S C L, is_clause C -> is_list is_lit A -> is_list is_lit S -> unit_clause A C L * -> mem L S -> sat_clause S C IsA : is_list is_lit A IsS : is_list is_lit S UC : unit_clause A (rangeClause Low High) (pos I) @ Mem : mem (pos I) S UC1 : range Low High Range UC2 : select I RangeRest Range UC3 : mem (pos I) A -> false UC4 : mem (neg I) A -> false UC5 : negs RangeRest N UC6 : subset N A Is : is_integer Low Is1 : is_integer High M : mem I Range Low : Low <= I High : I <= High ============================ sat_clause S (rangeClause Low High)
< search. Subgoal 4: Variables: A S L Clause Note IH : forall A S C L, is_clause C -> is_list is_lit A -> is_list is_lit S -> unit_clause A C L * -> mem L S -> sat_clause S C IsC : is_clause (noteClause Note Clause) IsA : is_list is_lit A IsS : is_list is_lit S UC : unit_clause A (noteClause Note Clause) L @ Mem : mem L S UC1 : unit_clause A Clause L * ============================ sat_clause S (noteClause Note Clause)
< case IsC. Subgoal 4: Variables: A S L Clause Note IH : forall A S C L, is_clause C -> is_list is_lit A -> is_list is_lit S -> unit_clause A C L * -> mem L S -> sat_clause S C IsA : is_list is_lit A IsS : is_list is_lit S UC : unit_clause A (noteClause Note Clause) L @ Mem : mem L S UC1 : unit_clause A Clause L * H1 : is_string Note H2 : is_clause Clause ============================ sat_clause S (noteClause Note Clause)
< apply IH to _ _ _ UC1 _. Subgoal 4: Variables: A S L Clause Note IH : forall A S C L, is_clause C -> is_list is_lit A -> is_list is_lit S -> unit_clause A C L * -> mem L S -> sat_clause S C IsA : is_list is_lit A IsS : is_list is_lit S UC : unit_clause A (noteClause Note Clause) L @ Mem : mem L S UC1 : unit_clause A Clause L * H1 : is_string Note H2 : is_clause Clause H3 : sat_clause S Clause ============================ sat_clause S (noteClause Note Clause)
< search. Proof completed.
< Theorem posLits_total : forall L, is_list is_integer L -> exists P, posLits L P. ============================ forall L, is_list is_integer L -> exists P, posLits L P
< induction on 1. IH : forall L, is_list is_integer L * -> exists P, posLits L P ============================ forall L, is_list is_integer L @ -> exists P, posLits L P
< intros Is. Variables: L IH : forall L, is_list is_integer L * -> exists P, posLits L P Is : is_list is_integer L @ ============================ exists P, posLits L P
< Is: case Is. Subgoal 1: IH : forall L, is_list is_integer L * -> exists P, posLits L P ============================ exists P, posLits [] P
< search. Subgoal 2: Variables: T H IH : forall L, is_list is_integer L * -> exists P, posLits L P Is : is_integer H Is1 : is_list is_integer T * ============================ exists P, posLits (H::T) P
< apply IH to Is1. Subgoal 2: Variables: T H P IH : forall L, is_list is_integer L * -> exists P, posLits L P Is : is_integer H Is1 : is_list is_integer T * H1 : posLits T P ============================ exists P, posLits (H::T) P
< search. Proof completed.
< Theorem posLits_unique : forall L P1 P2, posLits L P1 -> posLits L P2 -> P1 = P2. ============================ forall L P1 P2, posLits L P1 -> posLits L P2 -> P1 = P2
< induction on 1. IH : forall L P1 P2, posLits L P1 * -> posLits L P2 -> P1 = P2 ============================ forall L P1 P2, posLits L P1 @ -> posLits L P2 -> P1 = P2
< intros PL1 PL2. Variables: L P1 P2 IH : forall L P1 P2, posLits L P1 * -> posLits L P2 -> P1 = P2 PL1 : posLits L P1 @ PL2 : posLits L P2 ============================ P1 = P2
< PL1: case PL1. Subgoal 1: Variables: P2 IH : forall L P1 P2, posLits L P1 * -> posLits L P2 -> P1 = P2 PL2 : posLits [] P2 ============================ [] = P2
< case PL2. Subgoal 1: IH : forall L P1 P2, posLits L P1 * -> posLits L P2 -> P1 = P2 ============================ [] = []
< search. Subgoal 2: Variables: P2 LRest I Rest IH : forall L P1 P2, posLits L P1 * -> posLits L P2 -> P1 = P2 PL2 : posLits (I::Rest) P2 PL1 : posLits Rest LRest * ============================ (pos I)::LRest = P2
< PL2: case PL2. Subgoal 2: Variables: LRest I Rest LRest1 IH : forall L P1 P2, posLits L P1 * -> posLits L P2 -> P1 = P2 PL1 : posLits Rest LRest * PL2 : posLits Rest LRest1 ============================ (pos I)::LRest = (pos I)::LRest1
< apply IH to PL1 PL2. Subgoal 2: Variables: I Rest LRest1 IH : forall L P1 P2, posLits L P1 * -> posLits L P2 -> P1 = P2 PL1 : posLits Rest LRest1 * PL2 : posLits Rest LRest1 ============================ (pos I)::LRest1 = (pos I)::LRest1
< search. Proof completed.
< Theorem posLits_is : forall L P, is_list is_integer L -> posLits L P -> is_list is_lit P. ============================ forall L P, is_list is_integer L -> posLits L P -> is_list is_lit P
< induction on 2. IH : forall L P, is_list is_integer L -> posLits L P * -> is_list is_lit P ============================ forall L P, is_list is_integer L -> posLits L P @ -> is_list is_lit P
< intros IsL PL. Variables: L P IH : forall L P, is_list is_integer L -> posLits L P * -> is_list is_lit P IsL : is_list is_integer L PL : posLits L P @ ============================ is_list is_lit P
< PL: case PL. Subgoal 1: IH : forall L P, is_list is_integer L -> posLits L P * -> is_list is_lit P IsL : is_list is_integer [] ============================ is_list is_lit []
< search. Subgoal 2: Variables: LRest I Rest IH : forall L P, is_list is_integer L -> posLits L P * -> is_list is_lit P IsL : is_list is_integer (I::Rest) PL : posLits Rest LRest * ============================ is_list is_lit ((pos I)::LRest)
< Is: case IsL. Subgoal 2: Variables: LRest I Rest IH : forall L P, is_list is_integer L -> posLits L P * -> is_list is_lit P PL : posLits Rest LRest * Is : is_integer I Is1 : is_list is_integer Rest ============================ is_list is_lit ((pos I)::LRest)
< apply IH to _ PL. Subgoal 2: Variables: LRest I Rest IH : forall L P, is_list is_integer L -> posLits L P * -> is_list is_lit P PL : posLits Rest LRest * Is : is_integer I Is1 : is_list is_integer Rest H1 : is_list is_lit LRest ============================ is_list is_lit ((pos I)::LRest)
< search. Proof completed.
< Theorem posLits_mem : forall L P X, mem X L -> posLits L P -> mem (pos X) P. ============================ forall L P X, mem X L -> posLits L P -> mem (pos X) P
< induction on 1. IH : forall L P X, mem X L * -> posLits L P -> mem (pos X) P ============================ forall L P X, mem X L @ -> posLits L P -> mem (pos X) P
< intros Mem PL. Variables: L P X IH : forall L P X, mem X L * -> posLits L P -> mem (pos X) P Mem : mem X L @ PL : posLits L P ============================ mem (pos X) P
< Mem: case Mem. Subgoal 1: Variables: P X Rest IH : forall L P X, mem X L * -> posLits L P -> mem (pos X) P PL : posLits (X::Rest) P ============================ mem (pos X) P
< case PL. Subgoal 1: Variables: X Rest LRest IH : forall L P X, mem X L * -> posLits L P -> mem (pos X) P H1 : posLits Rest LRest ============================ mem (pos X) ((pos X)::LRest)
< search. Subgoal 2: Variables: P X Rest I IH : forall L P X, mem X L * -> posLits L P -> mem (pos X) P PL : posLits (I::Rest) P Mem : mem X Rest * ============================ mem (pos X) P
< case PL. Subgoal 2: Variables: X Rest I LRest IH : forall L P X, mem X L * -> posLits L P -> mem (pos X) P Mem : mem X Rest * H1 : posLits Rest LRest ============================ mem (pos X) ((pos I)::LRest)
< apply IH to Mem _. Subgoal 2: Variables: X Rest I LRest IH : forall L P X, mem X L * -> posLits L P -> mem (pos X) P Mem : mem X Rest * H1 : posLits Rest LRest H2 : mem (pos X) LRest ============================ mem (pos X) ((pos I)::LRest)
< search. Proof completed.
< Theorem posLits_form : forall L P X, posLits L P -> mem X P -> exists I, X = pos I. ============================ forall L P X, posLits L P -> mem X P -> exists I, X = pos I
< induction on 2. IH : forall L P X, posLits L P -> mem X P * -> exists I, X = pos I ============================ forall L P X, posLits L P -> mem X P @ -> exists I, X = pos I
< intros PL Mem. Variables: L P X IH : forall L P X, posLits L P -> mem X P * -> exists I, X = pos I PL : posLits L P Mem : mem X P @ ============================ exists I, X = pos I
< Mem: case Mem. Subgoal 1: Variables: L X Rest IH : forall L P X, posLits L P -> mem X P * -> exists I, X = pos I PL : posLits L (X::Rest) ============================ exists I, X = pos I
< case PL. Subgoal 1: Variables: Rest I Rest1 IH : forall L P X, posLits L P -> mem X P * -> exists I, X = pos I H1 : posLits Rest1 Rest ============================ exists I1, pos I = pos I1
< search. Subgoal 2: Variables: L X Rest I IH : forall L P X, posLits L P -> mem X P * -> exists I, X = pos I PL : posLits L (I::Rest) Mem : mem X Rest * ============================ exists I, X = pos I
< case PL. Subgoal 2: Variables: X Rest I1 Rest1 IH : forall L P X, posLits L P -> mem X P * -> exists I, X = pos I Mem : mem X Rest * H1 : posLits Rest1 Rest ============================ exists I, X = pos I
< apply IH to _ Mem. Subgoal 2: Variables: Rest I1 Rest1 I2 IH : forall L P X, posLits L P -> mem X P * -> exists I, X = pos I Mem : mem (pos I2) Rest * H1 : posLits Rest1 Rest ============================ exists I, pos I2 = pos I
< search. Proof completed.
< Theorem mem_after_posLits_before : forall L P I, posLits L P -> mem (pos I) P -> mem I L. ============================ forall L P I, posLits L P -> mem (pos I) P -> mem I L
< induction on 2. IH : forall L P I, posLits L P -> mem (pos I) P * -> mem I L ============================ forall L P I, posLits L P -> mem (pos I) P @ -> mem I L
< intros PL Mem. Variables: L P I IH : forall L P I, posLits L P -> mem (pos I) P * -> mem I L PL : posLits L P Mem : mem (pos I) P @ ============================ mem I L
< Mem: case Mem. Subgoal 1: Variables: L I Rest IH : forall L P I, posLits L P -> mem (pos I) P * -> mem I L PL : posLits L ((pos I)::Rest) ============================ mem I L
< case PL. Subgoal 1: Variables: I Rest Rest1 IH : forall L P I, posLits L P -> mem (pos I) P * -> mem I L H1 : posLits Rest1 Rest ============================ mem I (I::Rest1)
< search. Subgoal 2: Variables: L I Rest I1 IH : forall L P I, posLits L P -> mem (pos I) P * -> mem I L PL : posLits L (I1::Rest) Mem : mem (pos I) Rest * ============================ mem I L
< PL: case PL. Subgoal 2: Variables: I Rest I2 Rest1 IH : forall L P I, posLits L P -> mem (pos I) P * -> mem I L Mem : mem (pos I) Rest * PL : posLits Rest1 Rest ============================ mem I (I2::Rest1)
< apply IH to _ Mem. Subgoal 2: Variables: I Rest I2 Rest1 IH : forall L P I, posLits L P -> mem (pos I) P * -> mem I L Mem : mem (pos I) Rest * PL : posLits Rest1 Rest H1 : mem I Rest1 ============================ mem I (I2::Rest1)
< search. Proof completed.
< Prove unsat_proofs:lrat:gatherLits_is. Subgoal 3: Variables: L R High Low IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L IsC : is_clause (rangeClause Low High) GL : gatherLits (rangeClause Low High) L @ GL1 : range Low High R GL2 : posLits R L ============================ is_list is_lit L
< Is: case IsC. Subgoal 3: Variables: L R High Low IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L GL : gatherLits (rangeClause Low High) L @ GL1 : range Low High R GL2 : posLits R L Is : is_integer Low Is1 : is_integer High ============================ is_list is_lit L
< apply range_is to _ GL1. Subgoal 3: Variables: L R High Low IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L GL : gatherLits (rangeClause Low High) L @ GL1 : range Low High R GL2 : posLits R L Is : is_integer Low Is1 : is_integer High H1 : is_list is_integer R ============================ is_list is_lit L
< apply posLits_is to _ GL2. Subgoal 3: Variables: L R High Low IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L GL : gatherLits (rangeClause Low High) L @ GL1 : range Low High R GL2 : posLits R L Is : is_integer Low Is1 : is_integer High H1 : is_list is_integer R H2 : is_list is_lit L ============================ is_list is_lit L
< search. Subgoal 4: Variables: L Clause Note IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L IsC : is_clause (noteClause Note Clause) GL : gatherLits (noteClause Note Clause) L @ GL1 : gatherLits Clause L * ============================ is_list is_lit L
< case IsC. Subgoal 4: Variables: L Clause Note IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L GL : gatherLits (noteClause Note Clause) L @ GL1 : gatherLits Clause L * H1 : is_string Note H2 : is_clause Clause ============================ is_list is_lit L
< apply IH to _ GL1. Subgoal 4: Variables: L Clause Note IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L GL : gatherLits (noteClause Note Clause) L @ GL1 : gatherLits Clause L * H1 : is_string Note H2 : is_clause Clause H3 : is_list is_lit L ============================ is_list is_lit L
< search. Proof completed.
< Prove unsat_proofs:lrat:gatherLits_exists. Subgoal 3: Variables: I I1 IH : forall C, is_clause C * -> exists L, gatherLits C L IsC : is_clause (rangeClause I1 I) @ IsC1 : is_integer I1 IsC2 : is_integer I ============================ exists L, gatherLits (rangeClause I1 I) L
< R: apply range_exists to IsC1 IsC2. Subgoal 3: Variables: I I1 R IH : forall C, is_clause C * -> exists L, gatherLits C L IsC : is_clause (rangeClause I1 I) @ IsC1 : is_integer I1 IsC2 : is_integer I R : range I1 I R ============================ exists L, gatherLits (rangeClause I1 I) L
< IsR: apply range_is to _ R. Subgoal 3: Variables: I I1 R IH : forall C, is_clause C * -> exists L, gatherLits C L IsC : is_clause (rangeClause I1 I) @ IsC1 : is_integer I1 IsC2 : is_integer I R : range I1 I R IsR : is_list is_integer R ============================ exists L, gatherLits (rangeClause I1 I) L
< apply posLits_total to IsR. Subgoal 3: Variables: I I1 R P IH : forall C, is_clause C * -> exists L, gatherLits C L IsC : is_clause (rangeClause I1 I) @ IsC1 : is_integer I1 IsC2 : is_integer I R : range I1 I R IsR : is_list is_integer R H1 : posLits R P ============================ exists L, gatherLits (rangeClause I1 I) L
< search. Subgoal 4: Variables: Clause S IH : forall C, is_clause C * -> exists L, gatherLits C L IsC : is_clause (noteClause S Clause) @ IsC1 : is_string S IsC2 : is_clause Clause * ============================ exists L, gatherLits (noteClause S Clause) L
< apply IH to IsC2. Subgoal 4: Variables: Clause S L IH : forall C, is_clause C * -> exists L, gatherLits C L IsC : is_clause (noteClause S Clause) @ IsC1 : is_string S IsC2 : is_clause Clause * H1 : gatherLits Clause L ============================ exists L, gatherLits (noteClause S Clause) L
< search. Proof completed.
< Theorem permutation_reflexive_lits : forall L, is_list is_lit L -> permutation L L. ============================ forall L, is_list is_lit L -> permutation L L
< induction on 1. IH : forall L, is_list is_lit L * -> permutation L L ============================ forall L, is_list is_lit L @ -> permutation L L
< intros Is. Variables: L IH : forall L, is_list is_lit L * -> permutation L L Is : is_list is_lit L @ ============================ permutation L L
< Is: case Is. Subgoal 1: IH : forall L, is_list is_lit L * -> permutation L L ============================ permutation [] []
< search. Subgoal 2: Variables: T H IH : forall L, is_list is_lit L * -> permutation L L Is : is_lit H Is1 : is_list is_lit T * ============================ permutation (H::T) (H::T)
< apply IH to Is1. Subgoal 2: Variables: T H IH : forall L, is_list is_lit L * -> permutation L L Is : is_lit H Is1 : is_list is_lit T * H1 : permutation T T ============================ permutation (H::T) (H::T)
< search. Proof completed.
< Prove unsat_proofs:lrat:gatherLits_permutation. Subgoal 3: Variables: L1 L2 R High Low IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 IsC : is_clause (rangeClause Low High) GL1 : gatherLits (rangeClause Low High) L1 @ GL2 : gatherLits (rangeClause Low High) L2 GL3 : range Low High R GL4 : posLits R L1 ============================ permutation L1 L2
< GL': case GL2. Subgoal 3: Variables: L1 L2 R High Low R1 IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 IsC : is_clause (rangeClause Low High) GL1 : gatherLits (rangeClause Low High) L1 @ GL3 : range Low High R GL4 : posLits R L1 GL' : range Low High R1 GL'1 : posLits R1 L2 ============================ permutation L1 L2
< apply range_unique to GL' GL3. Subgoal 3: Variables: L1 L2 R High Low IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 IsC : is_clause (rangeClause Low High) GL1 : gatherLits (rangeClause Low High) L1 @ GL3 : range Low High R GL4 : posLits R L1 GL' : range Low High R GL'1 : posLits R L2 ============================ permutation L1 L2
< apply posLits_unique to GL4 GL'1. Subgoal 3: Variables: L2 R High Low IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 IsC : is_clause (rangeClause Low High) GL1 : gatherLits (rangeClause Low High) L2 @ GL3 : range Low High R GL4 : posLits R L2 GL' : range Low High R GL'1 : posLits R L2 ============================ permutation L2 L2
< case IsC. Subgoal 3: Variables: L2 R High Low IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 GL1 : gatherLits (rangeClause Low High) L2 @ GL3 : range Low High R GL4 : posLits R L2 GL' : range Low High R GL'1 : posLits R L2 H1 : is_integer Low H2 : is_integer High ============================ permutation L2 L2
< IsR: apply range_is to _ GL3. Subgoal 3: Variables: L2 R High Low IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 GL1 : gatherLits (rangeClause Low High) L2 @ GL3 : range Low High R GL4 : posLits R L2 GL' : range Low High R GL'1 : posLits R L2 H1 : is_integer Low H2 : is_integer High IsR : is_list is_integer R ============================ permutation L2 L2
< apply posLits_is to _ GL4. Subgoal 3: Variables: L2 R High Low IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 GL1 : gatherLits (rangeClause Low High) L2 @ GL3 : range Low High R GL4 : posLits R L2 GL' : range Low High R GL'1 : posLits R L2 H1 : is_integer Low H2 : is_integer High IsR : is_list is_integer R H3 : is_list is_lit L2 ============================ permutation L2 L2
< backchain permutation_reflexive_lits. Subgoal 4: Variables: L1 L2 Clause Note IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 IsC : is_clause (noteClause Note Clause) GL1 : gatherLits (noteClause Note Clause) L1 @ GL2 : gatherLits (noteClause Note Clause) L2 GL3 : gatherLits Clause L1 * ============================ permutation L1 L2
< GL': case GL2. Subgoal 4: Variables: L1 L2 Clause Note IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 IsC : is_clause (noteClause Note Clause) GL1 : gatherLits (noteClause Note Clause) L1 @ GL3 : gatherLits Clause L1 * GL' : gatherLits Clause L2 ============================ permutation L1 L2
< case IsC. Subgoal 4: Variables: L1 L2 Clause Note IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 GL1 : gatherLits (noteClause Note Clause) L1 @ GL3 : gatherLits Clause L1 * GL' : gatherLits Clause L2 H1 : is_string Note H2 : is_clause Clause ============================ permutation L1 L2
< apply IH to _ GL3 GL'. Subgoal 4: Variables: L1 L2 Clause Note IH : forall C L1 L2, is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2 GL1 : gatherLits (noteClause Note Clause) L1 @ GL3 : gatherLits Clause L1 * GL' : gatherLits Clause L2 H1 : is_string Note H2 : is_clause Clause H3 : permutation L1 L2 ============================ permutation L1 L2
< search. Proof completed.
< Prove_Constraint unsat_proofs:lrat:proj_gatherLits. Subgoal 1: Variables: L High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp2 : gatherLits (rangeClause Low High) L Hyp3 : Low <= High Hyp4 : 1 + Low = PlusOne ============================ exists L', gatherLits (or (pos Low) (rangeClause PlusOne High)) L'
< GL: case Hyp2. Subgoal 1: Variables: L High PlusOne Low R Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp3 : Low <= High Hyp4 : 1 + Low = PlusOne GL : range Low High R GL1 : posLits R L ============================ exists L', gatherLits (or (pos Low) (rangeClause PlusOne High)) L'
< Is: case Hyp1. Subgoal 1: Variables: L High PlusOne Low R Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp3 : Low <= High Hyp4 : 1 + Low = PlusOne GL : range Low High R GL1 : posLits R L Is : is_integer Low Is1 : is_integer High ============================ exists L', gatherLits (or (pos Low) (rangeClause PlusOne High)) L'
< L: apply lt_plus_one to Hyp4 _. Subgoal 1: Variables: L High PlusOne Low R Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp3 : Low <= High Hyp4 : 1 + Low = PlusOne GL : range Low High R GL1 : posLits R L Is : is_integer Low Is1 : is_integer High L : Low < PlusOne ============================ exists L', gatherLits (or (pos Low) (rangeClause PlusOne High)) L'
< IsPlusOne: apply plus_integer_is_integer to _ _ Hyp4. Subgoal 1: Variables: L High PlusOne Low R Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp3 : Low <= High Hyp4 : 1 + Low = PlusOne GL : range Low High R GL1 : posLits R L Is : is_integer Low Is1 : is_integer High L : Low < PlusOne IsPlusOne : is_integer PlusOne ============================ exists L', gatherLits (or (pos Low) (rangeClause PlusOne High)) L'
< R: apply range_smaller_exists to _ _ GL L. Subgoal 1: Variables: L High PlusOne Low R R' Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp3 : Low <= High Hyp4 : 1 + Low = PlusOne GL : range Low High R GL1 : posLits R L Is : is_integer Low Is1 : is_integer High L : Low < PlusOne IsPlusOne : is_integer PlusOne R : range PlusOne High R' ============================ exists L', gatherLits (or (pos Low) (rangeClause PlusOne High)) L'
< IsR': apply range_is to _ R. Subgoal 1: Variables: L High PlusOne Low R R' Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp3 : Low <= High Hyp4 : 1 + Low = PlusOne GL : range Low High R GL1 : posLits R L Is : is_integer Low Is1 : is_integer High L : Low < PlusOne IsPlusOne : is_integer PlusOne R : range PlusOne High R' IsR' : is_list is_integer R' ============================ exists L', gatherLits (or (pos Low) (rangeClause PlusOne High)) L'
< apply posLits_total to IsR'. Subgoal 1: Variables: L High PlusOne Low R R' P Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp3 : Low <= High Hyp4 : 1 + Low = PlusOne GL : range Low High R GL1 : posLits R L Is : is_integer Low Is1 : is_integer High L : Low < PlusOne IsPlusOne : is_integer PlusOne R : range PlusOne High R' IsR' : is_list is_integer R' H1 : posLits R' P ============================ exists L', gatherLits (or (pos Low) (rangeClause PlusOne High)) L'
< search. Subgoal 2: Variables: L High Low Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_clause (rangeClause Low High) Hyp2 : gatherLits (rangeClause Low High) L Hyp3 : Low > High ============================ exists L', gatherLits emptyClause L'
< search. Subgoal 3: Variables: C' L Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp1 : is_clause (noteClause Note C') Hyp2 : gatherLits (noteClause Note C') L ============================ exists L', gatherLits C' L'
< case Hyp2. Subgoal 3: Variables: C' L Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp1 : is_clause (noteClause Note C') H1 : gatherLits C' L ============================ exists L', gatherLits C' L'
< search. Proof completed.
< Prove_Constraint unsat_proofs:lrat:proj_gatherLits_permutation. Subgoal 1: Variables: L L' High PlusOne Low Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp2 : gatherLits (rangeClause Low High) L Hyp3 : gatherLits (or (pos Low) (rangeClause PlusOne High)) L' Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne ============================ permutation L L'
< GL: case Hyp2. Subgoal 1: Variables: L L' High PlusOne Low R Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp3 : gatherLits (or (pos Low) (rangeClause PlusOne High)) L' Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL : range Low High R GL1 : posLits R L ============================ permutation L L'
< GL': case Hyp3. Subgoal 1: Variables: L High PlusOne Low R LRest Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL : range Low High R GL1 : posLits R L GL' : gatherLits (rangeClause PlusOne High) LRest ============================ permutation L ((pos Low)::LRest)
< GL': case GL'. Subgoal 1: Variables: L High PlusOne Low R LRest R1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL : range Low High R GL1 : posLits R L GL' : range PlusOne High R1 GL'1 : posLits R1 LRest ============================ permutation L ((pos Low)::LRest)
< R: case GL. Subgoal 1.1: Variables: L High PlusOne Low LRest R1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL1 : posLits [] L GL' : range PlusOne High R1 GL'1 : posLits R1 LRest R : Low > High ============================ permutation L ((pos Low)::LRest)
< apply greater_lesseq_integer_false to R Hyp4. Subgoal 1.2: Variables: L High PlusOne Low LRest R1 PlusOne1 Rest Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL1 : posLits (Low::Rest) L GL' : range PlusOne High R1 GL'1 : posLits R1 LRest R : Low <= High R1 : 1 + Low = PlusOne1 R2 : range PlusOne1 High Rest ============================ permutation L ((pos Low)::LRest)
< apply plus_integer_unique to R1 Hyp5. Subgoal 1.2: Variables: L High PlusOne Low LRest R1 Rest Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL1 : posLits (Low::Rest) L GL' : range PlusOne High R1 GL'1 : posLits R1 LRest R : Low <= High R1 : 1 + Low = PlusOne R2 : range PlusOne High Rest ============================ permutation L ((pos Low)::LRest)
< apply range_unique to GL' R2. Subgoal 1.2: Variables: L High PlusOne Low LRest Rest Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL1 : posLits (Low::Rest) L GL' : range PlusOne High Rest GL'1 : posLits Rest LRest R : Low <= High R1 : 1 + Low = PlusOne R2 : range PlusOne High Rest ============================ permutation L ((pos Low)::LRest)
< PL: case GL1. Subgoal 1.2: Variables: High PlusOne Low LRest Rest LRest1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL' : range PlusOne High Rest GL'1 : posLits Rest LRest R : Low <= High R1 : 1 + Low = PlusOne R2 : range PlusOne High Rest PL : posLits Rest LRest1 ============================ permutation ((pos Low)::LRest1) ((pos Low)::LRest)
< apply posLits_unique to GL'1 PL. Subgoal 1.2: Variables: High PlusOne Low Rest LRest1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL' : range PlusOne High Rest GL'1 : posLits Rest LRest1 R : Low <= High R1 : 1 + Low = PlusOne R2 : range PlusOne High Rest PL : posLits Rest LRest1 ============================ permutation ((pos Low)::LRest1) ((pos Low)::LRest1)
< Is: case Hyp1. Subgoal 1.2: Variables: High PlusOne Low Rest LRest1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL' : range PlusOne High Rest GL'1 : posLits Rest LRest1 R : Low <= High R1 : 1 + Low = PlusOne R2 : range PlusOne High Rest PL : posLits Rest LRest1 Is : is_integer Low Is1 : is_integer High ============================ permutation ((pos Low)::LRest1) ((pos Low)::LRest1)
< apply plus_integer_is_integer to _ _ R1. Subgoal 1.2: Variables: High PlusOne Low Rest LRest1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL' : range PlusOne High Rest GL'1 : posLits Rest LRest1 R : Low <= High R1 : 1 + Low = PlusOne R2 : range PlusOne High Rest PL : posLits Rest LRest1 Is : is_integer Low Is1 : is_integer High H1 : is_integer PlusOne ============================ permutation ((pos Low)::LRest1) ((pos Low)::LRest1)
< apply range_is to _ GL'. Subgoal 1.2: Variables: High PlusOne Low Rest LRest1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL' : range PlusOne High Rest GL'1 : posLits Rest LRest1 R : Low <= High R1 : 1 + Low = PlusOne R2 : range PlusOne High Rest PL : posLits Rest LRest1 Is : is_integer Low Is1 : is_integer High H1 : is_integer PlusOne H2 : is_list is_integer Rest ============================ permutation ((pos Low)::LRest1) ((pos Low)::LRest1)
< IsLRest1: apply posLits_is to _ PL. Subgoal 1.2: Variables: High PlusOne Low Rest LRest1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL' : range PlusOne High Rest GL'1 : posLits Rest LRest1 R : Low <= High R1 : 1 + Low = PlusOne R2 : range PlusOne High Rest PL : posLits Rest LRest1 Is : is_integer Low Is1 : is_integer High H1 : is_integer PlusOne H2 : is_list is_integer Rest IsLRest1 : is_list is_lit LRest1 ============================ permutation ((pos Low)::LRest1) ((pos Low)::LRest1)
< apply permutation_reflexive_lits to IsLRest1. Subgoal 1.2: Variables: High PlusOne Low Rest LRest1 Hyp : |{clause}- rangeClause Low High ~~> or (pos Low) (rangeClause PlusOne High) Hyp4 : Low <= High Hyp5 : 1 + Low = PlusOne GL' : range PlusOne High Rest GL'1 : posLits Rest LRest1 R : Low <= High R1 : 1 + Low = PlusOne R2 : range PlusOne High Rest PL : posLits Rest LRest1 Is : is_integer Low Is1 : is_integer High H1 : is_integer PlusOne H2 : is_list is_integer Rest IsLRest1 : is_list is_lit LRest1 H3 : permutation LRest1 LRest1 ============================ permutation ((pos Low)::LRest1) ((pos Low)::LRest1)
< search. Subgoal 2: Variables: L L' High Low Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_clause (rangeClause Low High) Hyp2 : gatherLits (rangeClause Low High) L Hyp3 : gatherLits emptyClause L' Hyp4 : Low > High ============================ permutation L L'
< GL: case Hyp2. Subgoal 2: Variables: L L' High Low R Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_clause (rangeClause Low High) Hyp3 : gatherLits emptyClause L' Hyp4 : Low > High GL : range Low High R GL1 : posLits R L ============================ permutation L L'
< case Hyp3. Subgoal 2: Variables: L High Low R Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low > High GL : range Low High R GL1 : posLits R L ============================ permutation L []
< R: case GL. Subgoal 2.1: Variables: L High Low Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low > High GL1 : posLits [] L R : Low > High ============================ permutation L []
< case GL1. Subgoal 2.1: Variables: High Low Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low > High R : Low > High ============================ permutation [] []
< search. Subgoal 2.2: Variables: L High Low PlusOne Rest Hyp : |{clause}- rangeClause Low High ~~> emptyClause Hyp1 : is_clause (rangeClause Low High) Hyp4 : Low > High GL1 : posLits (Low::Rest) L R : Low <= High R1 : 1 + Low = PlusOne R2 : range PlusOne High Rest ============================ permutation L []
< apply greater_lesseq_integer_false to Hyp4 R. Subgoal 3: Variables: C' L L' Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp1 : is_clause (noteClause Note C') Hyp2 : gatherLits (noteClause Note C') L Hyp3 : gatherLits C' L' ============================ permutation L L'
< GL: case Hyp2. Subgoal 3: Variables: C' L L' Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp1 : is_clause (noteClause Note C') Hyp3 : gatherLits C' L' GL : gatherLits C' L ============================ permutation L L'
< Is: case Hyp1. Subgoal 3: Variables: C' L L' Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp3 : gatherLits C' L' GL : gatherLits C' L Is : is_string Note Is1 : is_clause C' ============================ permutation L L'
< apply gatherLits_permutation to _ GL Hyp3. Subgoal 3: Variables: C' L L' Note Hyp : |{clause}- noteClause Note C' ~~> C' Hyp3 : gatherLits C' L' GL : gatherLits C' L Is : is_string Note Is1 : is_clause C' H1 : permutation L L' ============================ permutation L L'
< search. Proof completed.
< Prove unsat_proofs:lrat:gatherLits_sat. Subgoal 3: Variables: Lits Sat X High Low IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsC : is_clause (rangeClause Low High) IsSat : is_list is_lit Sat GL : gatherLits (rangeClause Low High) Lits Sat : sat_clause Sat (rangeClause Low High) @ Sat1 : Low <= X Sat2 : X <= High Sat3 : mem (pos X) Sat ============================ exists L, mem L Lits /\ mem L Sat
< GL: case GL. Subgoal 3: Variables: Lits Sat X High Low R IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsC : is_clause (rangeClause Low High) IsSat : is_list is_lit Sat Sat : sat_clause Sat (rangeClause Low High) @ Sat1 : Low <= X Sat2 : X <= High Sat3 : mem (pos X) Sat GL : range Low High R GL1 : posLits R Lits ============================ exists L, mem L Lits /\ mem L Sat
< Is: case IsC. Subgoal 3: Variables: Lits Sat X High Low R IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsSat : is_list is_lit Sat Sat : sat_clause Sat (rangeClause Low High) @ Sat1 : Low <= X Sat2 : X <= High Sat3 : mem (pos X) Sat GL : range Low High R GL1 : posLits R Lits Is : is_integer Low Is1 : is_integer High ============================ exists L, mem L Lits /\ mem L Sat
< IsPX: apply mem_is_lit to _ Sat3. Subgoal 3: Variables: Lits Sat X High Low R IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsSat : is_list is_lit Sat Sat : sat_clause Sat (rangeClause Low High) @ Sat1 : Low <= X Sat2 : X <= High Sat3 : mem (pos X) Sat GL : range Low High R GL1 : posLits R Lits Is : is_integer Low Is1 : is_integer High IsPX : is_lit (pos X) ============================ exists L, mem L Lits /\ mem L Sat
< IsX: case IsPX. Subgoal 3: Variables: Lits Sat X High Low R IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsSat : is_list is_lit Sat Sat : sat_clause Sat (rangeClause Low High) @ Sat1 : Low <= X Sat2 : X <= High Sat3 : mem (pos X) Sat GL : range Low High R GL1 : posLits R Lits Is : is_integer Low Is1 : is_integer High IsX : is_integer X ============================ exists L, mem L Lits /\ mem L Sat
< Mem: apply in_range to Is _ GL Sat1 Sat2. Subgoal 3: Variables: Lits Sat X High Low R IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsSat : is_list is_lit Sat Sat : sat_clause Sat (rangeClause Low High) @ Sat1 : Low <= X Sat2 : X <= High Sat3 : mem (pos X) Sat GL : range Low High R GL1 : posLits R Lits Is : is_integer Low Is1 : is_integer High IsX : is_integer X Mem : mem X R ============================ exists L, mem L Lits /\ mem L Sat
< apply posLits_mem to Mem GL1. Subgoal 3: Variables: Lits Sat X High Low R IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsSat : is_list is_lit Sat Sat : sat_clause Sat (rangeClause Low High) @ Sat1 : Low <= X Sat2 : X <= High Sat3 : mem (pos X) Sat GL : range Low High R GL1 : posLits R Lits Is : is_integer Low Is1 : is_integer High IsX : is_integer X Mem : mem X R H1 : mem (pos X) Lits ============================ exists L, mem L Lits /\ mem L Sat
< search. Subgoal 4: Variables: Lits Sat Clause Note IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsC : is_clause (noteClause Note Clause) IsSat : is_list is_lit Sat GL : gatherLits (noteClause Note Clause) Lits Sat : sat_clause Sat (noteClause Note Clause) @ Sat1 : sat_clause Sat Clause * ============================ exists L, mem L Lits /\ mem L Sat
< Is: case IsC. Subgoal 4: Variables: Lits Sat Clause Note IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsSat : is_list is_lit Sat GL : gatherLits (noteClause Note Clause) Lits Sat : sat_clause Sat (noteClause Note Clause) @ Sat1 : sat_clause Sat Clause * Is : is_string Note Is1 : is_clause Clause ============================ exists L, mem L Lits /\ mem L Sat
< GL: case GL. Subgoal 4: Variables: Lits Sat Clause Note IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsSat : is_list is_lit Sat Sat : sat_clause Sat (noteClause Note Clause) @ Sat1 : sat_clause Sat Clause * Is : is_string Note Is1 : is_clause Clause GL : gatherLits Clause Lits ============================ exists L, mem L Lits /\ mem L Sat
< apply IH to _ _ GL Sat1. Subgoal 4: Variables: Lits Sat Clause Note L IH : forall C Lits Sat, is_clause C -> is_list is_lit Sat -> gatherLits C Lits -> sat_clause Sat C * -> exists L, mem L Lits /\ mem L Sat IsSat : is_list is_lit Sat Sat : sat_clause Sat (noteClause Note Clause) @ Sat1 : sat_clause Sat Clause * Is : is_string Note Is1 : is_clause Clause GL : gatherLits Clause Lits H1 : mem L Lits H2 : mem L Sat ============================ exists L, mem L Lits /\ mem L Sat
< search. Proof completed.
< Prove unsat_proofs:lrat:gatherLits_mem_sat. Subgoal 3: Variables: Lits Sat L R High Low IH : forall C Lits Sat L, is_clause C -> is_list is_lit Sat -> gatherLits C Lits * -> mem L Lits -> mem L Sat -> sat_clause Sat C IsC : is_clause (rangeClause Low High) IsSat : is_list is_lit Sat GL : gatherLits (rangeClause Low High) Lits @ MemLits : mem L Lits MemSat : mem L Sat GL1 : range Low High R GL2 : posLits R Lits ============================ sat_clause Sat (rangeClause Low High)
< apply posLits_form to GL2 MemLits. Subgoal 3: Variables: Lits Sat R High Low I IH : forall C Lits Sat L, is_clause C -> is_list is_lit Sat -> gatherLits C Lits * -> mem L Lits -> mem L Sat -> sat_clause Sat C IsC : is_clause (rangeClause Low High) IsSat : is_list is_lit Sat GL : gatherLits (rangeClause Low High) Lits @ MemLits : mem (pos I) Lits MemSat : mem (pos I) Sat GL1 : range Low High R GL2 : posLits R Lits ============================ sat_clause Sat (rangeClause Low High)
< MemIR: apply mem_after_posLits_before to GL2 MemLits. Subgoal 3: Variables: Lits Sat R High Low I IH : forall C Lits Sat L, is_clause C -> is_list is_lit Sat -> gatherLits C Lits * -> mem L Lits -> mem L Sat -> sat_clause Sat C IsC : is_clause (rangeClause Low High) IsSat : is_list is_lit Sat GL : gatherLits (rangeClause Low High) Lits @ MemLits : mem (pos I) Lits MemSat : mem (pos I) Sat GL1 : range Low High R GL2 : posLits R Lits MemIR : mem I R ============================ sat_clause Sat (rangeClause Low High)
< Is: case IsC. Subgoal 3: Variables: Lits Sat R High Low I IH : forall C Lits Sat L, is_clause C -> is_list is_lit Sat -> gatherLits C Lits * -> mem L Lits -> mem L Sat -> sat_clause Sat C IsSat : is_list is_lit Sat GL : gatherLits (rangeClause Low High) Lits @ MemLits : mem (pos I) Lits MemSat : mem (pos I) Sat GL1 : range Low High R GL2 : posLits R Lits MemIR : mem I R Is : is_integer Low Is1 : is_integer High ============================ sat_clause Sat (rangeClause Low High)
< apply range_low_lesseq to _ GL1 MemIR. Subgoal 3: Variables: Lits Sat R High Low I IH : forall C Lits Sat L, is_clause C -> is_list is_lit Sat -> gatherLits C Lits * -> mem L Lits -> mem L Sat -> sat_clause Sat C IsSat : is_list is_lit Sat GL : gatherLits (rangeClause Low High) Lits @ MemLits : mem (pos I) Lits MemSat : mem (pos I) Sat GL1 : range Low High R GL2 : posLits R Lits MemIR : mem I R Is : is_integer Low Is1 : is_integer High H1 : Low <= I ============================ sat_clause Sat (rangeClause Low High)
< apply range_high_lesseq to _ GL1 MemIR. Subgoal 3: Variables: Lits Sat R High Low I IH : forall C Lits Sat L, is_clause C -> is_list is_lit Sat -> gatherLits C Lits * -> mem L Lits -> mem L Sat -> sat_clause Sat C IsSat : is_list is_lit Sat GL : gatherLits (rangeClause Low High) Lits @ MemLits : mem (pos I) Lits MemSat : mem (pos I) Sat GL1 : range Low High R GL2 : posLits R Lits MemIR : mem I R Is : is_integer Low Is1 : is_integer High H1 : Low <= I H2 : I <= High ============================ sat_clause Sat (rangeClause Low High)
< search. Subgoal 4: Variables: Lits Sat L Clause Note IH : forall C Lits Sat L, is_clause C -> is_list is_lit Sat -> gatherLits C Lits * -> mem L Lits -> mem L Sat -> sat_clause Sat C IsC : is_clause (noteClause Note Clause) IsSat : is_list is_lit Sat GL : gatherLits (noteClause Note Clause) Lits @ MemLits : mem L Lits MemSat : mem L Sat GL1 : gatherLits Clause Lits * ============================ sat_clause Sat (noteClause Note Clause)
< Is: case IsC. Subgoal 4: Variables: Lits Sat L Clause Note IH : forall C Lits Sat L, is_clause C -> is_list is_lit Sat -> gatherLits C Lits * -> mem L Lits -> mem L Sat -> sat_clause Sat C IsSat : is_list is_lit Sat GL : gatherLits (noteClause Note Clause) Lits @ MemLits : mem L Lits MemSat : mem L Sat GL1 : gatherLits Clause Lits * Is : is_string Note Is1 : is_clause Clause ============================ sat_clause Sat (noteClause Note Clause)
< apply IH to _ _ GL1 MemLits MemSat. Subgoal 4: Variables: Lits Sat L Clause Note IH : forall C Lits Sat L, is_clause C -> is_list is_lit Sat -> gatherLits C Lits * -> mem L Lits -> mem L Sat -> sat_clause Sat C IsSat : is_list is_lit Sat GL : gatherLits (noteClause Note Clause) Lits @ MemLits : mem L Lits MemSat : mem L Sat GL1 : gatherLits Clause Lits * Is : is_string Note Is1 : is_clause Clause H1 : sat_clause Sat Clause ============================ sat_clause Sat (noteClause Note Clause)
< search. Proof completed.
< Prove unsat_proofs:lrat:gatherLits_unsat. Subgoal 3: Variables: Lits Unsat L R N High Low IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsC : is_clause (rangeClause Low High) IsUnsat : is_list is_lit Unsat GL : gatherLits (rangeClause Low High) Lits Unsat : unsat_clause Unsat (rangeClause Low High) @ MemLits : mem L Lits MemUnsat : mem L Unsat Unsat1 : range Low High R Unsat2 : negs R N Unsat3 : subset N Unsat ============================ false
< Is: case IsC. Subgoal 3: Variables: Lits Unsat L R N High Low IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsUnsat : is_list is_lit Unsat GL : gatherLits (rangeClause Low High) Lits Unsat : unsat_clause Unsat (rangeClause Low High) @ MemLits : mem L Lits MemUnsat : mem L Unsat Unsat1 : range Low High R Unsat2 : negs R N Unsat3 : subset N Unsat Is : is_integer Low Is1 : is_integer High ============================ false
< GL: case GL. Subgoal 3: Variables: Lits Unsat L R N High Low R1 IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsUnsat : is_list is_lit Unsat Unsat : unsat_clause Unsat (rangeClause Low High) @ MemLits : mem L Lits MemUnsat : mem L Unsat Unsat1 : range Low High R Unsat2 : negs R N Unsat3 : subset N Unsat Is : is_integer Low Is1 : is_integer High GL : range Low High R1 GL1 : posLits R1 Lits ============================ false
< apply range_unique to GL Unsat1. Subgoal 3: Variables: Lits Unsat L R N High Low IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsUnsat : is_list is_lit Unsat Unsat : unsat_clause Unsat (rangeClause Low High) @ MemLits : mem L Lits MemUnsat : mem L Unsat Unsat1 : range Low High R Unsat2 : negs R N Unsat3 : subset N Unsat Is : is_integer Low Is1 : is_integer High GL : range Low High R GL1 : posLits R Lits ============================ false
< apply posLits_form to GL1 MemLits. Subgoal 3: Variables: Lits Unsat R N High Low I IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsUnsat : is_list is_lit Unsat Unsat : unsat_clause Unsat (rangeClause Low High) @ MemLits : mem (pos I) Lits MemUnsat : mem (pos I) Unsat Unsat1 : range Low High R Unsat2 : negs R N Unsat3 : subset N Unsat Is : is_integer Low Is1 : is_integer High GL : range Low High R GL1 : posLits R Lits ============================ false
< MR: apply mem_after_posLits_before to GL1 MemLits. Subgoal 3: Variables: Lits Unsat R N High Low I IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsUnsat : is_list is_lit Unsat Unsat : unsat_clause Unsat (rangeClause Low High) @ MemLits : mem (pos I) Lits MemUnsat : mem (pos I) Unsat Unsat1 : range Low High R Unsat2 : negs R N Unsat3 : subset N Unsat Is : is_integer Low Is1 : is_integer High GL : range Low High R GL1 : posLits R Lits MR : mem I R ============================ false
< MN: apply negs_mem to MR Unsat2. Subgoal 3: Variables: Lits Unsat R N High Low I IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsUnsat : is_list is_lit Unsat Unsat : unsat_clause Unsat (rangeClause Low High) @ MemLits : mem (pos I) Lits MemUnsat : mem (pos I) Unsat Unsat1 : range Low High R Unsat2 : negs R N Unsat3 : subset N Unsat Is : is_integer Low Is1 : is_integer High GL : range Low High R GL1 : posLits R Lits MR : mem I R MN : mem (neg I) N ============================ false
< MU: apply subset_mem to Unsat3 MN. Subgoal 3: Variables: Lits Unsat R N High Low I IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsUnsat : is_list is_lit Unsat Unsat : unsat_clause Unsat (rangeClause Low High) @ MemLits : mem (pos I) Lits MemUnsat : mem (pos I) Unsat Unsat1 : range Low High R Unsat2 : negs R N Unsat3 : subset N Unsat Is : is_integer Low Is1 : is_integer High GL : range Low High R GL1 : posLits R Lits MR : mem I R MN : mem (neg I) N MU : mem (neg I) Unsat ============================ false
< GA: case GA. Subgoal 3: Variables: Lits Unsat R N High Low I IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false IsUnsat : is_list is_lit Unsat Unsat : unsat_clause Unsat (rangeClause Low High) @ MemLits : mem (pos I) Lits MemUnsat : mem (pos I) Unsat Unsat1 : range Low High R Unsat2 : negs R N Unsat3 : subset N Unsat Is : is_integer Low Is1 : is_integer High GL : range Low High R GL1 : posLits R Lits MR : mem I R MN : mem (neg I) N MU : mem (neg I) Unsat GA : forall L NL, mem L Unsat -> negate_lit L NL -> mem NL Unsat -> false ============================ false
< apply GA to MU _ MemUnsat. Subgoal 4: Variables: Lits Unsat L Clause Note IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsC : is_clause (noteClause Note Clause) IsUnsat : is_list is_lit Unsat GL : gatherLits (noteClause Note Clause) Lits Unsat : unsat_clause Unsat (noteClause Note Clause) @ MemLits : mem L Lits MemUnsat : mem L Unsat Unsat1 : unsat_clause Unsat Clause * ============================ false
< case IsC. Subgoal 4: Variables: Lits Unsat L Clause Note IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsUnsat : is_list is_lit Unsat GL : gatherLits (noteClause Note Clause) Lits Unsat : unsat_clause Unsat (noteClause Note Clause) @ MemLits : mem L Lits MemUnsat : mem L Unsat Unsat1 : unsat_clause Unsat Clause * H1 : is_string Note H2 : is_clause Clause ============================ false
< case GL. Subgoal 4: Variables: Lits Unsat L Clause Note IH : forall C Lits Unsat L, good_assignment Unsat -> is_clause C -> is_list is_lit Unsat -> gatherLits C Lits -> unsat_clause Unsat C * -> mem L Lits -> mem L Unsat -> false GA : good_assignment Unsat IsUnsat : is_list is_lit Unsat Unsat : unsat_clause Unsat (noteClause Note Clause) @ MemLits : mem L Lits MemUnsat : mem L Unsat Unsat1 : unsat_clause Unsat Clause * H1 : is_string Note H2 : is_clause Clause H3 : gatherLits Clause Lits ============================ false
< apply IH to GA _ _ _ Unsat1 _ _. Proof completed.
< Theorem posLits_negateLitList_negs : forall L P N, posLits L P -> negateLitList P N -> negs L N. ============================ forall L P N, posLits L P -> negateLitList P N -> negs L N
< induction on 1. IH : forall L P N, posLits L P * -> negateLitList P N -> negs L N ============================ forall L P N, posLits L P @ -> negateLitList P N -> negs L N
< intros PL N. Variables: L P N IH : forall L P N, posLits L P * -> negateLitList P N -> negs L N PL : posLits L P @ N : negateLitList P N ============================ negs L N
< PL: case PL. Subgoal 1: Variables: N IH : forall L P N, posLits L P * -> negateLitList P N -> negs L N N : negateLitList [] N ============================ negs [] N
< case N. Subgoal 1: IH : forall L P N, posLits L P * -> negateLitList P N -> negs L N ============================ negs [] []
< search. Subgoal 2: Variables: N LRest I Rest IH : forall L P N, posLits L P * -> negateLitList P N -> negs L N N : negateLitList ((pos I)::LRest) N PL : posLits Rest LRest * ============================ negs (I::Rest) N
< N: case N. Subgoal 2: Variables: LRest I Rest NRest N1 IH : forall L P N, posLits L P * -> negateLitList P N -> negs L N PL : posLits Rest LRest * N : negate_lit (pos I) N1 N1 : negateLitList LRest NRest ============================ negs (I::Rest) (N1::NRest)
< apply IH to PL N1. Subgoal 2: Variables: LRest I Rest NRest N1 IH : forall L P N, posLits L P * -> negateLitList P N -> negs L N PL : posLits Rest LRest * N : negate_lit (pos I) N1 N1 : negateLitList LRest NRest H1 : negs Rest NRest ============================ negs (I::Rest) (N1::NRest)
< case N. Subgoal 2: Variables: LRest I Rest NRest IH : forall L P N, posLits L P * -> negateLitList P N -> negs L N PL : posLits Rest LRest * N1 : negateLitList LRest NRest H1 : negs Rest NRest ============================ negs (I::Rest) ((neg I)::NRest)
< search. Proof completed.
< Theorem negs_is : forall L N, is_list is_integer L -> negs L N -> is_list is_lit N. ============================ forall L N, is_list is_integer L -> negs L N -> is_list is_lit N
< induction on 1. IH : forall L N, is_list is_integer L * -> negs L N -> is_list is_lit N ============================ forall L N, is_list is_integer L @ -> negs L N -> is_list is_lit N
< intros Is N. Variables: L N IH : forall L N, is_list is_integer L * -> negs L N -> is_list is_lit N Is : is_list is_integer L @ N : negs L N ============================ is_list is_lit N
< Is: case Is. Subgoal 1: Variables: N IH : forall L N, is_list is_integer L * -> negs L N -> is_list is_lit N N : negs [] N ============================ is_list is_lit N
< case N. Subgoal 1: IH : forall L N, is_list is_integer L * -> negs L N -> is_list is_lit N ============================ is_list is_lit []
< search. Subgoal 2: Variables: N T H IH : forall L N, is_list is_integer L * -> negs L N -> is_list is_lit N N : negs (H::T) N Is : is_integer H Is1 : is_list is_integer T * ============================ is_list is_lit N
< N: case N. Subgoal 2: Variables: T H LRest IH : forall L N, is_list is_integer L * -> negs L N -> is_list is_lit N Is : is_integer H Is1 : is_list is_integer T * N : negs T LRest ============================ is_list is_lit ((neg H)::LRest)
< apply IH to Is1 N. Subgoal 2: Variables: T H LRest IH : forall L N, is_list is_integer L * -> negs L N -> is_list is_lit N Is : is_integer H Is1 : is_list is_integer T * N : negs T LRest H1 : is_list is_lit LRest ============================ is_list is_lit ((neg H)::LRest)
< search. Proof completed.
< Prove unsat_proofs:lrat:negate_lits_unsat. Subgoal 3: Variables: L NL R High Low IH : forall C L NL, is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C IsC : is_clause (rangeClause Low High) GL : gatherLits (rangeClause Low High) L @ NLL : negateLitList L NL GL1 : range Low High R GL2 : posLits R L ============================ unsat_clause NL (rangeClause Low High)
< Is: case IsC. Subgoal 3: Variables: L NL R High Low IH : forall C L NL, is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C GL : gatherLits (rangeClause Low High) L @ NLL : negateLitList L NL GL1 : range Low High R GL2 : posLits R L Is : is_integer Low Is1 : is_integer High ============================ unsat_clause NL (rangeClause Low High)
< Negs: apply posLits_negateLitList_negs to GL2 NLL. Subgoal 3: Variables: L NL R High Low IH : forall C L NL, is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C GL : gatherLits (rangeClause Low High) L @ NLL : negateLitList L NL GL1 : range Low High R GL2 : posLits R L Is : is_integer Low Is1 : is_integer High Negs : negs R NL ============================ unsat_clause NL (rangeClause Low High)
< IsR: apply range_is to _ GL1. Subgoal 3: Variables: L NL R High Low IH : forall C L NL, is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C GL : gatherLits (rangeClause Low High) L @ NLL : negateLitList L NL GL1 : range Low High R GL2 : posLits R L Is : is_integer Low Is1 : is_integer High Negs : negs R NL IsR : is_list is_integer R ============================ unsat_clause NL (rangeClause Low High)
< IsNL: apply negs_is to IsR Negs. Subgoal 3: Variables: L NL R High Low IH : forall C L NL, is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C GL : gatherLits (rangeClause Low High) L @ NLL : negateLitList L NL GL1 : range Low High R GL2 : posLits R L Is : is_integer Low Is1 : is_integer High Negs : negs R NL IsR : is_list is_integer R IsNL : is_list is_lit NL ============================ unsat_clause NL (rangeClause Low High)
< apply mems_subset to IsNL _ with Sup = NL. Subgoal 3: Variables: L NL R High Low IH : forall C L NL, is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C GL : gatherLits (rangeClause Low High) L @ NLL : negateLitList L NL GL1 : range Low High R GL2 : posLits R L Is : is_integer Low Is1 : is_integer High Negs : negs R NL IsR : is_list is_integer R IsNL : is_list is_lit NL H1 : subset NL NL ============================ unsat_clause NL (rangeClause Low High)
< search. Subgoal 4: Variables: L NL Clause Note IH : forall C L NL, is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C IsC : is_clause (noteClause Note Clause) GL : gatherLits (noteClause Note Clause) L @ NLL : negateLitList L NL GL1 : gatherLits Clause L * ============================ unsat_clause NL (noteClause Note Clause)
< case IsC. Subgoal 4: Variables: L NL Clause Note IH : forall C L NL, is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C GL : gatherLits (noteClause Note Clause) L @ NLL : negateLitList L NL GL1 : gatherLits Clause L * H1 : is_string Note H2 : is_clause Clause ============================ unsat_clause NL (noteClause Note Clause)
< apply IH to _ GL1 _. Subgoal 4: Variables: L NL Clause Note IH : forall C L NL, is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C GL : gatherLits (noteClause Note Clause) L @ NLL : negateLitList L NL GL1 : gatherLits Clause L * H1 : is_string Note H2 : is_clause Clause H3 : unsat_clause NL Clause ============================ unsat_clause NL (noteClause Note Clause)
< search. 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.