Reasoning Details

 < 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.
Back to example home