Reasoning Details

 < Module unsat_proofs:lrat.
 < Projection_Constraint proj_lit_unique :
   forall L LA LB,
   ProjA : |{lit}- L ~~> LA ->
   ProjB : |{lit}- L ~~> LB ->
   LA = LB.

Proof completed.
 < Projection_Constraint proj_lit_is :
   forall L LT,
   Proj : |{lit}- L ~~> LT ->
   IsL : is_lit L ->
   is_lit LT.

Proof completed.
 < Projection_Constraint proj_clause_unique :
   forall C CA CB,
   ProjA : |{clause}- C ~~> CA ->
   ProjB : |{clause}- C ~~> CB ->
   CA = CB.

Proof completed.
 < Projection_Constraint proj_clause_is :
   forall C CT,
   Proj : |{clause}- C ~~> CT ->
   IsC : is_clause C ->
   is_clause CT.

Proof completed.
 < Projection_Constraint proj_formula_unique :
   forall F FA FB,
   ProjA : |{formula}- F ~~> FA ->
   ProjB : |{formula}- F ~~> FB ->
   FA = FB.

Proof completed.
 < Projection_Constraint proj_formula_is :
   forall F FT,
   Proj : |{formula}- F ~~> FT ->
   IsF : is_formula F ->
   is_formula FT.

Proof completed.
 < Proj_Rel is_clause C.

Proof completed.
 < Ext_Ind forall C, is_clause C.

Warning:  No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Subgoal 1:

IH : forall C, is_clause C * -> <is_clause {P}> C
R : is_clause emptyClause @
============================
 <is_clause {P}> emptyClause
 < search.

Subgoal 2:

Variables: Clause Lit
IH : forall C, is_clause C * -> <is_clause {P}> C
R : is_clause (or Lit Clause) @
R1 : is_lit Lit
R2 : is_clause Clause *
============================
 <is_clause {P}> (or Lit Clause)
 < apply IH to R2.

Subgoal 2:

Variables: Clause Lit
IH : forall C, is_clause C * -> <is_clause {P}> C
R : is_clause (or Lit Clause) @
R1 : is_lit Lit
R2 : is_clause Clause *
H1 : <is_clause {P}> Clause
============================
 <is_clause {P}> (or Lit Clause)
 < search.

Proof completed.
 < Proj_Rel is_formula F.

Proof completed.
 < Ext_Ind forall F, is_formula F.

Warning:  No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Subgoal 1:

IH : forall F, is_formula F * -> <is_formula {P}> F
R : is_formula emptyFormula @
============================
 <is_formula {P}> emptyFormula
 < search.

Subgoal 2:

Variables: Formula Clause
IH : forall F, is_formula F * -> <is_formula {P}> F
R : is_formula (and Clause Formula) @
R1 : is_clause Clause
R2 : is_formula Formula *
============================
 <is_formula {P}> (and Clause Formula)
 < apply IH to R2.

Subgoal 2:

Variables: Formula Clause
IH : forall F, is_formula F * -> <is_formula {P}> F
R : is_formula (and Clause Formula) @
R1 : is_clause Clause
R2 : is_formula Formula *
H1 : <is_formula {P}> Formula
============================
 <is_formula {P}> (and Clause Formula)
 < search.

Proof completed.
 < Extensible_Theorem
      is_lit_pos_or_neg : forall L,
         IsL : is_lit L ->
         exists I,
           L = pos I \/ L = neg I
      on IsL.

Subgoal 1:

Variables: I
IH : forall L, is_lit L * -> exists I, L = pos I \/ L = neg I
IsL : is_lit (pos I) @
IsL1 : is_integer I
============================
 exists I1, pos I = pos I1 \/ pos I = neg I1
 < search.

Subgoal 2:

Variables: I
IH : forall L, is_lit L * -> exists I, L = pos I \/ L = neg I
IsL : is_lit (neg I) @
IsL1 : is_integer I
============================
 exists I1, neg I = pos I1 \/ neg I = neg I1
 < search.

Proof completed.
 < Theorem is_lit_eq_or_not :
     forall L1 L2, is_lit L1 -> is_lit L2 -> L1 = L2 \/ (L1 = L2 -> false).

============================
 forall L1 L2, is_lit L1 -> is_lit L2 -> L1 = L2 \/ (L1 = L2 -> false)
 < intros IsL1 IsL2.

Variables: L1 L2
IsL1 : is_lit L1
IsL2 : is_lit L2
============================
 L1 = L2 \/ (L1 = L2 -> false)
 < Or1: apply is_lit_pos_or_neg to IsL1.

Variables: L1 L2 I
IsL1 : is_lit L1
IsL2 : is_lit L2
Or1 : L1 = pos I \/ L1 = neg I
============================
 L1 = L2 \/ (L1 = L2 -> false)
 < Or2: apply is_lit_pos_or_neg to IsL2.

Variables: L1 L2 I I1
IsL1 : is_lit L1
IsL2 : is_lit L2
Or1 : L1 = pos I \/ L1 = neg I
Or2 : L2 = pos I1 \/ L2 = neg I1
============================
 L1 = L2 \/ (L1 = L2 -> false)
 < case Or1.

Subgoal 1:

Variables: L2 I I1
IsL1 : is_lit (pos I)
IsL2 : is_lit L2
Or2 : L2 = pos I1 \/ L2 = neg I1
============================
 pos I = L2 \/ (pos I = L2 -> false)
 < case Or2.

Subgoal 1.1:

Variables: I I1
IsL1 : is_lit (pos I)
IsL2 : is_lit (pos I1)
============================
 pos I = pos I1 \/ (pos I = pos I1 -> false)
 < Is1: case IsL1.

Subgoal 1.1:

Variables: I I1
IsL2 : is_lit (pos I1)
Is1 : is_integer I
============================
 pos I = pos I1 \/ (pos I = pos I1 -> false)
 < Is2: case IsL2.

Subgoal 1.1:

Variables: I I1
Is1 : is_integer I
Is2 : is_integer I1
============================
 pos I = pos I1 \/ (pos I = pos I1 -> false)
 < Or: apply is_integer_eq_or_not to Is1 Is2.

Subgoal 1.1:

Variables: I I1
Is1 : is_integer I
Is2 : is_integer I1
Or : I = I1 \/ (I = I1 -> false)
============================
 pos I = pos I1 \/ (pos I = pos I1 -> false)
 < N: case Or.

Subgoal 1.1.1:

Variables: I1
Is1 : is_integer I1
Is2 : is_integer I1
============================
 pos I1 = pos I1 \/ (pos I1 = pos I1 -> false)
 < search.

Subgoal 1.1.2:

Variables: I I1
Is1 : is_integer I
Is2 : is_integer I1
N : I = I1 -> false
============================
 pos I = pos I1 \/ (pos I = pos I1 -> false)
 < right.

Subgoal 1.1.2:

Variables: I I1
Is1 : is_integer I
Is2 : is_integer I1
N : I = I1 -> false
============================
 pos I = pos I1 -> false
 < intros E.

Subgoal 1.1.2:

Variables: I I1
Is1 : is_integer I
Is2 : is_integer I1
N : I = I1 -> false
E : pos I = pos I1
============================
 false
 < case E.

Subgoal 1.1.2:

Variables: I1
Is1 : is_integer I1
Is2 : is_integer I1
N : I1 = I1 -> false
============================
 false
 < backchain N.

Subgoal 1.2:

Variables: I I1
IsL1 : is_lit (pos I)
IsL2 : is_lit (neg I1)
============================
 pos I = neg I1 \/ (pos I = neg I1 -> false)
 < right.

Subgoal 1.2:

Variables: I I1
IsL1 : is_lit (pos I)
IsL2 : is_lit (neg I1)
============================
 pos I = neg I1 -> false
 < intros E.

Subgoal 1.2:

Variables: I I1
IsL1 : is_lit (pos I)
IsL2 : is_lit (neg I1)
E : pos I = neg I1
============================
 false
 < case E.

Subgoal 2:

Variables: L2 I I1
IsL1 : is_lit (neg I)
IsL2 : is_lit L2
Or2 : L2 = pos I1 \/ L2 = neg I1
============================
 neg I = L2 \/ (neg I = L2 -> false)
 < case Or2.

Subgoal 2.1:

Variables: I I1
IsL1 : is_lit (neg I)
IsL2 : is_lit (pos I1)
============================
 neg I = pos I1 \/ (neg I = pos I1 -> false)
 < right.

Subgoal 2.1:

Variables: I I1
IsL1 : is_lit (neg I)
IsL2 : is_lit (pos I1)
============================
 neg I = pos I1 -> false
 < intros E.

Subgoal 2.1:

Variables: I I1
IsL1 : is_lit (neg I)
IsL2 : is_lit (pos I1)
E : neg I = pos I1
============================
 false
 < case E.

Subgoal 2.2:

Variables: I I1
IsL1 : is_lit (neg I)
IsL2 : is_lit (neg I1)
============================
 neg I = neg I1 \/ (neg I = neg I1 -> false)
 < Is1: case IsL1.

Subgoal 2.2:

Variables: I I1
IsL2 : is_lit (neg I1)
Is1 : is_integer I
============================
 neg I = neg I1 \/ (neg I = neg I1 -> false)
 < Is2: case IsL2.

Subgoal 2.2:

Variables: I I1
Is1 : is_integer I
Is2 : is_integer I1
============================
 neg I = neg I1 \/ (neg I = neg I1 -> false)
 < Or: apply is_integer_eq_or_not to Is1 Is2.

Subgoal 2.2:

Variables: I I1
Is1 : is_integer I
Is2 : is_integer I1
Or : I = I1 \/ (I = I1 -> false)
============================
 neg I = neg I1 \/ (neg I = neg I1 -> false)
 < N: case Or.

Subgoal 2.2.1:

Variables: I1
Is1 : is_integer I1
Is2 : is_integer I1
============================
 neg I1 = neg I1 \/ (neg I1 = neg I1 -> false)
 < search.

Subgoal 2.2.2:

Variables: I I1
Is1 : is_integer I
Is2 : is_integer I1
N : I = I1 -> false
============================
 neg I = neg I1 \/ (neg I = neg I1 -> false)
 < right.

Subgoal 2.2.2:

Variables: I I1
Is1 : is_integer I
Is2 : is_integer I1
N : I = I1 -> false
============================
 neg I = neg I1 -> false
 < intros E.

Subgoal 2.2.2:

Variables: I I1
Is1 : is_integer I
Is2 : is_integer I1
N : I = I1 -> false
E : neg I = neg I1
============================
 false
 < case E.

Subgoal 2.2.2:

Variables: I1
Is1 : is_integer I1
Is2 : is_integer I1
N : I1 = I1 -> false
============================
 false
 < backchain N.

Proof completed.
 < Extensible_Theorem
      is_clause_empty_or_not : forall C,
         IsC : is_clause C ->
         emptyClause = C \/
         (emptyClause = C -> false)
      on IsC.

Subgoal 1:

IH : forall C, is_clause C * -> emptyClause = C \/ (emptyClause = C -> false)
IsC : is_clause emptyClause @
============================
 emptyClause = emptyClause \/ (emptyClause = emptyClause -> false)
 < search.

Subgoal 2:

Variables: Clause Lit
IH : forall C, is_clause C * -> emptyClause = C \/ (emptyClause = C -> false)
IsC : is_clause (or Lit Clause) @
IsC1 : is_lit Lit
IsC2 : is_clause Clause *
============================
 emptyClause = or Lit Clause \/ (emptyClause = or Lit Clause -> false)
 < right.

Subgoal 2:

Variables: Clause Lit
IH : forall C, is_clause C * -> emptyClause = C \/ (emptyClause = C -> false)
IsC : is_clause (or Lit Clause) @
IsC1 : is_lit Lit
IsC2 : is_clause Clause *
============================
 emptyClause = or Lit Clause -> false
 < intros E.

Subgoal 2:

Variables: Clause Lit
IH : forall C, is_clause C * -> emptyClause = C \/ (emptyClause = C -> false)
IsC : is_clause (or Lit Clause) @
IsC1 : is_lit Lit
IsC2 : is_clause Clause *
E : emptyClause = or Lit Clause
============================
 false
 < case E.

Proof completed.
 < Extensible_Theorem
      is_clause_or_or_not : forall C,
         IsC : is_clause C ->
         (exists L R, or L R = C) \/
         ((exists L R, or L R = C) -> false)
      on IsC.

Subgoal 1:

IH : forall C,
       is_clause C * -> (exists L R, or L R = C) \/
       ((exists L R, or L R = C) -> false)
IsC : is_clause emptyClause @
============================
 (exists L R, or L R = emptyClause) \/
 ((exists L R, or L R = emptyClause) -> false)
 < right.

Subgoal 1:

IH : forall C,
       is_clause C * -> (exists L R, or L R = C) \/
       ((exists L R, or L R = C) -> false)
IsC : is_clause emptyClause @
============================
 (exists L R, or L R = emptyClause) -> false
 < intros E.

Subgoal 1:

IH : forall C,
       is_clause C * -> (exists L R, or L R = C) \/
       ((exists L R, or L R = C) -> false)
IsC : is_clause emptyClause @
E : exists L R, or L R = emptyClause
============================
 false
 < case E.

Subgoal 2:

Variables: Clause Lit
IH : forall C,
       is_clause C * -> (exists L R, or L R = C) \/
       ((exists L R, or L R = C) -> false)
IsC : is_clause (or Lit Clause) @
IsC1 : is_lit Lit
IsC2 : is_clause Clause *
============================
 (exists L R, or L R = or Lit Clause) \/
 ((exists L R, or L R = or Lit Clause) -> false)
 < search.

Proof completed.
 < Extensible_Theorem
      is_clause_eq_or_not : forall C1 C2,
         IsC1 : is_clause C1 ->
         IsC2 : is_clause C2 ->
         C1 = C2 \/
         (C1 = C2 -> false)
      on IsC1.

Subgoal 1:

Variables: C2
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause emptyClause @
IsC2 : is_clause C2
============================
 emptyClause = C2 \/ (emptyClause = C2 -> false)
 < Or: apply is_clause_empty_or_not to IsC2.

Subgoal 1:

Variables: C2
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause emptyClause @
IsC2 : is_clause C2
Or : emptyClause = C2 \/ (emptyClause = C2 -> false)
============================
 emptyClause = C2 \/ (emptyClause = C2 -> false)
 < Eq: case Or.

Subgoal 1.1:

IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause emptyClause @
IsC2 : is_clause emptyClause
============================
 emptyClause = emptyClause \/ (emptyClause = emptyClause -> false)
 < search.

Subgoal 1.2:

Variables: C2
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause emptyClause @
IsC2 : is_clause C2
Eq : emptyClause = C2 -> false
============================
 emptyClause = C2 \/ (emptyClause = C2 -> false)
 < search.

Subgoal 2:

Variables: C2 Clause Lit
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC2 : is_clause C2
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
============================
 or Lit Clause = C2 \/ (or Lit Clause = C2 -> false)
 < Or: apply is_clause_or_or_not to IsC2.

Subgoal 2:

Variables: C2 Clause Lit
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC2 : is_clause C2
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Or : (exists L R, or L R = C2) \/ ((exists L R, or L R = C2) -> false)
============================
 or Lit Clause = C2 \/ (or Lit Clause = C2 -> false)
 < Form: case Or.

Subgoal 2.1:

Variables: Clause Lit L R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC2 : is_clause (or L R)
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
============================
 or Lit Clause = or L R \/ (or Lit Clause = or L R -> false)
 < Is: case IsC2.

Subgoal 2.1:

Variables: Clause Lit L R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Is : is_lit L
Is1 : is_clause R
============================
 or Lit Clause = or L R \/ (or Lit Clause = or L R -> false)
 < Or: apply is_lit_eq_or_not to Is IsC3.

Subgoal 2.1:

Variables: Clause Lit L R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Is : is_lit L
Is1 : is_clause R
Or : L = Lit \/ (L = Lit -> false)
============================
 or Lit Clause = or L R \/ (or Lit Clause = or L R -> false)
 < NEq: case Or.

Subgoal 2.1.1:

Variables: Clause Lit R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Is : is_lit Lit
Is1 : is_clause R
============================
 or Lit Clause = or Lit R \/ (or Lit Clause = or Lit R -> false)
 < Or: apply IH to IsC4 Is1.

Subgoal 2.1.1:

Variables: Clause Lit R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Is : is_lit Lit
Is1 : is_clause R
Or : Clause = R \/ (Clause = R -> false)
============================
 or Lit Clause = or Lit R \/ (or Lit Clause = or Lit R -> false)
 < NEq: case Or.

Subgoal 2.1.1.1:

Variables: Lit R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit R) @
IsC3 : is_lit Lit
IsC4 : is_clause R *
Is : is_lit Lit
Is1 : is_clause R
============================
 or Lit R = or Lit R \/ (or Lit R = or Lit R -> false)
 < search.

Subgoal 2.1.1.2:

Variables: Clause Lit R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Is : is_lit Lit
Is1 : is_clause R
NEq : Clause = R -> false
============================
 or Lit Clause = or Lit R \/ (or Lit Clause = or Lit R -> false)
 < right.

Subgoal 2.1.1.2:

Variables: Clause Lit R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Is : is_lit Lit
Is1 : is_clause R
NEq : Clause = R -> false
============================
 or Lit Clause = or Lit R -> false
 < intros E.

Subgoal 2.1.1.2:

Variables: Clause Lit R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Is : is_lit Lit
Is1 : is_clause R
NEq : Clause = R -> false
E : or Lit Clause = or Lit R
============================
 false
 < case E.

Subgoal 2.1.1.2:

Variables: Lit R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit R) @
IsC3 : is_lit Lit
IsC4 : is_clause R *
Is : is_lit Lit
Is1 : is_clause R
NEq : R = R -> false
============================
 false
 < backchain NEq.

Subgoal 2.1.2:

Variables: Clause Lit L R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Is : is_lit L
Is1 : is_clause R
NEq : L = Lit -> false
============================
 or Lit Clause = or L R \/ (or Lit Clause = or L R -> false)
 < right.

Subgoal 2.1.2:

Variables: Clause Lit L R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Is : is_lit L
Is1 : is_clause R
NEq : L = Lit -> false
============================
 or Lit Clause = or L R -> false
 < intros E.

Subgoal 2.1.2:

Variables: Clause Lit L R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Is : is_lit L
Is1 : is_clause R
NEq : L = Lit -> false
E : or Lit Clause = or L R
============================
 false
 < case E.

Subgoal 2.1.2:

Variables: L R
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or L R) @
IsC3 : is_lit L
IsC4 : is_clause R *
Is : is_lit L
Is1 : is_clause R
NEq : L = L -> false
============================
 false
 < backchain NEq.

Subgoal 2.2:

Variables: C2 Clause Lit
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC2 : is_clause C2
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Form : (exists L R, or L R = C2) -> false
============================
 or Lit Clause = C2 \/ (or Lit Clause = C2 -> false)
 < right.

Subgoal 2.2:

Variables: C2 Clause Lit
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC2 : is_clause C2
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Form : (exists L R, or L R = C2) -> false
============================
 or Lit Clause = C2 -> false
 < intros E.

Subgoal 2.2:

Variables: C2 Clause Lit
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC2 : is_clause C2
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Form : (exists L R, or L R = C2) -> false
E : or Lit Clause = C2
============================
 false
 < case E.

Subgoal 2.2:

Variables: Clause Lit
IH : forall C1 C2,
       is_clause C1 * -> is_clause C2 -> C1 = C2 \/ (C1 = C2 -> false)
IsC1 : is_clause (or Lit Clause) @
IsC2 : is_clause (or Lit Clause)
IsC3 : is_lit Lit
IsC4 : is_clause Clause *
Form : (exists L R, or L R = or Lit Clause) -> false
============================
 false
 < backchain Form.

Proof completed.
 < Extensible_Theorem
      is_formula_empty_or_not : forall F,
         IsF : is_formula F ->
         F = emptyFormula \/
         (F = emptyFormula -> false)
      on IsF.

Subgoal 1:

IH : forall F, is_formula F * -> F = emptyFormula \/ (F = emptyFormula -> false)
IsF : is_formula emptyFormula @
============================
 emptyFormula = emptyFormula \/ (emptyFormula = emptyFormula -> false)
 < search.

Subgoal 2:

Variables: Formula Clause
IH : forall F, is_formula F * -> F = emptyFormula \/ (F = emptyFormula -> false)
IsF : is_formula (and Clause Formula) @
IsF1 : is_clause Clause
IsF2 : is_formula Formula *
============================
 and Clause Formula = emptyFormula \/
 (and Clause Formula = emptyFormula -> false)
 < search.

Proof completed.
 < Extensible_Theorem
      is_formula_and_or_not : forall F,
         IsF : is_formula F ->
         (exists C F', F = unsat_proofs:lrat:and C F') \/
         ((exists C F', F = unsat_proofs:lrat:and C F') -> false)
      on IsF.

Subgoal 1:

IH : forall F,
       is_formula F * -> (exists C F', F = and C F') \/
       ((exists C F', F = and C F') -> false)
IsF : is_formula emptyFormula @
============================
 (exists C F', emptyFormula = and C F') \/
 ((exists C F', emptyFormula = and C F') -> false)
 < search.

Subgoal 2:

Variables: Formula Clause
IH : forall F,
       is_formula F * -> (exists C F', F = and C F') \/
       ((exists C F', F = and C F') -> false)
IsF : is_formula (and Clause Formula) @
IsF1 : is_clause Clause
IsF2 : is_formula Formula *
============================
 (exists C F', and Clause Formula = and C F') \/
 ((exists C F', and Clause Formula = and C F') -> false)
 < search.

Proof completed.
 < Extensible_Theorem
      is_formula_eq_or_not : forall F1 F2,
         IsF1 : is_formula F1 ->
         IsF2 : is_formula F2 ->
         F1 = F2 \/
         (F1 = F2 -> false)
      on IsF1.

Subgoal 1:

Variables: F2
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula emptyFormula @
IsF2 : is_formula F2
============================
 emptyFormula = F2 \/ (emptyFormula = F2 -> false)
 < Or: apply is_formula_empty_or_not to IsF2.

Subgoal 1:

Variables: F2
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula emptyFormula @
IsF2 : is_formula F2
Or : F2 = emptyFormula \/ (F2 = emptyFormula -> false)
============================
 emptyFormula = F2 \/ (emptyFormula = F2 -> false)
 < N: case Or.

Subgoal 1.1:

IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula emptyFormula @
IsF2 : is_formula emptyFormula
============================
 emptyFormula = emptyFormula \/ (emptyFormula = emptyFormula -> false)
 < search.

Subgoal 1.2:

Variables: F2
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula emptyFormula @
IsF2 : is_formula F2
N : F2 = emptyFormula -> false
============================
 emptyFormula = F2 \/ (emptyFormula = F2 -> false)
 < right.

Subgoal 1.2:

Variables: F2
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula emptyFormula @
IsF2 : is_formula F2
N : F2 = emptyFormula -> false
============================
 emptyFormula = F2 -> false
 < intros E.

Subgoal 1.2:

Variables: F2
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula emptyFormula @
IsF2 : is_formula F2
N : F2 = emptyFormula -> false
E : emptyFormula = F2
============================
 false
 < case E.

Subgoal 1.2:

IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula emptyFormula @
IsF2 : is_formula emptyFormula
N : emptyFormula = emptyFormula -> false
============================
 false
 < backchain N.

Subgoal 2:

Variables: F2 Formula Clause
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF2 : is_formula F2
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
============================
 and Clause Formula = F2 \/ (and Clause Formula = F2 -> false)
 < Or: apply is_formula_and_or_not to IsF2.

Subgoal 2:

Variables: F2 Formula Clause
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF2 : is_formula F2
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
Or : (exists C F', F2 = and C F') \/ ((exists C F', F2 = and C F') -> false)
============================
 and Clause Formula = F2 \/ (and Clause Formula = F2 -> false)
 < N: case Or.

Subgoal 2.1:

Variables: Formula Clause C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF2 : is_formula (and C F')
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
============================
 and Clause Formula = and C F' \/ (and Clause Formula = and C F' -> false)
 < Is': case IsF2.

Subgoal 2.1:

Variables: Formula Clause C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
Is' : is_clause C
Is'1 : is_formula F'
============================
 and Clause Formula = and C F' \/ (and Clause Formula = and C F' -> false)
 < Or: apply is_clause_eq_or_not to IsF3 Is'.

Subgoal 2.1:

Variables: Formula Clause C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
Is' : is_clause C
Is'1 : is_formula F'
Or : Clause = C \/ (Clause = C -> false)
============================
 and Clause Formula = and C F' \/ (and Clause Formula = and C F' -> false)
 < N: case Or.

Subgoal 2.1.1:

Variables: Formula C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and C Formula) @
IsF3 : is_clause C
IsF4 : is_formula Formula *
Is' : is_clause C
Is'1 : is_formula F'
============================
 and C Formula = and C F' \/ (and C Formula = and C F' -> false)
 < Or: apply IH to IsF4 Is'1.

Subgoal 2.1.1:

Variables: Formula C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and C Formula) @
IsF3 : is_clause C
IsF4 : is_formula Formula *
Is' : is_clause C
Is'1 : is_formula F'
Or : Formula = F' \/ (Formula = F' -> false)
============================
 and C Formula = and C F' \/ (and C Formula = and C F' -> false)
 < N: case Or.

Subgoal 2.1.1.1:

Variables: C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and C F') @
IsF3 : is_clause C
IsF4 : is_formula F' *
Is' : is_clause C
Is'1 : is_formula F'
============================
 and C F' = and C F' \/ (and C F' = and C F' -> false)
 < search.

Subgoal 2.1.1.2:

Variables: Formula C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and C Formula) @
IsF3 : is_clause C
IsF4 : is_formula Formula *
Is' : is_clause C
Is'1 : is_formula F'
N : Formula = F' -> false
============================
 and C Formula = and C F' \/ (and C Formula = and C F' -> false)
 < right.

Subgoal 2.1.1.2:

Variables: Formula C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and C Formula) @
IsF3 : is_clause C
IsF4 : is_formula Formula *
Is' : is_clause C
Is'1 : is_formula F'
N : Formula = F' -> false
============================
 and C Formula = and C F' -> false
 < intros E.

Subgoal 2.1.1.2:

Variables: Formula C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and C Formula) @
IsF3 : is_clause C
IsF4 : is_formula Formula *
Is' : is_clause C
Is'1 : is_formula F'
N : Formula = F' -> false
E : and C Formula = and C F'
============================
 false
 < case E.

Subgoal 2.1.1.2:

Variables: C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and C F') @
IsF3 : is_clause C
IsF4 : is_formula F' *
Is' : is_clause C
Is'1 : is_formula F'
N : F' = F' -> false
============================
 false
 < backchain N.

Subgoal 2.1.2:

Variables: Formula Clause C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
Is' : is_clause C
Is'1 : is_formula F'
N : Clause = C -> false
============================
 and Clause Formula = and C F' \/ (and Clause Formula = and C F' -> false)
 < right.

Subgoal 2.1.2:

Variables: Formula Clause C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
Is' : is_clause C
Is'1 : is_formula F'
N : Clause = C -> false
============================
 and Clause Formula = and C F' -> false
 < intros E.

Subgoal 2.1.2:

Variables: Formula Clause C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
Is' : is_clause C
Is'1 : is_formula F'
N : Clause = C -> false
E : and Clause Formula = and C F'
============================
 false
 < case E.

Subgoal 2.1.2:

Variables: C F'
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and C F') @
IsF3 : is_clause C
IsF4 : is_formula F' *
Is' : is_clause C
Is'1 : is_formula F'
N : C = C -> false
============================
 false
 < backchain N.

Subgoal 2.2:

Variables: F2 Formula Clause
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF2 : is_formula F2
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
N : (exists C F', F2 = and C F') -> false
============================
 and Clause Formula = F2 \/ (and Clause Formula = F2 -> false)
 < right.

Subgoal 2.2:

Variables: F2 Formula Clause
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF2 : is_formula F2
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
N : (exists C F', F2 = and C F') -> false
============================
 and Clause Formula = F2 -> false
 < intros E.

Subgoal 2.2:

Variables: F2 Formula Clause
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF2 : is_formula F2
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
N : (exists C F', F2 = and C F') -> false
E : and Clause Formula = F2
============================
 false
 < case E.

Subgoal 2.2:

Variables: Formula Clause
IH : forall F1 F2,
       is_formula F1 * -> is_formula F2 -> F1 = F2 \/ (F1 = F2 -> false)
IsF1 : is_formula (and Clause Formula) @
IsF2 : is_formula (and Clause Formula)
IsF3 : is_clause Clause
IsF4 : is_formula Formula *
N : (exists C F', and Clause Formula = and C F') -> false
============================
 false
 < backchain N.

Proof completed.
 < Theorem is_list_integer_eq_or_not :
     forall L1 L2,
       is_list is_integer L1 -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false).

============================
 forall L1 L2,
   is_list is_integer L1 -> is_list is_integer L2 -> L1 = L2 \/
   (L1 = L2 -> false)
 < induction on 1.

IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
============================
 forall L1 L2,
   is_list is_integer L1 @ -> is_list is_integer L2 -> L1 = L2 \/
   (L1 = L2 -> false)
 < intros IsL1 IsL2.

Variables: L1 L2
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
IsL1 : is_list is_integer L1 @
IsL2 : is_list is_integer L2
============================
 L1 = L2 \/ (L1 = L2 -> false)
 < Is: case IsL1.

Subgoal 1:

Variables: L2
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
IsL2 : is_list is_integer L2
============================
 [] = L2 \/ ([] = L2 -> false)
 < Is': case IsL2.

Subgoal 1.1:

IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
============================
 [] = [] \/ ([] = [] -> false)
 < search.

Subgoal 1.2:

Variables: T H
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is' : is_integer H
Is'1 : is_list is_integer T
============================
 [] = H::T \/ ([] = H::T -> false)
 < search.

Subgoal 2:

Variables: L2 T H
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
IsL2 : is_list is_integer L2
Is : is_integer H
Is1 : is_list is_integer T *
============================
 H::T = L2 \/ (H::T = L2 -> false)
 < Is': case IsL2.

Subgoal 2.1:

Variables: T H
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H
Is1 : is_list is_integer T *
============================
 H::T = [] \/ (H::T = [] -> false)
 < search.

Subgoal 2.2:

Variables: T H T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H
Is1 : is_list is_integer T *
Is' : is_integer H1
Is'1 : is_list is_integer T1
============================
 H::T = H1::T1 \/ (H::T = H1::T1 -> false)
 < Or: apply is_integer_eq_or_not to Is Is'.

Subgoal 2.2:

Variables: T H T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H
Is1 : is_list is_integer T *
Is' : is_integer H1
Is'1 : is_list is_integer T1
Or : H = H1 \/ (H = H1 -> false)
============================
 H::T = H1::T1 \/ (H::T = H1::T1 -> false)
 < N: case Or.

Subgoal 2.2.1:

Variables: T T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H1
Is1 : is_list is_integer T *
Is' : is_integer H1
Is'1 : is_list is_integer T1
============================
 H1::T = H1::T1 \/ (H1::T = H1::T1 -> false)
 < Or: apply IH to Is1 Is'1.

Subgoal 2.2.1:

Variables: T T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H1
Is1 : is_list is_integer T *
Is' : is_integer H1
Is'1 : is_list is_integer T1
Or : T = T1 \/ (T = T1 -> false)
============================
 H1::T = H1::T1 \/ (H1::T = H1::T1 -> false)
 < N: case Or.

Subgoal 2.2.1.1:

Variables: T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H1
Is1 : is_list is_integer T1 *
Is' : is_integer H1
Is'1 : is_list is_integer T1
============================
 H1::T1 = H1::T1 \/ (H1::T1 = H1::T1 -> false)
 < search.

Subgoal 2.2.1.2:

Variables: T T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H1
Is1 : is_list is_integer T *
Is' : is_integer H1
Is'1 : is_list is_integer T1
N : T = T1 -> false
============================
 H1::T = H1::T1 \/ (H1::T = H1::T1 -> false)
 < right.

Subgoal 2.2.1.2:

Variables: T T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H1
Is1 : is_list is_integer T *
Is' : is_integer H1
Is'1 : is_list is_integer T1
N : T = T1 -> false
============================
 H1::T = H1::T1 -> false
 < intros E.

Subgoal 2.2.1.2:

Variables: T T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H1
Is1 : is_list is_integer T *
Is' : is_integer H1
Is'1 : is_list is_integer T1
N : T = T1 -> false
E : H1::T = H1::T1
============================
 false
 < case E.

Subgoal 2.2.1.2:

Variables: T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H1
Is1 : is_list is_integer T1 *
Is' : is_integer H1
Is'1 : is_list is_integer T1
N : T1 = T1 -> false
============================
 false
 < backchain N.

Subgoal 2.2.2:

Variables: T H T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H
Is1 : is_list is_integer T *
Is' : is_integer H1
Is'1 : is_list is_integer T1
N : H = H1 -> false
============================
 H::T = H1::T1 \/ (H::T = H1::T1 -> false)
 < right.

Subgoal 2.2.2:

Variables: T H T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H
Is1 : is_list is_integer T *
Is' : is_integer H1
Is'1 : is_list is_integer T1
N : H = H1 -> false
============================
 H::T = H1::T1 -> false
 < intros E.

Subgoal 2.2.2:

Variables: T H T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H
Is1 : is_list is_integer T *
Is' : is_integer H1
Is'1 : is_list is_integer T1
N : H = H1 -> false
E : H::T = H1::T1
============================
 false
 < case E.

Subgoal 2.2.2:

Variables: T1 H1
IH : forall L1 L2,
       is_list is_integer L1 * -> is_list is_integer L2 -> L1 = L2 \/
       (L1 = L2 -> false)
Is : is_integer H1
Is1 : is_list is_integer T1 *
Is' : is_integer H1
Is'1 : is_list is_integer T1
N : H1 = H1 -> false
============================
 false
 < backchain N.

Proof completed.
 < Theorem lookup_after_select :
     forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known ->
       lookup KRest ID' C' -> lookup Known ID' C'.

============================
 forall Known ID ID' C C' KRest,
   is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
     mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known ->
   lookup KRest ID' C' -> lookup Known ID' C'
 < induction on 4.

IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
============================
 forall Known ID ID' C C' KRest,
   is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
     mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known @ ->
   lookup KRest ID' C' -> lookup Known ID' C'
 < intros IsK IsID' GCL Slct Lkp.

Variables: Known ID ID' C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsK : is_list (is_pair is_integer is_clause) Known
IsID' : is_integer ID'
GCL : forall I C1 C2, mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2
Slct : select (ID, C) KRest Known @
Lkp : lookup KRest ID' C'
============================
 lookup Known ID' C'
 < Slct: case Slct.

Subgoal 1:

Variables: ID ID' C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsK : is_list (is_pair is_integer is_clause) ((ID, C)::KRest)
IsID' : is_integer ID'
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID' C'
============================
 lookup ((ID, C)::KRest) ID' C'
 < Is: case IsK.

Subgoal 1:

Variables: ID ID' C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID' C'
Is : is_pair is_integer is_clause (ID, C)
Is1 : is_list (is_pair is_integer is_clause) KRest
============================
 lookup ((ID, C)::KRest) ID' C'
 < Is: case Is.

Subgoal 1:

Variables: ID ID' C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID' C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
============================
 lookup ((ID, C)::KRest) ID' C'
 < Or: apply is_integer_eq_or_not to IsID' Is.

Subgoal 1:

Variables: ID ID' C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID' C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
Or : ID' = ID \/ (ID' = ID -> false)
============================
 lookup ((ID, C)::KRest) ID' C'
 < Eq: case Or.

Subgoal 1.1:

Variables: ID C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
============================
 lookup ((ID, C)::KRest) ID C'
 < M1: apply lookup_mem to Lkp.

Subgoal 1.1:

Variables: ID C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
M1 : mem (ID, C') KRest
============================
 lookup ((ID, C)::KRest) ID C'
 < M2: assert mem (ID, C') ((ID, C)::KRest).

Subgoal 1.1:

Variables: ID C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
M1 : mem (ID, C') KRest
M2 : mem (ID, C') ((ID, C)::KRest)
============================
 lookup ((ID, C)::KRest) ID C'
 < M3: assert mem (ID, C) ((ID, C)::KRest).

Subgoal 1.1:

Variables: ID C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
M1 : mem (ID, C') KRest
M2 : mem (ID, C') ((ID, C)::KRest)
M3 : mem (ID, C) ((ID, C)::KRest)
============================
 lookup ((ID, C)::KRest) ID C'
 < apply GCL to M2 M3.

Subgoal 1.1:

Variables: ID C KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID C
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
M1 : mem (ID, C) KRest
M2 : mem (ID, C) ((ID, C)::KRest)
M3 : mem (ID, C) ((ID, C)::KRest)
============================
 lookup ((ID, C)::KRest) ID C
 < search.

Subgoal 1.2:

Variables: ID ID' C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID' C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
Eq : ID' = ID -> false
============================
 lookup ((ID, C)::KRest) ID' C'
 < unfold .

Subgoal 1.2.1:

Variables: ID ID' C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID' C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
Eq : ID' = ID -> false
============================
 ID = ID' -> false
 < intros E.

Subgoal 1.2.1:

Variables: ID ID' C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID' C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
Eq : ID' = ID -> false
E : ID = ID'
============================
 false
 < case E.

Subgoal 1.2.1:

Variables: ID' C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I C1 C2,
        mem (I, C1) ((ID', C)::KRest) -> mem (I, C2) ((ID', C)::KRest) -> C1 = C2
Lkp : lookup KRest ID' C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID'
Is2 : is_clause C
Eq : ID' = ID' -> false
============================
 false
 < backchain Eq.

Subgoal 1.2.2:

Variables: ID ID' C C' KRest
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I C1 C2,
        mem (I, C1) ((ID, C)::KRest) -> mem (I, C2) ((ID, C)::KRest) -> C1 = C2
Lkp : lookup KRest ID' C'
Is1 : is_list (is_pair is_integer is_clause) KRest
Is : is_integer ID
Is2 : is_clause C
Eq : ID' = ID -> false
============================
 lookup KRest ID' C'
 < search.

Subgoal 2:

Variables: ID ID' C C' L2 I L1
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsK : is_list (is_pair is_integer is_clause) (I::L2)
IsID' : is_integer ID'
GCL : forall I1 C1 C2, mem (I1, C1) (I::L2) -> mem (I1, C2) (I::L2) -> C1 = C2
Lkp : lookup (I::L1) ID' C'
Slct : select (ID, C) L1 L2 *
============================
 lookup (I::L2) ID' C'
 < Is: case IsK.

Subgoal 2:

Variables: ID ID' C C' L2 I L1
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I1 C1 C2, mem (I1, C1) (I::L2) -> mem (I1, C2) (I::L2) -> C1 = C2
Lkp : lookup (I::L1) ID' C'
Slct : select (ID, C) L1 L2 *
Is : is_pair is_integer is_clause I
Is1 : is_list (is_pair is_integer is_clause) L2
============================
 lookup (I::L2) ID' C'
 < Lkp: case Lkp.

Subgoal 2.1:

Variables: ID ID' C C' L2 L1
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I1 C1 C2,
        mem (I1, C1) ((ID', C')::L2) -> mem (I1, C2) ((ID', C')::L2) -> C1 = C2
Slct : select (ID, C) L1 L2 *
Is : is_pair is_integer is_clause (ID', C')
Is1 : is_list (is_pair is_integer is_clause) L2
============================
 lookup ((ID', C')::L2) ID' C'
 < search.

Subgoal 2.2:

Variables: ID ID' C C' L2 L1 V K
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I1 C1 C2,
        mem (I1, C1) ((K, V)::L2) -> mem (I1, C2) ((K, V)::L2) -> C1 = C2
Slct : select (ID, C) L1 L2 *
Is : is_pair is_integer is_clause (K, V)
Is1 : is_list (is_pair is_integer is_clause) L2
Lkp : K = ID' -> false
Lkp1 : lookup L1 ID' C'
============================
 lookup ((K, V)::L2) ID' C'
 < assert forall I C1 C2,
     mem (I, C1) L2 -> mem (I, C2) L2 -> C1 = C2.

Subgoal 2.2.1:

Variables: ID ID' C C' L2 L1 V K
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I1 C1 C2,
        mem (I1, C1) ((K, V)::L2) -> mem (I1, C2) ((K, V)::L2) -> C1 = C2
Slct : select (ID, C) L1 L2 *
Is : is_pair is_integer is_clause (K, V)
Is1 : is_list (is_pair is_integer is_clause) L2
Lkp : K = ID' -> false
Lkp1 : lookup L1 ID' C'
============================
 forall I C1 C2, mem (I, C1) L2 -> mem (I, C2) L2 -> C1 = C2
 < intros MA MB.

Subgoal 2.2.1:

Variables: ID ID' C C' L2 L1 V K I1 C1 C2
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I1 C1 C2,
        mem (I1, C1) ((K, V)::L2) -> mem (I1, C2) ((K, V)::L2) -> C1 = C2
Slct : select (ID, C) L1 L2 *
Is : is_pair is_integer is_clause (K, V)
Is1 : is_list (is_pair is_integer is_clause) L2
Lkp : K = ID' -> false
Lkp1 : lookup L1 ID' C'
MA : mem (I1, C1) L2
MB : mem (I1, C2) L2
============================
 C1 = C2
 < MA': assert mem (I1, C1) ((K, V)::L2).

Subgoal 2.2.1:

Variables: ID ID' C C' L2 L1 V K I1 C1 C2
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I1 C1 C2,
        mem (I1, C1) ((K, V)::L2) -> mem (I1, C2) ((K, V)::L2) -> C1 = C2
Slct : select (ID, C) L1 L2 *
Is : is_pair is_integer is_clause (K, V)
Is1 : is_list (is_pair is_integer is_clause) L2
Lkp : K = ID' -> false
Lkp1 : lookup L1 ID' C'
MA : mem (I1, C1) L2
MB : mem (I1, C2) L2
MA' : mem (I1, C1) ((K, V)::L2)
============================
 C1 = C2
 < MB': assert mem (I1, C2) ((K, V)::L2).

Subgoal 2.2.1:

Variables: ID ID' C C' L2 L1 V K I1 C1 C2
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I1 C1 C2,
        mem (I1, C1) ((K, V)::L2) -> mem (I1, C2) ((K, V)::L2) -> C1 = C2
Slct : select (ID, C) L1 L2 *
Is : is_pair is_integer is_clause (K, V)
Is1 : is_list (is_pair is_integer is_clause) L2
Lkp : K = ID' -> false
Lkp1 : lookup L1 ID' C'
MA : mem (I1, C1) L2
MB : mem (I1, C2) L2
MA' : mem (I1, C1) ((K, V)::L2)
MB' : mem (I1, C2) ((K, V)::L2)
============================
 C1 = C2
 < apply GCL to MA' MB'.

Subgoal 2.2.1:

Variables: ID ID' C C' L2 L1 V K I1 C2
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I1 C1 C2,
        mem (I1, C1) ((K, V)::L2) -> mem (I1, C2) ((K, V)::L2) -> C1 = C2
Slct : select (ID, C) L1 L2 *
Is : is_pair is_integer is_clause (K, V)
Is1 : is_list (is_pair is_integer is_clause) L2
Lkp : K = ID' -> false
Lkp1 : lookup L1 ID' C'
MA : mem (I1, C2) L2
MB : mem (I1, C2) L2
MA' : mem (I1, C2) ((K, V)::L2)
MB' : mem (I1, C2) ((K, V)::L2)
============================
 C2 = C2
 < search.

Subgoal 2.2:

Variables: ID ID' C C' L2 L1 V K
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I1 C1 C2,
        mem (I1, C1) ((K, V)::L2) -> mem (I1, C2) ((K, V)::L2) -> C1 = C2
Slct : select (ID, C) L1 L2 *
Is : is_pair is_integer is_clause (K, V)
Is1 : is_list (is_pair is_integer is_clause) L2
Lkp : K = ID' -> false
Lkp1 : lookup L1 ID' C'
H1 : forall I C1 C2, mem (I, C1) L2 -> mem (I, C2) L2 -> C1 = C2
============================
 lookup ((K, V)::L2) ID' C'
 < apply IH to Is1 IsID' _ Slct Lkp1.

Subgoal 2.2:

Variables: ID ID' C C' L2 L1 V K
IH : forall Known ID ID' C C' KRest,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID' -> (forall I C1 C2,
         mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2) -> select (ID, C) KRest Known * ->
       lookup KRest ID' C' -> lookup Known ID' C'
IsID' : is_integer ID'
GCL : forall I1 C1 C2,
        mem (I1, C1) ((K, V)::L2) -> mem (I1, C2) ((K, V)::L2) -> C1 = C2
Slct : select (ID, C) L1 L2 *
Is : is_pair is_integer is_clause (K, V)
Is1 : is_list (is_pair is_integer is_clause) L2
Lkp : K = ID' -> false
Lkp1 : lookup L1 ID' C'
H1 : forall I C1 C2, mem (I, C1) L2 -> mem (I, C2) L2 -> C1 = C2
H2 : lookup L2 ID' C'
============================
 lookup ((K, V)::L2) ID' C'
 < search.

Proof completed.
 < Theorem mem_is :
     forall Known (IDC : pair integer clause),
       is_list (is_pair is_integer is_clause) Known -> mem IDC Known -> exists ID C,
         (IDC = (ID, C) /\ is_integer ID) /\ is_clause C.

============================
 forall Known IDC,
   is_list (is_pair is_integer is_clause) Known -> mem IDC Known -> exists ID C,
     (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
 < induction on 2.

IH : forall Known IDC,
       is_list (is_pair is_integer is_clause) Known -> mem IDC Known * -> exists ID C,
         (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
============================
 forall Known IDC,
   is_list (is_pair is_integer is_clause) Known -> mem IDC Known @ -> exists ID C,
     (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
 < intros Is Mem.

Variables: Known IDC
IH : forall Known IDC,
       is_list (is_pair is_integer is_clause) Known -> mem IDC Known * -> exists ID C,
         (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
Is : is_list (is_pair is_integer is_clause) Known
Mem : mem IDC Known @
============================
 exists ID C, (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
 < Mem: case Mem.

Subgoal 1:

Variables: IDC Rest
IH : forall Known IDC,
       is_list (is_pair is_integer is_clause) Known -> mem IDC Known * -> exists ID C,
         (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
Is : is_list (is_pair is_integer is_clause) (IDC::Rest)
============================
 exists ID C, (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
 < Is: case Is.

Subgoal 1:

Variables: IDC Rest
IH : forall Known IDC,
       is_list (is_pair is_integer is_clause) Known -> mem IDC Known * -> exists ID C,
         (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
Is : is_pair is_integer is_clause IDC
Is1 : is_list (is_pair is_integer is_clause) Rest
============================
 exists ID C, (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
 < case Is.

Subgoal 1:

Variables: Rest B A
IH : forall Known IDC,
       is_list (is_pair is_integer is_clause) Known -> mem IDC Known * -> exists ID C,
         (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
Is1 : is_list (is_pair is_integer is_clause) Rest
H1 : is_integer A
H2 : is_clause B
============================
 exists ID C, ((A, B) = (ID, C) /\ is_integer ID) /\ is_clause C
 < search.

Subgoal 2:

Variables: IDC Rest I
IH : forall Known IDC,
       is_list (is_pair is_integer is_clause) Known -> mem IDC Known * -> exists ID C,
         (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
Is : is_list (is_pair is_integer is_clause) (I::Rest)
Mem : mem IDC Rest *
============================
 exists ID C, (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
 < Is: case Is.

Subgoal 2:

Variables: IDC Rest I
IH : forall Known IDC,
       is_list (is_pair is_integer is_clause) Known -> mem IDC Known * -> exists ID C,
         (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
Mem : mem IDC Rest *
Is : is_pair is_integer is_clause I
Is1 : is_list (is_pair is_integer is_clause) Rest
============================
 exists ID C, (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
 < apply IH to _ Mem.

Subgoal 2:

Variables: Rest I ID C
IH : forall Known IDC,
       is_list (is_pair is_integer is_clause) Known -> mem IDC Known * -> exists ID C,
         (IDC = (ID, C) /\ is_integer ID) /\ is_clause C
Mem : mem (ID, C) Rest *
Is : is_pair is_integer is_clause I
Is1 : is_list (is_pair is_integer is_clause) Rest
H1 : is_integer ID
H2 : is_clause C
============================
 exists ID1 C1, ((ID, C) = (ID1, C1) /\ is_integer ID1) /\ is_clause C1
 < search.

Proof completed.
 < Theorem mem_is_lit :
     forall Assignment L,
       is_list is_lit Assignment -> mem L Assignment -> is_lit L.

============================
 forall Assignment L, is_list is_lit Assignment -> mem L Assignment -> is_lit L
 < induction on 2.

IH : forall Assignment L,
       is_list is_lit Assignment -> mem L Assignment * -> is_lit L
============================
 forall Assignment L,
   is_list is_lit Assignment -> mem L Assignment @ -> is_lit L
 < intros Is Mem.

Variables: Assignment L
IH : forall Assignment L,
       is_list is_lit Assignment -> mem L Assignment * -> is_lit L
Is : is_list is_lit Assignment
Mem : mem L Assignment @
============================
 is_lit L
 < Mem: case Mem.

Subgoal 1:

Variables: L Rest
IH : forall Assignment L,
       is_list is_lit Assignment -> mem L Assignment * -> is_lit L
Is : is_list is_lit (L::Rest)
============================
 is_lit L
 < Is: case Is.

Subgoal 1:

Variables: L Rest
IH : forall Assignment L,
       is_list is_lit Assignment -> mem L Assignment * -> is_lit L
Is : is_lit L
Is1 : is_list is_lit Rest
============================
 is_lit L
 < search.

Subgoal 2:

Variables: L Rest I
IH : forall Assignment L,
       is_list is_lit Assignment -> mem L Assignment * -> is_lit L
Is : is_list is_lit (I::Rest)
Mem : mem L Rest *
============================
 is_lit L
 < Is: case Is.

Subgoal 2:

Variables: L Rest I
IH : forall Assignment L,
       is_list is_lit Assignment -> mem L Assignment * -> is_lit L
Mem : mem L Rest *
Is : is_lit I
Is1 : is_list is_lit Rest
============================
 is_lit L
 < apply IH to _ Mem.

Subgoal 2:

Variables: L Rest I
IH : forall Assignment L,
       is_list is_lit Assignment -> mem L Assignment * -> is_lit L
Mem : mem L Rest *
Is : is_lit I
Is1 : is_list is_lit Rest
H1 : is_lit L
============================
 is_lit L
 < search.

Proof completed.
 < Theorem select_is :
     forall Known KRest IDC,
       is_list (is_pair is_integer is_clause) Known -> select IDC KRest Known ->
       is_list (is_pair is_integer is_clause) KRest.

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

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

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

Subgoal 1:

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

Subgoal 1:

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

Subgoal 2:

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

Subgoal 2:

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

Subgoal 2:

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

Proof completed.
 < Theorem select_is_picked :
     forall Known IDC KRest,
       is_list (is_pair is_integer is_clause) Known -> select IDC KRest Known ->
       is_pair is_integer is_clause IDC.

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

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

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

Subgoal 1:

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

Subgoal 1:

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

Subgoal 2:

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

Subgoal 2:

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

Subgoal 2:

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

Proof completed.
 < Theorem is_list_lit_mem_or_not :
     forall A L, is_list is_lit A -> is_lit L -> mem L A \/ (mem L A -> false).

============================
 forall A L, is_list is_lit A -> is_lit L -> mem L A \/ (mem L A -> false)
 < induction on 1.

IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
============================
 forall A L, is_list is_lit A @ -> is_lit L -> mem L A \/ (mem L A -> false)
 < intros IsA IsL.

Variables: A L
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsA : is_list is_lit A @
IsL : is_lit L
============================
 mem L A \/ (mem L A -> false)
 < IsA: case IsA.

Subgoal 1:

Variables: L
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
============================
 mem L [] \/ (mem L [] -> false)
 < right.

Subgoal 1:

Variables: L
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
============================
 mem L [] -> false
 < intros M.

Subgoal 1:

Variables: L
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
M : mem L []
============================
 false
 < case M.

Subgoal 2:

Variables: L T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
IsA : is_lit H
IsA1 : is_list is_lit T *
============================
 mem L (H::T) \/ (mem L (H::T) -> false)
 < Or: apply is_lit_eq_or_not to IsL IsA.

Subgoal 2:

Variables: L T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
IsA : is_lit H
IsA1 : is_list is_lit T *
Or : L = H \/ (L = H -> false)
============================
 mem L (H::T) \/ (mem L (H::T) -> false)
 < EqL: case Or.

Subgoal 2.1:

Variables: T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit H
IsA : is_lit H
IsA1 : is_list is_lit T *
============================
 mem H (H::T) \/ (mem H (H::T) -> false)
 < search.

Subgoal 2.2:

Variables: L T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
IsA : is_lit H
IsA1 : is_list is_lit T *
EqL : L = H -> false
============================
 mem L (H::T) \/ (mem L (H::T) -> false)
 < Or: apply IH to IsA1 IsL.

Subgoal 2.2:

Variables: L T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
IsA : is_lit H
IsA1 : is_list is_lit T *
EqL : L = H -> false
Or : mem L T \/ (mem L T -> false)
============================
 mem L (H::T) \/ (mem L (H::T) -> false)
 < MemRest: case Or.

Subgoal 2.2.1:

Variables: L T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
IsA : is_lit H
IsA1 : is_list is_lit T *
EqL : L = H -> false
MemRest : mem L T
============================
 mem L (H::T) \/ (mem L (H::T) -> false)
 < search.

Subgoal 2.2.2:

Variables: L T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
IsA : is_lit H
IsA1 : is_list is_lit T *
EqL : L = H -> false
MemRest : mem L T -> false
============================
 mem L (H::T) \/ (mem L (H::T) -> false)
 < right.

Subgoal 2.2.2:

Variables: L T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
IsA : is_lit H
IsA1 : is_list is_lit T *
EqL : L = H -> false
MemRest : mem L T -> false
============================
 mem L (H::T) -> false
 < intros Mem.

Subgoal 2.2.2:

Variables: L T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
IsA : is_lit H
IsA1 : is_list is_lit T *
EqL : L = H -> false
MemRest : mem L T -> false
Mem : mem L (H::T)
============================
 false
 < Mem: case Mem.

Subgoal 2.2.2.1:

Variables: T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit H
IsA : is_lit H
IsA1 : is_list is_lit T *
EqL : H = H -> false
MemRest : mem H T -> false
============================
 false
 < backchain EqL.

Subgoal 2.2.2.2:

Variables: L T H
IH : forall A L, is_list is_lit A * -> is_lit L -> mem L A \/ (mem L A -> false)
IsL : is_lit L
IsA : is_lit H
IsA1 : is_list is_lit T *
EqL : L = H -> false
MemRest : mem L T -> false
Mem : mem L T
============================
 false
 < backchain MemRest.

Proof completed.
 < Theorem is_list_lit_subset_or_not :
     forall A B,
       is_list is_lit A -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false)).

============================
 forall A B,
   is_list is_lit A -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
   (exists X, mem X A /\ (mem X B -> false))
 < induction on 1.

IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
============================
 forall A B,
   is_list is_lit A @ -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
   (exists X, mem X A /\ (mem X B -> false))
 < intros IsA IsB.

Variables: A B
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsA : is_list is_lit A @
IsB : is_list is_lit B
============================
 (forall X, mem X A -> mem X B) \/ (exists X, mem X A /\ (mem X B -> false))
 < IsA: case IsA.

Subgoal 1:

Variables: B
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
============================
 (forall X, mem X [] -> mem X B) \/ (exists X, mem X [] /\ (mem X B -> false))
 < left.

Subgoal 1:

Variables: B
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
============================
 forall X, mem X [] -> mem X B
 < intros M.

Subgoal 1:

Variables: B X
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
M : mem X []
============================
 mem X B
 < case M.

Subgoal 2:

Variables: B T H
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
============================
 (forall X, mem X (H::T) -> mem X B) \/
 (exists X, mem X (H::T) /\ (mem X B -> false))
 < Or: apply is_list_lit_mem_or_not to IsB IsA.

Subgoal 2:

Variables: B T H
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
Or : mem H B \/ (mem H B -> false)
============================
 (forall X, mem X (H::T) -> mem X B) \/
 (exists X, mem X (H::T) /\ (mem X B -> false))
 < M: case Or.

Subgoal 2.1:

Variables: B T H
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B
============================
 (forall X, mem X (H::T) -> mem X B) \/
 (exists X, mem X (H::T) /\ (mem X B -> false))
 < Or: apply IH to IsA1 IsB.

Subgoal 2.1:

Variables: B T H
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B
Or : (forall X, mem X T -> mem X B) \/ (exists X, mem X T /\ (mem X B -> false))
============================
 (forall X, mem X (H::T) -> mem X B) \/
 (exists X, mem X (H::T) /\ (mem X B -> false))
 < Sub: case Or.

Subgoal 2.1.1:

Variables: B T H
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B
Sub : forall X, mem X T -> mem X B
============================
 (forall X, mem X (H::T) -> mem X B) \/
 (exists X, mem X (H::T) /\ (mem X B -> false))
 < left.

Subgoal 2.1.1:

Variables: B T H
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B
Sub : forall X, mem X T -> mem X B
============================
 forall X, mem X (H::T) -> mem X B
 < intros Mem.

Subgoal 2.1.1:

Variables: B T H X
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B
Sub : forall X, mem X T -> mem X B
Mem : mem X (H::T)
============================
 mem X B
 < Mem: case Mem.

Subgoal 2.1.1.1:

Variables: B T H
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B
Sub : forall X, mem X T -> mem X B
============================
 mem H B
 < search.

Subgoal 2.1.1.2:

Variables: B T H X
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B
Sub : forall X, mem X T -> mem X B
Mem : mem X T
============================
 mem X B
 < backchain Sub.

Subgoal 2.1.2:

Variables: B T H X
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B
Sub : mem X T
Sub1 : mem X B -> false
============================
 (forall X, mem X (H::T) -> mem X B) \/
 (exists X, mem X (H::T) /\ (mem X B -> false))
 < right.

Subgoal 2.1.2:

Variables: B T H X
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B
Sub : mem X T
Sub1 : mem X B -> false
============================
 exists X, mem X (H::T) /\ (mem X B -> false)
 < search.

Subgoal 2.2:

Variables: B T H
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B -> false
============================
 (forall X, mem X (H::T) -> mem X B) \/
 (exists X, mem X (H::T) /\ (mem X B -> false))
 < right.

Subgoal 2.2:

Variables: B T H
IH : forall A B,
       is_list is_lit A * -> is_list is_lit B -> (forall X, mem X A -> mem X B) \/
       (exists X, mem X A /\ (mem X B -> false))
IsB : is_list is_lit B
IsA : is_lit H
IsA1 : is_list is_lit T *
M : mem H B -> false
============================
 exists X, mem X (H::T) /\ (mem X B -> false)
 < search.

Proof completed.
 < Theorem is_list_mem_lookup :
     forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known -> is_integer ID ->
       exists C', lookup Known ID C'.

============================
 forall Known ID C,
   is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known -> is_integer ID ->
   exists C', lookup Known ID C'
 < induction on 2.

IH : forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known * -> is_integer ID ->
       exists C', lookup Known ID C'
============================
 forall Known ID C,
   is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known @ -> is_integer ID ->
   exists C', lookup Known ID C'
 < intros IsK Mem IsID.

Variables: Known ID C
IH : forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known * -> is_integer ID ->
       exists C', lookup Known ID C'
IsK : is_list (is_pair is_integer is_clause) Known
Mem : mem (ID, C) Known @
IsID : is_integer ID
============================
 exists C', lookup Known ID C'
 < Mem: case Mem.

Subgoal 1:

Variables: ID C Rest
IH : forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known * -> is_integer ID ->
       exists C', lookup Known ID C'
IsK : is_list (is_pair is_integer is_clause) ((ID, C)::Rest)
IsID : is_integer ID
============================
 exists C', lookup ((ID, C)::Rest) ID C'
 < search.

Subgoal 2:

Variables: ID C Rest I
IH : forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known * -> is_integer ID ->
       exists C', lookup Known ID C'
IsK : is_list (is_pair is_integer is_clause) (I::Rest)
IsID : is_integer ID
Mem : mem (ID, C) Rest *
============================
 exists C', lookup (I::Rest) ID C'
 < Is: case IsK.

Subgoal 2:

Variables: ID C Rest I
IH : forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known * -> is_integer ID ->
       exists C', lookup Known ID C'
IsID : is_integer ID
Mem : mem (ID, C) Rest *
Is : is_pair is_integer is_clause I
Is1 : is_list (is_pair is_integer is_clause) Rest
============================
 exists C', lookup (I::Rest) ID C'
 < Is: case Is.

Subgoal 2:

Variables: ID C Rest B A
IH : forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known * -> is_integer ID ->
       exists C', lookup Known ID C'
IsID : is_integer ID
Mem : mem (ID, C) Rest *
Is1 : is_list (is_pair is_integer is_clause) Rest
Is : is_integer A
Is2 : is_clause B
============================
 exists C', lookup ((A, B)::Rest) ID C'
 < Or: apply is_integer_eq_or_not to Is IsID.

Subgoal 2:

Variables: ID C Rest B A
IH : forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known * -> is_integer ID ->
       exists C', lookup Known ID C'
IsID : is_integer ID
Mem : mem (ID, C) Rest *
Is1 : is_list (is_pair is_integer is_clause) Rest
Is : is_integer A
Is2 : is_clause B
Or : A = ID \/ (A = ID -> false)
============================
 exists C', lookup ((A, B)::Rest) ID C'
 < Eq: case Or.

Subgoal 2.1:

Variables: ID C Rest B
IH : forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known * -> is_integer ID ->
       exists C', lookup Known ID C'
IsID : is_integer ID
Mem : mem (ID, C) Rest *
Is1 : is_list (is_pair is_integer is_clause) Rest
Is : is_integer ID
Is2 : is_clause B
============================
 exists C', lookup ((ID, B)::Rest) ID C'
 < search.

Subgoal 2.2:

Variables: ID C Rest B A
IH : forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known * -> is_integer ID ->
       exists C', lookup Known ID C'
IsID : is_integer ID
Mem : mem (ID, C) Rest *
Is1 : is_list (is_pair is_integer is_clause) Rest
Is : is_integer A
Is2 : is_clause B
Eq : A = ID -> false
============================
 exists C', lookup ((A, B)::Rest) ID C'
 < apply IH to Is1 Mem IsID.

Subgoal 2.2:

Variables: ID C Rest B A C'
IH : forall Known ID C,
       is_list (is_pair is_integer is_clause) Known -> mem (ID, C) Known * -> is_integer ID ->
       exists C', lookup Known ID C'
IsID : is_integer ID
Mem : mem (ID, C) Rest *
Is1 : is_list (is_pair is_integer is_clause) Rest
Is : is_integer A
Is2 : is_clause B
Eq : A = ID -> false
H1 : lookup Rest ID C'
============================
 exists C', lookup ((A, B)::Rest) ID C'
 < search.

Proof completed.
 < Theorem lookup_is_value :
     forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C -> is_clause C.

============================
 forall K ID C,
   is_list (is_pair is_integer is_clause) K -> lookup K ID C -> is_clause C
 < induction on 2.

IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_clause C
============================
 forall K ID C,
   is_list (is_pair is_integer is_clause) K -> lookup K ID C @ -> is_clause C
 < intros IsK Lkp.

Variables: K ID C
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_clause C
IsK : is_list (is_pair is_integer is_clause) K
Lkp : lookup K ID C @
============================
 is_clause C
 < Lkp: case Lkp.

Subgoal 1:

Variables: ID C Rest
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_clause C
IsK : is_list (is_pair is_integer is_clause) ((ID, C)::Rest)
============================
 is_clause C
 < Is: case IsK.

Subgoal 1:

Variables: ID C Rest
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_clause C
Is : is_pair is_integer is_clause (ID, C)
Is1 : is_list (is_pair is_integer is_clause) Rest
============================
 is_clause C
 < case Is.

Subgoal 1:

Variables: ID C Rest
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_clause C
Is1 : is_list (is_pair is_integer is_clause) Rest
H1 : is_integer ID
H2 : is_clause C
============================
 is_clause C
 < search.

Subgoal 2:

Variables: ID C Rest V K1
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_clause C
IsK : is_list (is_pair is_integer is_clause) ((K1, V)::Rest)
Lkp : K1 = ID -> false
Lkp1 : lookup Rest ID C *
============================
 is_clause C
 < Is: case IsK.

Subgoal 2:

Variables: ID C Rest V K1
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_clause C
Lkp : K1 = ID -> false
Lkp1 : lookup Rest ID C *
Is : is_pair is_integer is_clause (K1, V)
Is1 : is_list (is_pair is_integer is_clause) Rest
============================
 is_clause C
 < apply IH to Is1 Lkp1.

Subgoal 2:

Variables: ID C Rest V K1
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_clause C
Lkp : K1 = ID -> false
Lkp1 : lookup Rest ID C *
Is : is_pair is_integer is_clause (K1, V)
Is1 : is_list (is_pair is_integer is_clause) Rest
H1 : is_clause C
============================
 is_clause C
 < search.

Proof completed.
 < Theorem lookup_is_key :
     forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C -> is_integer ID.

============================
 forall K ID C,
   is_list (is_pair is_integer is_clause) K -> lookup K ID C -> is_integer ID
 < induction on 2.

IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_integer ID
============================
 forall K ID C,
   is_list (is_pair is_integer is_clause) K -> lookup K ID C @ -> is_integer ID
 < intros IsK Lkp.

Variables: K ID C
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_integer ID
IsK : is_list (is_pair is_integer is_clause) K
Lkp : lookup K ID C @
============================
 is_integer ID
 < Lkp: case Lkp.

Subgoal 1:

Variables: ID C Rest
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_integer ID
IsK : is_list (is_pair is_integer is_clause) ((ID, C)::Rest)
============================
 is_integer ID
 < Is: case IsK.

Subgoal 1:

Variables: ID C Rest
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_integer ID
Is : is_pair is_integer is_clause (ID, C)
Is1 : is_list (is_pair is_integer is_clause) Rest
============================
 is_integer ID
 < case Is.

Subgoal 1:

Variables: ID C Rest
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_integer ID
Is1 : is_list (is_pair is_integer is_clause) Rest
H1 : is_integer ID
H2 : is_clause C
============================
 is_integer ID
 < search.

Subgoal 2:

Variables: ID C Rest V K1
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_integer ID
IsK : is_list (is_pair is_integer is_clause) ((K1, V)::Rest)
Lkp : K1 = ID -> false
Lkp1 : lookup Rest ID C *
============================
 is_integer ID
 < Is: case IsK.

Subgoal 2:

Variables: ID C Rest V K1
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_integer ID
Lkp : K1 = ID -> false
Lkp1 : lookup Rest ID C *
Is : is_pair is_integer is_clause (K1, V)
Is1 : is_list (is_pair is_integer is_clause) Rest
============================
 is_integer ID
 < apply IH to Is1 Lkp1.

Subgoal 2:

Variables: ID C Rest V K1
IH : forall K ID C,
       is_list (is_pair is_integer is_clause) K -> lookup K ID C * -> is_integer ID
Lkp : K1 = ID -> false
Lkp1 : lookup Rest ID C *
Is : is_pair is_integer is_clause (K1, V)
Is1 : is_list (is_pair is_integer is_clause) Rest
H1 : is_integer ID
============================
 is_integer ID
 < search.

Proof completed.
 < Theorem is_pair_eq_or_not :
     forall (PB : pair integer clause) (PA : pair integer clause),
       is_pair is_integer is_clause PA -> is_pair is_integer is_clause PB -> PA = PB \/
       (PA = PB -> false).

============================
 forall PB PA,
   is_pair is_integer is_clause PA -> is_pair is_integer is_clause PB -> PA = PB \/
   (PA = PB -> false)
 < intros IsPA IsPB.

Variables: PB PA
IsPA : is_pair is_integer is_clause PA
IsPB : is_pair is_integer is_clause PB
============================
 PA = PB \/ (PA = PB -> false)
 < IsA: case IsPA.

Variables: PB B A
IsPB : is_pair is_integer is_clause PB
IsA : is_integer A
IsA1 : is_clause B
============================
 (A, B) = PB \/ ((A, B) = PB -> false)
 < IsB: case IsPB.

Variables: B A B1 A1
IsA : is_integer A
IsA1 : is_clause B
IsB : is_integer A1
IsB1 : is_clause B1
============================
 (A, B) = (A1, B1) \/ ((A, B) = (A1, B1) -> false)
 < Or: apply is_integer_eq_or_not to IsA IsB.

Variables: B A B1 A1
IsA : is_integer A
IsA1 : is_clause B
IsB : is_integer A1
IsB1 : is_clause B1
Or : A = A1 \/ (A = A1 -> false)
============================
 (A, B) = (A1, B1) \/ ((A, B) = (A1, B1) -> false)
 < Eq: case Or.

Subgoal 1:

Variables: B B1 A1
IsA : is_integer A1
IsA1 : is_clause B
IsB : is_integer A1
IsB1 : is_clause B1
============================
 (A1, B) = (A1, B1) \/ ((A1, B) = (A1, B1) -> false)
 < Or: apply is_clause_eq_or_not to IsA1 IsB1.

Subgoal 1:

Variables: B B1 A1
IsA : is_integer A1
IsA1 : is_clause B
IsB : is_integer A1
IsB1 : is_clause B1
Or : B = B1 \/ (B = B1 -> false)
============================
 (A1, B) = (A1, B1) \/ ((A1, B) = (A1, B1) -> false)
 < Eq: case Or.

Subgoal 1.1:

Variables: B1 A1
IsA : is_integer A1
IsA1 : is_clause B1
IsB : is_integer A1
IsB1 : is_clause B1
============================
 (A1, B1) = (A1, B1) \/ ((A1, B1) = (A1, B1) -> false)
 < search.

Subgoal 1.2:

Variables: B B1 A1
IsA : is_integer A1
IsA1 : is_clause B
IsB : is_integer A1
IsB1 : is_clause B1
Eq : B = B1 -> false
============================
 (A1, B) = (A1, B1) \/ ((A1, B) = (A1, B1) -> false)
 < right.

Subgoal 1.2:

Variables: B B1 A1
IsA : is_integer A1
IsA1 : is_clause B
IsB : is_integer A1
IsB1 : is_clause B1
Eq : B = B1 -> false
============================
 (A1, B) = (A1, B1) -> false
 < intros E.

Subgoal 1.2:

Variables: B B1 A1
IsA : is_integer A1
IsA1 : is_clause B
IsB : is_integer A1
IsB1 : is_clause B1
Eq : B = B1 -> false
E : (A1, B) = (A1, B1)
============================
 false
 < case E.

Subgoal 1.2:

Variables: B1 A1
IsA : is_integer A1
IsA1 : is_clause B1
IsB : is_integer A1
IsB1 : is_clause B1
Eq : B1 = B1 -> false
============================
 false
 < backchain Eq.

Subgoal 2:

Variables: B A B1 A1
IsA : is_integer A
IsA1 : is_clause B
IsB : is_integer A1
IsB1 : is_clause B1
Eq : A = A1 -> false
============================
 (A, B) = (A1, B1) \/ ((A, B) = (A1, B1) -> false)
 < right.

Subgoal 2:

Variables: B A B1 A1
IsA : is_integer A
IsA1 : is_clause B
IsB : is_integer A1
IsB1 : is_clause B1
Eq : A = A1 -> false
============================
 (A, B) = (A1, B1) -> false
 < intros E.

Subgoal 2:

Variables: B A B1 A1
IsA : is_integer A
IsA1 : is_clause B
IsB : is_integer A1
IsB1 : is_clause B1
Eq : A = A1 -> false
E : (A, B) = (A1, B1)
============================
 false
 < case E.

Subgoal 2:

Variables: B1 A1
IsA : is_integer A1
IsA1 : is_clause B1
IsB : is_integer A1
IsB1 : is_clause B1
Eq : A1 = A1 -> false
============================
 false
 < backchain Eq.

Proof completed.
 < Theorem is_count_exists :
     forall L IDC,
       is_list (is_pair is_integer is_clause) L -> is_pair is_integer is_clause IDC ->
       exists N, count IDC L N.

============================
 forall L IDC,
   is_list (is_pair is_integer is_clause) L -> is_pair is_integer is_clause IDC ->
   exists N, count IDC L N
 < induction on 1.

IH : forall L IDC,
       is_list (is_pair is_integer is_clause) L * -> is_pair is_integer is_clause IDC ->
       exists N, count IDC L N
============================
 forall L IDC,
   is_list (is_pair is_integer is_clause) L @ -> is_pair is_integer is_clause IDC ->
   exists N, count IDC L N
 < intros IsL IsIDC.

Variables: L IDC
IH : forall L IDC,
       is_list (is_pair is_integer is_clause) L * -> is_pair is_integer is_clause IDC ->
       exists N, count IDC L N
IsL : is_list (is_pair is_integer is_clause) L @
IsIDC : is_pair is_integer is_clause IDC
============================
 exists N, count IDC L N
 < Is: case IsL.

Subgoal 1:

Variables: IDC
IH : forall L IDC,
       is_list (is_pair is_integer is_clause) L * -> is_pair is_integer is_clause IDC ->
       exists N, count IDC L N
IsIDC : is_pair is_integer is_clause IDC
============================
 exists N, count IDC [] N
 < search.

Subgoal 2:

Variables: IDC T H
IH : forall L IDC,
       is_list (is_pair is_integer is_clause) L * -> is_pair is_integer is_clause IDC ->
       exists N, count IDC L N
IsIDC : is_pair is_integer is_clause IDC
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
============================
 exists N, count IDC (H::T) N
 < Or: apply is_pair_eq_or_not to IsIDC Is.

Subgoal 2:

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

Subgoal 2:

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

Subgoal 2.1:

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

Subgoal 2.1:

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

Subgoal 2.1:

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

Subgoal 2.2:

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

Proof completed.
 < Theorem all_count_0_nil :
     forall L,
       is_list (is_pair is_integer is_clause) L -> (forall X N,
         count X L N -> N = 0) -> L = [].

============================
 forall L,
   is_list (is_pair is_integer is_clause) L -> (forall X N,
     count X L N -> N = 0) -> L = []
 < intros IsL Count0.

Variables: L
IsL : is_list (is_pair is_integer is_clause) L
Count0 : forall X N, count X L N -> N = 0
============================
 L = []
 < Is: case IsL.

Subgoal 1:

Count0 : forall X N, count X [] N -> N = 0
============================
 [] = []
 < search.

Subgoal 2:

Variables: T H
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
============================
 H::T = []
 < C: apply is_count_exists to Is1 Is.

Subgoal 2:

Variables: T H N
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T N
============================
 H::T = []
 < IsN: apply count_is_integer to C.

Subgoal 2:

Variables: T H N
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T N
IsN : is_integer N
============================
 H::T = []
 < P: apply plus_integer_total to _ IsN with
        N1 = 1.

Subgoal 2:

Variables: T H N N3
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T N
IsN : is_integer N
P : 1 + N = N3
============================
 H::T = []
 < C': assert count H (H::T) N3.

Subgoal 2:

Variables: T H N N3
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T N
IsN : is_integer N
P : 1 + N = N3
C' : count H (H::T) N3
============================
 H::T = []
 < apply Count0 to C'.

Subgoal 2:

Variables: T H N
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T N
IsN : is_integer N
P : 1 + N = 0
C' : count H (H::T) 0
============================
 H::T = []
 < GEq: apply count_geq_0 to C.

Subgoal 2:

Variables: T H N
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T N
IsN : is_integer N
P : 1 + N = 0
C' : count H (H::T) 0
GEq : N >= 0
============================
 H::T = []
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 2:

Variables: T H N
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T N
IsN : is_integer N
P : 1 + N = 0
C' : count H (H::T) 0
GEq : N >= 0
Or : N > 0 \/ N = 0
============================
 H::T = []
 < L: case Or.

Subgoal 2.1:

Variables: T H N
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T N
IsN : is_integer N
P : 1 + N = 0
C' : count H (H::T) 0
GEq : N >= 0
L : N > 0
============================
 H::T = []
 < G: apply greater_plus_positive to _ _ P _.

Subgoal 2.1:

Variables: T H N
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T N
IsN : is_integer N
P : 1 + N = 0
C' : count H (H::T) 0
GEq : N >= 0
L : N > 0
G : 0 > 1
============================
 H::T = []
 < L': assert 0 < 1.

Subgoal 2.1:

Variables: T H N
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T N
IsN : is_integer N
P : 1 + N = 0
C' : count H (H::T) 0
GEq : N >= 0
L : N > 0
G : 0 > 1
L' : 0 < 1
============================
 H::T = []
 < apply greater_less_impossible to G L'.

Subgoal 2.2:

Variables: T H
Count0 : forall X N, count X (H::T) N -> N = 0
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T
C : count H T 0
IsN : is_integer 0
P : 1 + 0 = 0
C' : count H (H::T) 0
GEq : 0 >= 0
============================
 H::T = []
 < case P.

Proof completed.
 < Theorem counts_permutation :
     forall L P,
       is_list (is_pair is_integer is_clause) L -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P.

============================
 forall L P,
   is_list (is_pair is_integer is_clause) L -> is_list (is_pair is_integer is_clause) P ->
   (forall X NL NP,
     is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
   permutation L P
 < induction on 1.

IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
============================
 forall L P,
   is_list (is_pair is_integer is_clause) L @ -> is_list (is_pair is_integer is_clause) P ->
   (forall X NL NP,
     is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
   permutation L P
 < intros IsL IsP Same.

Variables: L P
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) L @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP
============================
 permutation L P
 < Is: case IsL (keep).

Subgoal 1:

Variables: P
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X P NP -> NL = NP
============================
 permutation [] P
 < IsP': case IsP (keep).

Subgoal 1.1:

IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) []
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X [] NP -> NL = NP
============================
 permutation [] []
 < search.

Subgoal 1.2:

Variables: T H
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
============================
 permutation [] (H::T)
 < CL: assert count H [] 0.

Subgoal 1.2:

Variables: T H
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
============================
 permutation [] (H::T)
 < CP: apply is_count_exists to IsP IsP'.

Subgoal 1.2:

Variables: T H N
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : count H (H::T) N
============================
 permutation [] (H::T)
 < apply Same to _ CL CP.

Subgoal 1.2:

Variables: T H
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : count H (H::T) 0
============================
 permutation [] (H::T)
 < CP: case CP.

Subgoal 1.2.1:

Variables: T H N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : count H T N1
CP1 : 1 + N1 = 0
============================
 permutation [] (H::T)
 < GEq: apply count_geq_0 to CP.

Subgoal 1.2.1:

Variables: T H N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : count H T N1
CP1 : 1 + N1 = 0
GEq : N1 >= 0
============================
 permutation [] (H::T)
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 1.2.1:

Variables: T H N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : count H T N1
CP1 : 1 + N1 = 0
GEq : N1 >= 0
Or : N1 > 0 \/ N1 = 0
============================
 permutation [] (H::T)
 < E: case Or.

Subgoal 1.2.1.1:

Variables: T H N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : count H T N1
CP1 : 1 + N1 = 0
GEq : N1 >= 0
E : N1 > 0
============================
 permutation [] (H::T)
 < IsN1: apply count_is_integer to CP.

Subgoal 1.2.1.1:

Variables: T H N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : count H T N1
CP1 : 1 + N1 = 0
GEq : N1 >= 0
E : N1 > 0
IsN1 : is_integer N1
============================
 permutation [] (H::T)
 < G: apply greater_plus_positive to _ _ CP1 _.

Subgoal 1.2.1.1:

Variables: T H N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : count H T N1
CP1 : 1 + N1 = 0
GEq : N1 >= 0
E : N1 > 0
IsN1 : is_integer N1
G : 0 > 1
============================
 permutation [] (H::T)
 < L: assert 0 < 1.

Subgoal 1.2.1.1:

Variables: T H N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : count H T N1
CP1 : 1 + N1 = 0
GEq : N1 >= 0
E : N1 > 0
IsN1 : is_integer N1
G : 0 > 1
L : 0 < 1
============================
 permutation [] (H::T)
 < apply greater_less_impossible to G L.

Subgoal 1.2.1.2:

Variables: T H
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : count H T 0
CP1 : 1 + 0 = 0
GEq : 0 >= 0
============================
 permutation [] (H::T)
 < case CP1.

Subgoal 1.2.2:

Variables: T H
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) [] @
IsP : is_list (is_pair is_integer is_clause) (H::T)
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X [] NL -> count X (H::T) NP ->
         NL = NP
IsP' : is_pair is_integer is_clause H
IsP'1 : is_list (is_pair is_integer is_clause) T
CL : count H [] 0
CP : H = H -> false
CP1 : count H T 0
============================
 permutation [] (H::T)
 < apply CP to _.

Subgoal 2:

Variables: P T H
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
============================
 permutation (H::T) P
 < CLH: apply is_count_exists to IsL Is.

Subgoal 2:

Variables: P T H N
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N
============================
 permutation (H::T) P
 < CPH: apply is_count_exists to IsP Is.

Subgoal 2:

Variables: P T H N N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N
CPH : count H P N1
============================
 permutation (H::T) P
 < G: apply count_greater_0 to CLH.

Subgoal 2:

Variables: P T H N N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N
CPH : count H P N1
G : N > 0
============================
 permutation (H::T) P
 < apply Same to _ CLH CPH.

Subgoal 2:

Variables: P T H N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
============================
 permutation (H::T) P
 < M: apply count_mem to CPH G.

Subgoal 2:

Variables: P T H N1
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
============================
 permutation (H::T) P
 < S: apply mem_select to M.

Subgoal 2:

Variables: P T H N1 L'
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
============================
 permutation (H::T) P
 < IsL': assert is_list (is_pair is_integer is_clause) L'.

Subgoal 2.1:

Variables: P T H N1 L'
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
============================
 is_list (is_pair is_integer is_clause) L'
 < case Is.

Subgoal 2.1:

Variables: P T N1 L' B A
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) ((A, B)::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X ((A, B)::T) NL -> count X P NP ->
         NL = NP
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count (A, B) ((A, B)::T) N1
CPH : count (A, B) P N1
G : N1 > 0
M : mem (A, B) P
S : select (A, B) L' P
H1 : is_integer A
H2 : is_clause B
============================
 is_list (is_pair is_integer is_clause) L'
 < apply select_is to _ S.

Subgoal 2.1:

Variables: P T N1 L' B A
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) ((A, B)::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X ((A, B)::T) NL -> count X P NP ->
         NL = NP
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count (A, B) ((A, B)::T) N1
CPH : count (A, B) P N1
G : N1 > 0
M : mem (A, B) P
S : select (A, B) L' P
H1 : is_integer A
H2 : is_clause B
H3 : is_list (is_pair is_integer is_clause) L'
============================
 is_list (is_pair is_integer is_clause) L'
 < search.

Subgoal 2:

Variables: P T H N1 L'
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
============================
 permutation (H::T) P
 < assert forall X NL NP,
     is_pair is_integer is_clause X -> count X T NL -> count X L' NP -> NL = NP.

Subgoal 2.2:

Variables: P T H N1 L'
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
============================
 forall X NL NP,
   is_pair is_integer is_clause X -> count X T NL -> count X L' NP -> NL = NP
 < intros IsX CT CL'.

Subgoal 2.2:

Variables: P T H N1 L' X NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
============================
 NL = NP
 < Or: apply is_pair_eq_or_not to Is IsX.

Subgoal 2.2:

Variables: P T H N1 L' X NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
Or : H = X \/ (H = X -> false)
============================
 NL = NP
 < E: case Or.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
============================
 NL = NP
 < IsNP: apply count_is_integer to CL'.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
============================
 NL = NP
 < PlusNP: apply plus_integer_total to _ IsNP with
             N1 = 1.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP N3
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
PlusNP : 1 + NP = N3
============================
 NL = NP
 < CXP: apply count_select to CL' S PlusNP.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP N3
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
PlusNP : 1 + NP = N3
CXP : count X P N3
============================
 NL = NP
 < IsNL: apply count_is_integer to CT.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP N3
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
PlusNP : 1 + NP = N3
CXP : count X P N3
IsNL : is_integer NL
============================
 NL = NP
 < PlusNL: apply plus_integer_total to _ IsNL with
             N1 = 1.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP N3 N2
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
PlusNP : 1 + NP = N3
CXP : count X P N3
IsNL : is_integer NL
PlusNL : 1 + NL = N2
============================
 NL = NP
 < CXL: assert count X (X::T) N2.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP N3 N2
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
PlusNP : 1 + NP = N3
CXP : count X P N3
IsNL : is_integer NL
PlusNL : 1 + NL = N2
CXL : count X (X::T) N2
============================
 NL = NP
 < apply Same to _ CXL CXP.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP N3
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
PlusNP : 1 + NP = N3
CXP : count X P N3
IsNL : is_integer NL
PlusNL : 1 + NL = N3
CXL : count X (X::T) N3
============================
 NL = NP
 < P: apply plus_integer_comm to _ _ PlusNP.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP N3
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
PlusNP : 1 + NP = N3
CXP : count X P N3
IsNL : is_integer NL
PlusNL : 1 + NL = N3
CXL : count X (X::T) N3
P : NP + 1 = N3
============================
 NL = NP
 < M: apply plus_minus_same_integer to _ _ P.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP N3
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
PlusNP : 1 + NP = N3
CXP : count X P N3
IsNL : is_integer NL
PlusNL : 1 + NL = N3
CXL : count X (X::T) N3
P : NP + 1 = N3
M1 : N3 - 1 = NP
============================
 NL = NP
 < P': apply plus_integer_comm to _ _ PlusNL.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP N3
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
PlusNP : 1 + NP = N3
CXP : count X P N3
IsNL : is_integer NL
PlusNL : 1 + NL = N3
CXL : count X (X::T) N3
P : NP + 1 = N3
M1 : N3 - 1 = NP
P' : NL + 1 = N3
============================
 NL = NP
 < M': apply plus_minus_same_integer to _ _ P'.

Subgoal 2.2.1:

Variables: P T N1 L' X NL NP N3
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
IsNP : is_integer NP
PlusNP : 1 + NP = N3
CXP : count X P N3
IsNL : is_integer NL
PlusNL : 1 + NL = N3
CXL : count X (X::T) N3
P : NP + 1 = N3
M1 : N3 - 1 = NP
P' : NL + 1 = N3
M' : N3 - 1 = NL
============================
 NL = NP
 < apply minus_integer_unique to M1 M'.

Subgoal 2.2.1:

Variables: P T N1 L' X NL N3
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (X::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X1 NL NP,
         is_pair is_integer is_clause X1 -> count X1 (X::T) NL -> count X1 P NP ->
         NL = NP
Is : is_pair is_integer is_clause X
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count X (X::T) N1
CPH : count X P N1
G : N1 > 0
M : mem X P
S : select X L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NL
IsNP : is_integer NL
PlusNP : 1 + NL = N3
CXP : count X P N3
IsNL : is_integer NL
PlusNL : 1 + NL = N3
CXL : count X (X::T) N3
P : NL + 1 = N3
M1 : N3 - 1 = NL
P' : NL + 1 = N3
M' : N3 - 1 = NL
============================
 NL = NL
 < search.

Subgoal 2.2.2:

Variables: P T H N1 L' X NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
E : H = X -> false
============================
 NL = NP
 < assert X = H -> false.

Subgoal 2.2.2.1:

Variables: P T H N1 L' X NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
E : H = X -> false
============================
 X = H -> false
 < intros A.

Subgoal 2.2.2.1:

Variables: P T H N1 L' X NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
E : H = X -> false
A : X = H
============================
 false
 < case A.

Subgoal 2.2.2.1:

Variables: P T H N1 L' NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause H
CT : count H T NL
CL' : count H L' NP
E : H = H -> false
============================
 false
 < backchain E.

Subgoal 2.2.2:

Variables: P T H N1 L' X NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
E : H = X -> false
H1 : X = H -> false
============================
 NL = NP
 < CXP: apply count_select_neq to CL' S _.

Subgoal 2.2.2:

Variables: P T H N1 L' X NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
E : H = X -> false
H1 : X = H -> false
CXP : count X P NP
============================
 NL = NP
 < CXL: assert count X (H::T) NL.

Subgoal 2.2.2:

Variables: P T H N1 L' X NL NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NL
CL' : count X L' NP
E : H = X -> false
H1 : X = H -> false
CXP : count X P NP
CXL : count X (H::T) NL
============================
 NL = NP
 < apply Same to _ CXL CXP.

Subgoal 2.2.2:

Variables: P T H N1 L' X NP
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
IsX : is_pair is_integer is_clause X
CT : count X T NP
CL' : count X L' NP
E : H = X -> false
H1 : X = H -> false
CXP : count X P NP
CXL : count X (H::T) NP
============================
 NP = NP
 < search.

Subgoal 2:

Variables: P T H N1 L'
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
H1 : forall X NL NP,
       is_pair is_integer is_clause X -> count X T NL -> count X L' NP -> NL = NP
============================
 permutation (H::T) P
 < apply IH to Is1 IsL' _.

Subgoal 2:

Variables: P T H N1 L'
IH : forall L P,
       is_list (is_pair is_integer is_clause) L * -> is_list (is_pair is_integer is_clause) P ->
       (forall X NL NP,
         is_pair is_integer is_clause X -> count X L NL -> count X P NP -> NL = NP) ->
       permutation L P
IsL : is_list (is_pair is_integer is_clause) (H::T) @
IsP : is_list (is_pair is_integer is_clause) P
Same : forall X NL NP,
         is_pair is_integer is_clause X -> count X (H::T) NL -> count X P NP -> NL = NP
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
CLH : count H (H::T) N1
CPH : count H P N1
G : N1 > 0
M : mem H P
S : select H L' P
IsL' : is_list (is_pair is_integer is_clause) L'
H1 : forall X NL NP,
       is_pair is_integer is_clause X -> count X T NL -> count X L' NP -> NL = NP
H2 : permutation T L'
============================
 permutation (H::T) P
 < search.

Proof completed.
 < Theorem selects_permutation :
     forall L P IDC LRest PRest,
       is_list (is_pair is_integer is_clause) L -> is_list (is_pair is_integer is_clause) P ->
       permutation L P -> select IDC LRest L -> select IDC PRest P -> permutation LRest PRest.

============================
 forall L P IDC LRest PRest,
   is_list (is_pair is_integer is_clause) L -> is_list (is_pair is_integer is_clause) P ->
   permutation L P -> select IDC LRest L -> select IDC PRest P -> permutation LRest PRest
 < intros IsL IsP Prm SL SP.

Variables: L P IDC LRest PRest
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
============================
 permutation LRest PRest
 < IsLRest: assert is_list (is_pair is_integer is_clause) LRest.

Subgoal 1:

Variables: L P IDC LRest PRest
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
============================
 is_list (is_pair is_integer is_clause) LRest
 < M: apply select_mem to SL.

Subgoal 1:

Variables: L P IDC LRest PRest
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
M : mem IDC L
============================
 is_list (is_pair is_integer is_clause) LRest
 < apply mem_is to IsL M.

Subgoal 1:

Variables: L P LRest PRest ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
M : mem (ID, C) L
H1 : is_integer ID
H2 : is_clause C
============================
 is_list (is_pair is_integer is_clause) LRest
 < apply select_is to IsL SL.

Subgoal 1:

Variables: L P LRest PRest ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
M : mem (ID, C) L
H1 : is_integer ID
H2 : is_clause C
H3 : is_list (is_pair is_integer is_clause) LRest
============================
 is_list (is_pair is_integer is_clause) LRest
 < search.

Variables: L P IDC LRest PRest
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
============================
 permutation LRest PRest
 < IsPRest: assert is_list (is_pair is_integer is_clause) PRest.

Subgoal 2:

Variables: L P IDC LRest PRest
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
============================
 is_list (is_pair is_integer is_clause) PRest
 < M: apply select_mem to SP.

Subgoal 2:

Variables: L P IDC LRest PRest
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
M : mem IDC P
============================
 is_list (is_pair is_integer is_clause) PRest
 < apply mem_is to IsP M.

Subgoal 2:

Variables: L P LRest PRest ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
M : mem (ID, C) P
H1 : is_integer ID
H2 : is_clause C
============================
 is_list (is_pair is_integer is_clause) PRest
 < apply select_is to IsP SP.

Subgoal 2:

Variables: L P LRest PRest ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
M : mem (ID, C) P
H1 : is_integer ID
H2 : is_clause C
H3 : is_list (is_pair is_integer is_clause) PRest
============================
 is_list (is_pair is_integer is_clause) PRest
 < search.

Variables: L P IDC LRest PRest
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
============================
 permutation LRest PRest
 < assert forall X NL NP,
     is_pair is_integer is_clause X -> count X LRest NL -> count X PRest NP -> NL = NP.

Subgoal 3:

Variables: L P IDC LRest PRest
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
============================
 forall X NL NP,
   is_pair is_integer is_clause X -> count X LRest NL -> count X PRest NP -> NL = NP
 < intros IsX CL CP.

Subgoal 3:

Variables: L P IDC LRest PRest X NL NP
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause X
CL : count X LRest NL
CP : count X PRest NP
============================
 NL = NP
 < M: apply select_mem to SL.

Subgoal 3:

Variables: L P IDC LRest PRest X NL NP
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause X
CL : count X LRest NL
CP : count X PRest NP
M : mem IDC L
============================
 NL = NP
 < Is: apply mem_is to _ M.

Subgoal 3:

Variables: L P LRest PRest X NL NP ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause X
CL : count X LRest NL
CP : count X PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
============================
 NL = NP
 < IsPair: assert is_pair is_integer is_clause (ID, C).

Subgoal 3:

Variables: L P LRest PRest X NL NP ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause X
CL : count X LRest NL
CP : count X PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
============================
 NL = NP
 < Or: apply is_pair_eq_or_not to IsX IsPair.

Subgoal 3:

Variables: L P LRest PRest X NL NP ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause X
CL : count X LRest NL
CP : count X PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
Or : X = (ID, C) \/ (X = (ID, C) -> false)
============================
 NL = NP
 < Eq: case Or.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
============================
 NL = NP
 < IsNL: apply count_is_integer to CL.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
============================
 NL = NP
 < PL: apply plus_integer_total to _ IsNL with
         N1 = 1.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C N3
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N3
============================
 NL = NP
 < IsNP: apply count_is_integer to CP.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C N3
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N3
IsNP : is_integer NP
============================
 NL = NP
 < PP: apply plus_integer_total to _ IsNP with
         N1 = 1.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C N3 N1
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N3
IsNP : is_integer NP
PP : 1 + NP = N1
============================
 NL = NP
 < CLFull: apply count_select to CL SL PL.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C N3 N1
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N3
IsNP : is_integer NP
PP : 1 + NP = N1
CLFull : count (ID, C) L N3
============================
 NL = NP
 < CPFull: apply count_select to CP SP PP.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C N3 N1
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N3
IsNP : is_integer NP
PP : 1 + NP = N1
CLFull : count (ID, C) L N3
CPFull : count (ID, C) P N1
============================
 NL = NP
 < apply permutation_counts to Prm CLFull CPFull.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C N1
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N1
IsNP : is_integer NP
PP : 1 + NP = N1
CLFull : count (ID, C) L N1
CPFull : count (ID, C) P N1
============================
 NL = NP
 < NP+: apply plus_integer_comm to _ _ PP.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C N1
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N1
IsNP : is_integer NP
PP : 1 + NP = N1
CLFull : count (ID, C) L N1
CPFull : count (ID, C) P N1
NP+ : NP + 1 = N1
============================
 NL = NP
 < MP: apply plus_minus_same_integer to _ _ NP+.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C N1
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N1
IsNP : is_integer NP
PP : 1 + NP = N1
CLFull : count (ID, C) L N1
CPFull : count (ID, C) P N1
NP+ : NP + 1 = N1
MP : N1 - 1 = NP
============================
 NL = NP
 < NL+: apply plus_integer_comm to _ _ PL.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C N1
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N1
IsNP : is_integer NP
PP : 1 + NP = N1
CLFull : count (ID, C) L N1
CPFull : count (ID, C) P N1
NP+ : NP + 1 = N1
MP : N1 - 1 = NP
NL+ : NL + 1 = N1
============================
 NL = NP
 < ML: apply plus_minus_same_integer to _ _ NL+.

Subgoal 3.1:

Variables: L P LRest PRest NL NP ID C N1
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N1
IsNP : is_integer NP
PP : 1 + NP = N1
CLFull : count (ID, C) L N1
CPFull : count (ID, C) P N1
NP+ : NP + 1 = N1
MP : N1 - 1 = NP
NL+ : NL + 1 = N1
ML : N1 - 1 = NL
============================
 NL = NP
 < apply minus_integer_unique to MP ML.

Subgoal 3.1:

Variables: L P LRest PRest NL ID C N1
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause (ID, C)
CL : count (ID, C) LRest NL
CP : count (ID, C) PRest NL
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
IsNL : is_integer NL
PL : 1 + NL = N1
IsNP : is_integer NL
PP : 1 + NL = N1
CLFull : count (ID, C) L N1
CPFull : count (ID, C) P N1
NP+ : NL + 1 = N1
MP : N1 - 1 = NL
NL+ : NL + 1 = N1
ML : N1 - 1 = NL
============================
 NL = NL
 < search.

Subgoal 3.2:

Variables: L P LRest PRest X NL NP ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause X
CL : count X LRest NL
CP : count X PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
Eq : X = (ID, C) -> false
============================
 NL = NP
 < CLFull: apply count_select_neq to CL SL Eq.

Subgoal 3.2:

Variables: L P LRest PRest X NL NP ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause X
CL : count X LRest NL
CP : count X PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
Eq : X = (ID, C) -> false
CLFull : count X L NL
============================
 NL = NP
 < CPFull: apply count_select_neq to CP SP Eq.

Subgoal 3.2:

Variables: L P LRest PRest X NL NP ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause X
CL : count X LRest NL
CP : count X PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
Eq : X = (ID, C) -> false
CLFull : count X L NL
CPFull : count X P NP
============================
 NL = NP
 < apply permutation_counts to Prm CLFull CPFull.

Subgoal 3.2:

Variables: L P LRest PRest X NP ID C
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select (ID, C) LRest L
SP : select (ID, C) PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
IsX : is_pair is_integer is_clause X
CL : count X LRest NP
CP : count X PRest NP
M : mem (ID, C) L
Is : is_integer ID
Is1 : is_clause C
IsPair : is_pair is_integer is_clause (ID, C)
Eq : X = (ID, C) -> false
CLFull : count X L NP
CPFull : count X P NP
============================
 NP = NP
 < search.

Variables: L P IDC LRest PRest
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
H1 : forall X NL NP,
       is_pair is_integer is_clause X -> count X LRest NL -> count X PRest NP ->
       NL = NP
============================
 permutation LRest PRest
 < apply counts_permutation to IsLRest IsPRest _.

Variables: L P IDC LRest PRest
IsL : is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
SL : select IDC LRest L
SP : select IDC PRest P
IsLRest : is_list (is_pair is_integer is_clause) LRest
IsPRest : is_list (is_pair is_integer is_clause) PRest
H1 : forall X NL NP,
       is_pair is_integer is_clause X -> count X LRest NL -> count X PRest NP ->
       NL = NP
H2 : permutation LRest PRest
============================
 permutation LRest PRest
 < search.

Proof completed.
 < Theorem permutation_reflexive :
     forall L, is_list (is_pair is_integer is_clause) L -> permutation L L.

============================
 forall L, is_list (is_pair is_integer is_clause) L -> permutation L L
 < induction on 1.

IH : forall L, is_list (is_pair is_integer is_clause) L * -> permutation L L
============================
 forall L, is_list (is_pair is_integer is_clause) L @ -> permutation L L
 < intros Is.

Variables: L
IH : forall L, is_list (is_pair is_integer is_clause) L * -> permutation L L
Is : is_list (is_pair is_integer is_clause) L @
============================
 permutation L L
 < Is: case Is.

Subgoal 1:

IH : forall L, is_list (is_pair is_integer is_clause) L * -> permutation L L
============================
 permutation [] []
 < search.

Subgoal 2:

Variables: T H
IH : forall L, is_list (is_pair is_integer is_clause) L * -> permutation L L
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
============================
 permutation (H::T) (H::T)
 < apply IH to Is1.

Subgoal 2:

Variables: T H
IH : forall L, is_list (is_pair is_integer is_clause) L * -> permutation L L
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
H1 : permutation T T
============================
 permutation (H::T) (H::T)
 < search.

Proof completed.
 < Theorem permutation_is :
     forall L P,
       is_list (is_pair is_integer is_clause) P -> permutation L P -> is_list (is_pair is_integer is_clause) L.

============================
 forall L P,
   is_list (is_pair is_integer is_clause) P -> permutation L P -> is_list (is_pair is_integer is_clause) L
 < induction on 2.

IH : forall L P,
       is_list (is_pair is_integer is_clause) P -> permutation L P * -> is_list (is_pair is_integer is_clause) L
============================
 forall L P,
   is_list (is_pair is_integer is_clause) P -> permutation L P @ -> is_list (is_pair is_integer is_clause) L
 < intros IsP Prm.

Variables: L P
IH : forall L P,
       is_list (is_pair is_integer is_clause) P -> permutation L P * -> is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P @
============================
 is_list (is_pair is_integer is_clause) L
 < Prm: case Prm.

Subgoal 1:

IH : forall L P,
       is_list (is_pair is_integer is_clause) P -> permutation L P * -> is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) []
============================
 is_list (is_pair is_integer is_clause) []
 < search.

Subgoal 2:

Variables: P L2 Rest A
IH : forall L P,
       is_list (is_pair is_integer is_clause) P -> permutation L P * -> is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : select A L2 P
Prm1 : permutation Rest L2 *
============================
 is_list (is_pair is_integer is_clause) (A::Rest)
 < IsRest: apply select_is to IsP Prm.

Subgoal 2:

Variables: P L2 Rest A
IH : forall L P,
       is_list (is_pair is_integer is_clause) P -> permutation L P * -> is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : select A L2 P
Prm1 : permutation Rest L2 *
IsRest : is_list (is_pair is_integer is_clause) L2
============================
 is_list (is_pair is_integer is_clause) (A::Rest)
 < apply IH to IsRest Prm1.

Subgoal 2:

Variables: P L2 Rest A
IH : forall L P,
       is_list (is_pair is_integer is_clause) P -> permutation L P * -> is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : select A L2 P
Prm1 : permutation Rest L2 *
IsRest : is_list (is_pair is_integer is_clause) L2
H1 : is_list (is_pair is_integer is_clause) Rest
============================
 is_list (is_pair is_integer is_clause) (A::Rest)
 < IsA: apply select_is_picked to IsP Prm.

Subgoal 2:

Variables: P L2 Rest A
IH : forall L P,
       is_list (is_pair is_integer is_clause) P -> permutation L P * -> is_list (is_pair is_integer is_clause) L
IsP : is_list (is_pair is_integer is_clause) P
Prm : select A L2 P
Prm1 : permutation Rest L2 *
IsRest : is_list (is_pair is_integer is_clause) L2
H1 : is_list (is_pair is_integer is_clause) Rest
IsA : is_pair is_integer is_clause A
============================
 is_list (is_pair is_integer is_clause) (A::Rest)
 < search.

Proof completed.
 < Define good_assignment : (list lit) -> prop by
   good_assignment A :=
     forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false.


 < Theorem good_assignment_sub :
     forall A B,
       good_assignment A -> (forall X, mem X B -> mem X A) -> good_assignment B.

============================
 forall A B,
   good_assignment A -> (forall X, mem X B -> mem X A) -> good_assignment B
 < intros GA Sub.

Variables: A B
GA : good_assignment A
Sub : forall X, mem X B -> mem X A
============================
 good_assignment B
 < unfold .

Variables: A B
GA : good_assignment A
Sub : forall X, mem X B -> mem X A
============================
 forall L NL, mem L B -> negate_lit L NL -> mem NL B -> false
 < intros MLB Neg MNLB.

Variables: A B L NL
GA : good_assignment A
Sub : forall X, mem X B -> mem X A
MLB : mem L B
Neg : negate_lit L NL
MNLB : mem NL B
============================
 false
 < GA: case GA.

Variables: A B L NL
Sub : forall X, mem X B -> mem X A
MLB : mem L B
Neg : negate_lit L NL
MNLB : mem NL B
GA : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
============================
 false
 < MLA: apply Sub to MLB.

Variables: A B L NL
Sub : forall X, mem X B -> mem X A
MLB : mem L B
Neg : negate_lit L NL
MNLB : mem NL B
GA : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
MLA : mem L A
============================
 false
 < MNLA: apply Sub to MNLB.

Variables: A B L NL
Sub : forall X, mem X B -> mem X A
MLB : mem L B
Neg : negate_lit L NL
MNLB : mem NL B
GA : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
MLA : mem L A
MNLA : mem NL A
============================
 false
 < apply GA to MLA Neg _.

Proof completed.
 < Extensible_Theorem
      negate_lit_unique : forall L LA LB,
         IsL : is_lit L ->
         NegA : negate_lit L LA ->
         NegB : negate_lit L LB ->
         LA = LB
      on NegA.

Subgoal 1:

Variables: LB V
IH : forall L LA LB, is_lit L -> negate_lit L LA * -> negate_lit L LB -> LA = LB
IsL : is_lit (pos V)
NegA : negate_lit (pos V) (neg V) @
NegB : negate_lit (pos V) LB
============================
 neg V = LB
 < case NegB.

Subgoal 1:

Variables: V
IH : forall L LA LB, is_lit L -> negate_lit L LA * -> negate_lit L LB -> LA = LB
IsL : is_lit (pos V)
NegA : negate_lit (pos V) (neg V) @
============================
 neg V = neg V
 < search.

Subgoal 2:

Variables: LB V
IH : forall L LA LB, is_lit L -> negate_lit L LA * -> negate_lit L LB -> LA = LB
IsL : is_lit (neg V)
NegA : negate_lit (neg V) (pos V) @
NegB : negate_lit (neg V) LB
============================
 pos V = LB
 < case NegB.

Subgoal 2:

Variables: V
IH : forall L LA LB, is_lit L -> negate_lit L LA * -> negate_lit L LB -> LA = LB
IsL : is_lit (neg V)
NegA : negate_lit (neg V) (pos V) @
============================
 pos V = pos V
 < search.

Proof completed.
 < Extensible_Theorem
      negate_lit_reverse : forall L NL,
         IsL : is_lit L ->
         Neg : negate_lit L NL ->
         negate_lit NL L
      on Neg.

Subgoal 1:

Variables: V
IH : forall L NL, is_lit L -> negate_lit L NL * -> negate_lit NL L
IsL : is_lit (pos V)
Neg : negate_lit (pos V) (neg V) @
============================
 negate_lit (neg V) (pos V)
 < search.

Subgoal 2:

Variables: V
IH : forall L NL, is_lit L -> negate_lit L NL * -> negate_lit NL L
IsL : is_lit (neg V)
Neg : negate_lit (neg V) (pos V) @
============================
 negate_lit (pos V) (neg V)
 < search.

Proof completed.
 < Extensible_Theorem
      negate_lit_not_same : forall L,
         IsL : is_lit L ->
         Neg : negate_lit L L ->
         false
      on Neg.

Proof completed.
 < Extensible_Theorem
      negate_lit_is_lit : forall L NL,
         IsL : is_lit L ->
         Neg : negate_lit L NL ->
         is_lit NL
      on Neg.

Subgoal 1:

Variables: V
IH : forall L NL, is_lit L -> negate_lit L NL * -> is_lit NL
IsL : is_lit (pos V)
Neg : negate_lit (pos V) (neg V) @
============================
 is_lit (neg V)
 < case IsL.

Subgoal 1:

Variables: V
IH : forall L NL, is_lit L -> negate_lit L NL * -> is_lit NL
Neg : negate_lit (pos V) (neg V) @
H1 : is_integer V
============================
 is_lit (neg V)
 < search.

Subgoal 2:

Variables: V
IH : forall L NL, is_lit L -> negate_lit L NL * -> is_lit NL
IsL : is_lit (neg V)
Neg : negate_lit (neg V) (pos V) @
============================
 is_lit (pos V)
 < case IsL.

Subgoal 2:

Variables: V
IH : forall L NL, is_lit L -> negate_lit L NL * -> is_lit NL
Neg : negate_lit (neg V) (pos V) @
H1 : is_integer V
============================
 is_lit (pos V)
 < search.

Proof completed.
 < Extensible_Theorem
      negate_lit_is_lit_back : forall L NL,
         IsNL : is_lit NL ->
         Neg : negate_lit L NL ->
         is_lit L
      on Neg.

Subgoal 1:

Variables: V
IH : forall L NL, is_lit NL -> negate_lit L NL * -> is_lit L
IsNL : is_lit (neg V)
Neg : negate_lit (pos V) (neg V) @
============================
 is_lit (pos V)
 < case IsNL.

Subgoal 1:

Variables: V
IH : forall L NL, is_lit NL -> negate_lit L NL * -> is_lit L
Neg : negate_lit (pos V) (neg V) @
H1 : is_integer V
============================
 is_lit (pos V)
 < search.

Subgoal 2:

Variables: V
IH : forall L NL, is_lit NL -> negate_lit L NL * -> is_lit L
IsNL : is_lit (pos V)
Neg : negate_lit (neg V) (pos V) @
============================
 is_lit (neg V)
 < case IsNL.

Subgoal 2:

Variables: V
IH : forall L NL, is_lit NL -> negate_lit L NL * -> is_lit L
Neg : negate_lit (neg V) (pos V) @
H1 : is_integer V
============================
 is_lit (neg V)
 < search.

Proof completed.
 < Extensible_Theorem
      negate_lit_exists : forall L,
         IsL : is_lit L ->
         exists NL,
           negate_lit L NL
      on IsL.

Subgoal 1:

Variables: I
IH : forall L, is_lit L * -> exists NL, negate_lit L NL
IsL : is_lit (pos I) @
IsL1 : is_integer I
============================
 exists NL, negate_lit (pos I) NL
 < search.

Subgoal 2:

Variables: I
IH : forall L, is_lit L * -> exists NL, negate_lit L NL
IsL : is_lit (neg I) @
IsL1 : is_integer I
============================
 exists NL, negate_lit (neg I) NL
 < search.

Proof completed.
 < Projection_Constraint sat_clause_ext_to_proj :
   forall C C' Sat,
   |{clause}- C ~~> C' -> is_list is_lit Sat -> is_clause C -> sat_clause Sat C ->
   sat_clause Sat C'.

Proof completed.
 < Projection_Constraint sat_clause_proj_to_ext :
   forall C C' Sat,
   |{clause}- C ~~> C' -> is_list is_lit Sat -> is_clause C -> sat_clause Sat C' ->
   sat_clause Sat C.

Proof completed.
 < Projection_Constraint unsat_clause_ext_to_proj :
   forall C C' Unsat,
   |{clause}- C ~~> C' -> is_list is_lit Unsat -> is_clause C -> unsat_clause Unsat C ->
   unsat_clause Unsat C'.

Proof completed.
 < Projection_Constraint unsat_clause_proj_to_ext :
   forall C C' Unsat,
   |{clause}- C ~~> C' -> is_list is_lit Unsat -> is_clause C -> unsat_clause Unsat C' ->
   unsat_clause Unsat C.

Proof completed.
 < Projection_Constraint sat_formula_ext_to_proj :
   forall F F' Sat,
   |{formula}- F ~~> F' -> is_list is_lit Sat -> sat_formula Sat F -> sat_formula Sat F'.

Proof completed.
 < Projection_Constraint sat_formula_proj_to_ext :
   forall F F' Sat,
   |{formula}- F ~~> F' -> is_list is_lit Sat -> sat_formula Sat F' -> sat_formula Sat F.

Proof completed.
 < Extensible_Theorem
      unsat_sat_clause : forall A C,
         IsC : is_clause C ->
         IsA : is_list is_lit A ->
         UNSAT : unsat_clause A C ->
         SAT : sat_clause A C ->
         GA : good_assignment A ->
         false
      on UNSAT.

Subgoal 1:

Variables: A
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 emptyClause
IsA : is_list is_lit A
UNSAT : unsat_clause A emptyClause @
SAT : sat_clause A emptyClause
GA : good_assignment A
============================
 false
 < SAT: case SAT.

Subgoal 2:

Variables: A NL Rest L
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 (or L Rest)
IsA : is_list is_lit A
UNSAT : unsat_clause A (or L Rest) @
SAT : sat_clause A (or L Rest)
GA : good_assignment A
UNSAT1 : negate_lit L NL
UNSAT2 : mem NL A
UNSAT3 : unsat_clause A Rest *
============================
 false
 < SAT: case SAT.

Subgoal 2.1:

Variables: A NL Rest L
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 (or L Rest)
IsA : is_list is_lit A
UNSAT : unsat_clause A (or L Rest) @
GA : good_assignment A
UNSAT1 : negate_lit L NL
UNSAT2 : mem NL A
UNSAT3 : unsat_clause A Rest *
SAT : mem L A
============================
 false
 < GA: case GA.

Subgoal 2.1:

Variables: A NL Rest L
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 (or L Rest)
IsA : is_list is_lit A
UNSAT : unsat_clause A (or L Rest) @
UNSAT1 : negate_lit L NL
UNSAT2 : mem NL A
UNSAT3 : unsat_clause A Rest *
SAT : mem L A
GA : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
============================
 false
 < apply GA to SAT _ UNSAT2.

Subgoal 2.2:

Variables: A NL Rest L
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 (or L Rest)
IsA : is_list is_lit A
UNSAT : unsat_clause A (or L Rest) @
GA : good_assignment A
UNSAT1 : negate_lit L NL
UNSAT2 : mem NL A
UNSAT3 : unsat_clause A Rest *
SAT : sat_clause A Rest
============================
 false
 < case IsC.

Subgoal 2.2:

Variables: A NL Rest L
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 (or L Rest) @
GA : good_assignment A
UNSAT1 : negate_lit L NL
UNSAT2 : mem NL A
UNSAT3 : unsat_clause A Rest *
SAT : sat_clause A Rest
H1 : is_lit L
H2 : is_clause Rest
============================
 false
 < apply IH to _ _ UNSAT3 SAT GA.

Proof completed.
 < Extensible_Theorem
      sat_clause_orderless : forall A1 A2 C,
         IsC : is_clause C ->
         IsA1 : is_list is_lit A1 ->
         IsA2 : is_list is_lit A2 ->
         SAT : sat_clause A1 C ->
         MemA1A2 : (forall L,
           mem L A1 -> mem L A2) ->
         sat_clause A2 C
      on SAT.

Subgoal 1:

Variables: A1 A2 Rest L
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 (or L Rest)
IsA1 : is_list is_lit A1
IsA2 : is_list is_lit A2
SAT : sat_clause A1 (or L Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
SAT1 : mem L A1
============================
 sat_clause A2 (or L Rest)
 < apply MemA1A2 to _.

Subgoal 1:

Variables: A1 A2 Rest L
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 (or L Rest)
IsA1 : is_list is_lit A1
IsA2 : is_list is_lit A2
SAT : sat_clause A1 (or L Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
SAT1 : mem L A1
H1 : mem L A2
============================
 sat_clause A2 (or L Rest)
 < search.

Subgoal 2:

Variables: A1 A2 Rest L
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 (or L Rest)
IsA1 : is_list is_lit A1
IsA2 : is_list is_lit A2
SAT : sat_clause A1 (or L Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
SAT1 : sat_clause A1 Rest *
============================
 sat_clause A2 (or L Rest)
 < case IsC.

Subgoal 2:

Variables: A1 A2 Rest L
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 (or L Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
SAT1 : sat_clause A1 Rest *
H1 : is_lit L
H2 : is_clause Rest
============================
 sat_clause A2 (or L Rest)
 < apply IH to _ _ _ SAT1 _.

Subgoal 2:

Variables: A1 A2 Rest L
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 (or L Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
SAT1 : sat_clause A1 Rest *
H1 : is_lit L
H2 : is_clause Rest
H3 : sat_clause A2 Rest
============================
 sat_clause A2 (or L Rest)
 < search.

Proof completed.
 < Extensible_Theorem
      sat_formula_orderless : forall A1 A2 F,
         IsF : is_formula F ->
         IsA1 : is_list is_lit A1 ->
         IsA2 : is_list is_lit A2 ->
         SAT : sat_formula A1 F ->
         MemA1A2 : (forall L,
           mem L A1 -> mem L A2) ->
         sat_formula A2 F
      on SAT.

Subgoal 1:

Variables: A1 A2
IH : forall A1 A2 F,
       is_formula F -> is_list is_lit A1 -> is_list is_lit A2 -> sat_formula A1 F * ->
       (forall L, mem L A1 -> mem L A2) -> sat_formula A2 F
IsF : is_formula emptyFormula
IsA1 : is_list is_lit A1
IsA2 : is_list is_lit A2
SAT : sat_formula A1 emptyFormula @
MemA1A2 : forall L, mem L A1 -> mem L A2
============================
 sat_formula A2 emptyFormula
 < search.

Subgoal 2:

Variables: A1 A2 Rest C
IH : forall A1 A2 F,
       is_formula F -> is_list is_lit A1 -> is_list is_lit A2 -> sat_formula A1 F * ->
       (forall L, mem L A1 -> mem L A2) -> sat_formula A2 F
IsF : is_formula (and C Rest)
IsA1 : is_list is_lit A1
IsA2 : is_list is_lit A2
SAT : sat_formula A1 (and C Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
SAT1 : sat_clause A1 C
SAT2 : sat_formula A1 Rest *
============================
 sat_formula A2 (and C Rest)
 < case IsF.

Subgoal 2:

Variables: A1 A2 Rest C
IH : forall A1 A2 F,
       is_formula F -> is_list is_lit A1 -> is_list is_lit A2 -> sat_formula A1 F * ->
       (forall L, mem L A1 -> mem L A2) -> sat_formula A2 F
IsA1 : is_list is_lit A1
IsA2 : is_list is_lit A2
SAT : sat_formula A1 (and C Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
SAT1 : sat_clause A1 C
SAT2 : sat_formula A1 Rest *
H1 : is_clause C
H2 : is_formula Rest
============================
 sat_formula A2 (and C Rest)
 < apply IH to _ _ _ SAT2 _.

Subgoal 2:

Variables: A1 A2 Rest C
IH : forall A1 A2 F,
       is_formula F -> is_list is_lit A1 -> is_list is_lit A2 -> sat_formula A1 F * ->
       (forall L, mem L A1 -> mem L A2) -> sat_formula A2 F
IsA1 : is_list is_lit A1
IsA2 : is_list is_lit A2
SAT : sat_formula A1 (and C Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
SAT1 : sat_clause A1 C
SAT2 : sat_formula A1 Rest *
H1 : is_clause C
H2 : is_formula Rest
H3 : sat_formula A2 Rest
============================
 sat_formula A2 (and C Rest)
 < apply sat_clause_orderless to _ _ _ _ _.

Subgoal 2:

Variables: A1 A2 Rest C
IH : forall A1 A2 F,
       is_formula F -> is_list is_lit A1 -> is_list is_lit A2 -> sat_formula A1 F * ->
       (forall L, mem L A1 -> mem L A2) -> sat_formula A2 F
IsA1 : is_list is_lit A1
IsA2 : is_list is_lit A2
SAT : sat_formula A1 (and C Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
SAT1 : sat_clause A1 C
SAT2 : sat_formula A1 Rest *
H1 : is_clause C
H2 : is_formula Rest
H3 : sat_formula A2 Rest
H4 : sat_clause A2 C
============================
 sat_formula A2 (and C Rest)
 < search.

Proof completed.
 < Extensible_Theorem
      unsat_clause_orderless : forall A1 A2 C,
         IsC : is_clause C ->
         IsA1 : is_list is_lit A1 ->
         IsA2 : is_list is_lit A2 ->
         UNSAT : unsat_clause A1 C ->
         MemA1A2 : (forall L,
           mem L A1 -> mem L A2) ->
         unsat_clause A2 C
      on UNSAT.

Subgoal 1:

Variables: A1 A2
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 emptyClause
IsA1 : is_list is_lit A1
IsA2 : is_list is_lit A2
UNSAT : unsat_clause A1 emptyClause @
MemA1A2 : forall L, mem L A1 -> mem L A2
============================
 unsat_clause A2 emptyClause
 < search.

Subgoal 2:

Variables: A1 A2 NL Rest L
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 (or L Rest)
IsA1 : is_list is_lit A1
IsA2 : is_list is_lit A2
UNSAT : unsat_clause A1 (or L Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
UNSAT1 : negate_lit L NL
UNSAT2 : mem NL A1
UNSAT3 : unsat_clause A1 Rest *
============================
 unsat_clause A2 (or L Rest)
 < case IsC.

Subgoal 2:

Variables: A1 A2 NL Rest L
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 (or L Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
UNSAT1 : negate_lit L NL
UNSAT2 : mem NL A1
UNSAT3 : unsat_clause A1 Rest *
H1 : is_lit L
H2 : is_clause Rest
============================
 unsat_clause A2 (or L Rest)
 < apply IH to _ _ _ UNSAT3 _.

Subgoal 2:

Variables: A1 A2 NL Rest L
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 (or L Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
UNSAT1 : negate_lit L NL
UNSAT2 : mem NL A1
UNSAT3 : unsat_clause A1 Rest *
H1 : is_lit L
H2 : is_clause Rest
H3 : unsat_clause A2 Rest
============================
 unsat_clause A2 (or L Rest)
 < apply MemA1A2 to UNSAT2.

Subgoal 2:

Variables: A1 A2 NL Rest L
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 (or L Rest) @
MemA1A2 : forall L, mem L A1 -> mem L A2
UNSAT1 : negate_lit L NL
UNSAT2 : mem NL A1
UNSAT3 : unsat_clause A1 Rest *
H1 : is_lit L
H2 : is_clause Rest
H3 : unsat_clause A2 Rest
H4 : mem NL A2
============================
 unsat_clause A2 (or L Rest)
 < search.

Proof completed.
 < Extensible_Theorem
      unit_clause_is : forall A C L,
         IsC : is_clause C ->
         IsA : is_list is_lit A ->
         Unit : unit_clause A C L ->
         is_lit L
      on Unit.

Subgoal 1:

Variables: A L NL C1
IH : forall A C L,
       is_clause C -> is_list is_lit A -> unit_clause A C L * -> is_lit L
IsC : is_clause (or L C1)
IsA : is_list is_lit A
Unit : unit_clause A (or L C1) L @
Unit1 : mem L A -> false
Unit2 : negate_lit L NL
Unit3 : mem NL A -> false
Unit4 : unsat_clause A C1
============================
 is_lit L
 < case IsC.

Subgoal 1:

Variables: A L NL C1
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 (or L C1) L @
Unit1 : mem L A -> false
Unit2 : negate_lit L NL
Unit3 : mem NL A -> false
Unit4 : unsat_clause A C1
H1 : is_lit L
H2 : is_clause C1
============================
 is_lit L
 < search.

Subgoal 2:

Variables: A L NL C1 L1
IH : forall A C L,
       is_clause C -> is_list is_lit A -> unit_clause A C L * -> is_lit L
IsC : is_clause (or L1 C1)
IsA : is_list is_lit A
Unit : unit_clause A (or L1 C1) L @
Unit1 : negate_lit L1 NL
Unit2 : mem NL A
Unit3 : unit_clause A C1 L *
============================
 is_lit L
 < Is: case IsC.

Subgoal 2:

Variables: A L NL C1 L1
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 (or L1 C1) L @
Unit1 : negate_lit L1 NL
Unit2 : mem NL A
Unit3 : unit_clause A C1 L *
Is : is_lit L1
Is1 : is_clause C1
============================
 is_lit L
 < apply IH to _ _ Unit3.

Subgoal 2:

Variables: A L NL C1 L1
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 (or L1 C1) L @
Unit1 : negate_lit L1 NL
Unit2 : mem NL A
Unit3 : unit_clause A C1 L *
Is : is_lit L1
Is1 : is_clause C1
H1 : is_lit L
============================
 is_lit L
 < search.

Proof completed.
 < Extensible_Theorem
      unit_clause_unique : forall A B C LA LB,
         IsC : is_clause C ->
         IsA : is_list is_lit A ->
         IsB : is_list is_lit B ->
         UnitA : unit_clause A C LA ->
         UnitB : unit_clause B C LB ->
         Prm : permutation A B ->
         LA = LB
      on UnitA.

Subgoal 1:

Variables: A B LA LB NL C1
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 (or LA C1)
IsA : is_list is_lit A
IsB : is_list is_lit B
UnitA : unit_clause A (or LA C1) LA @
UnitB : unit_clause B (or LA C1) LB
Prm : permutation A B
UnitA1 : mem LA A -> false
UnitA2 : negate_lit LA NL
UnitA3 : mem NL A -> false
UnitA4 : unsat_clause A C1
============================
 LA = LB
 < UnitB: case UnitB.

Subgoal 1.1:

Variables: A B LB NL C1 NL1
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 (or LB C1)
IsA : is_list is_lit A
IsB : is_list is_lit B
UnitA : unit_clause A (or LB C1) LB @
Prm : permutation A B
UnitA1 : mem LB A -> false
UnitA2 : negate_lit LB NL
UnitA3 : mem NL A -> false
UnitA4 : unsat_clause A C1
UnitB : mem LB B -> false
UnitB1 : negate_lit LB NL1
UnitB2 : mem NL1 B -> false
UnitB3 : unsat_clause B C1
============================
 LB = LB
 < search.

Subgoal 1.2:

Variables: A B LA LB NL C1 NL1
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 (or LA C1)
IsA : is_list is_lit A
IsB : is_list is_lit B
UnitA : unit_clause A (or LA C1) LA @
Prm : permutation A B
UnitA1 : mem LA A -> false
UnitA2 : negate_lit LA NL
UnitA3 : mem NL A -> false
UnitA4 : unsat_clause A C1
UnitB : negate_lit LA NL1
UnitB1 : mem NL1 B
UnitB2 : unit_clause B C1 LB
============================
 LA = LB
 < IsLA: apply unit_clause_is to _ _ UnitA.

Subgoal 1.2:

Variables: A B LA LB NL C1 NL1
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 (or LA C1)
IsA : is_list is_lit A
IsB : is_list is_lit B
UnitA : unit_clause A (or LA C1) LA @
Prm : permutation A B
UnitA1 : mem LA A -> false
UnitA2 : negate_lit LA NL
UnitA3 : mem NL A -> false
UnitA4 : unsat_clause A C1
UnitB : negate_lit LA NL1
UnitB1 : mem NL1 B
UnitB2 : unit_clause B C1 LB
IsLA : is_lit LA
============================
 LA = LB
 < Is: case IsC.

Subgoal 1.2:

Variables: A B LA LB NL C1 NL1
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 (or LA C1) LA @
Prm : permutation A B
UnitA1 : mem LA A -> false
UnitA2 : negate_lit LA NL
UnitA3 : mem NL A -> false
UnitA4 : unsat_clause A C1
UnitB : negate_lit LA NL1
UnitB1 : mem NL1 B
UnitB2 : unit_clause B C1 LB
IsLA : is_lit LA
Is : is_lit LA
Is1 : is_clause C1
============================
 LA = LB
 < IsLB: apply unit_clause_is to _ _ UnitB2.

Subgoal 1.2:

Variables: A B LA LB NL C1 NL1
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 (or LA C1) LA @
Prm : permutation A B
UnitA1 : mem LA A -> false
UnitA2 : negate_lit LA NL
UnitA3 : mem NL A -> false
UnitA4 : unsat_clause A C1
UnitB : negate_lit LA NL1
UnitB1 : mem NL1 B
UnitB2 : unit_clause B C1 LB
IsLA : is_lit LA
Is : is_lit LA
Is1 : is_clause C1
IsLB : is_lit LB
============================
 LA = LB
 < apply negate_lit_unique to _ UnitA2 UnitB.

Subgoal 1.2:

Variables: A B LA LB C1 NL1
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 (or LA C1) LA @
Prm : permutation A B
UnitA1 : mem LA A -> false
UnitA2 : negate_lit LA NL1
UnitA3 : mem NL1 A -> false
UnitA4 : unsat_clause A C1
UnitB : negate_lit LA NL1
UnitB1 : mem NL1 B
UnitB2 : unit_clause B C1 LB
IsLA : is_lit LA
Is : is_lit LA
Is1 : is_clause C1
IsLB : is_lit LB
============================
 LA = LB
 < P: apply permutation_symmetric to Prm.

Subgoal 1.2:

Variables: A B LA LB C1 NL1
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 (or LA C1) LA @
Prm : permutation A B
UnitA1 : mem LA A -> false
UnitA2 : negate_lit LA NL1
UnitA3 : mem NL1 A -> false
UnitA4 : unsat_clause A C1
UnitB : negate_lit LA NL1
UnitB1 : mem NL1 B
UnitB2 : unit_clause B C1 LB
IsLA : is_lit LA
Is : is_lit LA
Is1 : is_clause C1
IsLB : is_lit LB
P : permutation B A
============================
 LA = LB
 < MemA: apply permutation_mem to P UnitB1.

Subgoal 1.2:

Variables: A B LA LB C1 NL1
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 (or LA C1) LA @
Prm : permutation A B
UnitA1 : mem LA A -> false
UnitA2 : negate_lit LA NL1
UnitA3 : mem NL1 A -> false
UnitA4 : unsat_clause A C1
UnitB : negate_lit LA NL1
UnitB1 : mem NL1 B
UnitB2 : unit_clause B C1 LB
IsLA : is_lit LA
Is : is_lit LA
Is1 : is_clause C1
IsLB : is_lit LB
P : permutation B A
MemA : mem NL1 A
============================
 LA = LB
 < apply UnitA3 to MemA.

Subgoal 2:

Variables: A B LA LB NL C1 L
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 (or L C1)
IsA : is_list is_lit A
IsB : is_list is_lit B
UnitA : unit_clause A (or L C1) LA @
UnitB : unit_clause B (or L C1) LB
Prm : permutation A B
UnitA1 : negate_lit L NL
UnitA2 : mem NL A
UnitA3 : unit_clause A C1 LA *
============================
 LA = LB
 < UnitB: case UnitB.

Subgoal 2.1:

Variables: A B LA LB NL C1 NL1
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 (or LB C1)
IsA : is_list is_lit A
IsB : is_list is_lit B
UnitA : unit_clause A (or LB C1) LA @
Prm : permutation A B
UnitA1 : negate_lit LB NL
UnitA2 : mem NL A
UnitA3 : unit_clause A C1 LA *
UnitB : mem LB B -> false
UnitB1 : negate_lit LB NL1
UnitB2 : mem NL1 B -> false
UnitB3 : unsat_clause B C1
============================
 LA = LB
 < MemB: apply permutation_mem to Prm UnitA2.

Subgoal 2.1:

Variables: A B LA LB NL C1 NL1
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 (or LB C1)
IsA : is_list is_lit A
IsB : is_list is_lit B
UnitA : unit_clause A (or LB C1) LA @
Prm : permutation A B
UnitA1 : negate_lit LB NL
UnitA2 : mem NL A
UnitA3 : unit_clause A C1 LA *
UnitB : mem LB B -> false
UnitB1 : negate_lit LB NL1
UnitB2 : mem NL1 B -> false
UnitB3 : unsat_clause B C1
MemB : mem NL B
============================
 LA = LB
 < Is: case IsC.

Subgoal 2.1:

Variables: A B LA LB NL C1 NL1
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 (or LB C1) LA @
Prm : permutation A B
UnitA1 : negate_lit LB NL
UnitA2 : mem NL A
UnitA3 : unit_clause A C1 LA *
UnitB : mem LB B -> false
UnitB1 : negate_lit LB NL1
UnitB2 : mem NL1 B -> false
UnitB3 : unsat_clause B C1
MemB : mem NL B
Is : is_lit LB
Is1 : is_clause C1
============================
 LA = LB
 < apply negate_lit_unique to _ UnitA1 UnitB1.

Subgoal 2.1:

Variables: A B LA LB C1 NL1
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 (or LB C1) LA @
Prm : permutation A B
UnitA1 : negate_lit LB NL1
UnitA2 : mem NL1 A
UnitA3 : unit_clause A C1 LA *
UnitB : mem LB B -> false
UnitB1 : negate_lit LB NL1
UnitB2 : mem NL1 B -> false
UnitB3 : unsat_clause B C1
MemB : mem NL1 B
Is : is_lit LB
Is1 : is_clause C1
============================
 LA = LB
 < apply UnitB2 to MemB.

Subgoal 2.2:

Variables: A B LA LB NL C1 L NL1
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 (or L C1)
IsA : is_list is_lit A
IsB : is_list is_lit B
UnitA : unit_clause A (or L C1) LA @
Prm : permutation A B
UnitA1 : negate_lit L NL
UnitA2 : mem NL A
UnitA3 : unit_clause A C1 LA *
UnitB : negate_lit L NL1
UnitB1 : mem NL1 B
UnitB2 : unit_clause B C1 LB
============================
 LA = LB
 < case IsC.

Subgoal 2.2:

Variables: A B LA LB NL C1 L NL1
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 (or L C1) LA @
Prm : permutation A B
UnitA1 : negate_lit L NL
UnitA2 : mem NL A
UnitA3 : unit_clause A C1 LA *
UnitB : negate_lit L NL1
UnitB1 : mem NL1 B
UnitB2 : unit_clause B C1 LB
H1 : is_lit L
H2 : is_clause C1
============================
 LA = LB
 < apply IH to _ _ _ UnitA3 _ _.

Subgoal 2.2:

Variables: A B LB NL C1 L NL1
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 (or L C1) LB @
Prm : permutation A B
UnitA1 : negate_lit L NL
UnitA2 : mem NL A
UnitA3 : unit_clause A C1 LB *
UnitB : negate_lit L NL1
UnitB1 : mem NL1 B
UnitB2 : unit_clause B C1 LB
H1 : is_lit L
H2 : is_clause C1
============================
 LB = LB
 < search.

Proof completed.
 < Extensible_Theorem
      unit_clause_not_assigned : forall A C L,
         IsC : is_clause C ->
         IsA : is_list is_lit A ->
         UC : unit_clause A C L ->
         Mem : mem L A ->
         false
      on UC.

Subgoal 1:

Variables: A L NL C1
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 (or L C1)
IsA : is_list is_lit A
UC : unit_clause A (or L C1) L @
Mem : mem L A
UC1 : mem L A -> false
UC2 : negate_lit L NL
UC3 : mem NL A -> false
UC4 : unsat_clause A C1
============================
 false
 < backchain UC1.

Subgoal 2:

Variables: A L NL C1 L1
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 (or L1 C1)
IsA : is_list is_lit A
UC : unit_clause A (or L1 C1) L @
Mem : mem L A
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
============================
 false
 < case IsC.

Subgoal 2:

Variables: A L NL C1 L1
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 (or L1 C1) L @
Mem : mem L A
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
H1 : is_lit L1
H2 : is_clause C1
============================
 false
 < apply IH to _ _ UC3 Mem.

Proof completed.
 < Extensible_Theorem
      unit_clause_not_assigned_negate : forall A C L NL,
         IsC : is_clause C ->
         IsA : is_list is_lit A ->
         UC : unit_clause A C L ->
         Neg : negate_lit L NL ->
         Mem : mem NL A ->
         false
      on UC.

Subgoal 1:

Variables: A L NL NL1 C1
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 (or L C1)
IsA : is_list is_lit A
UC : unit_clause A (or L C1) L @
Neg : negate_lit L NL
Mem : mem NL A
UC1 : mem L A -> false
UC2 : negate_lit L NL1
UC3 : mem NL1 A -> false
UC4 : unsat_clause A C1
============================
 false
 < backchain UC3.

Subgoal 1:

Variables: A L NL NL1 C1
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 (or L C1)
IsA : is_list is_lit A
UC : unit_clause A (or L C1) L @
Neg : negate_lit L NL
Mem : mem NL A
UC1 : mem L A -> false
UC2 : negate_lit L NL1
UC3 : mem NL1 A -> false
UC4 : unsat_clause A C1
============================
 mem NL1 A
 < apply unit_clause_is to _ _ UC.

Subgoal 1:

Variables: A L NL NL1 C1
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 (or L C1)
IsA : is_list is_lit A
UC : unit_clause A (or L C1) L @
Neg : negate_lit L NL
Mem : mem NL A
UC1 : mem L A -> false
UC2 : negate_lit L NL1
UC3 : mem NL1 A -> false
UC4 : unsat_clause A C1
H1 : is_lit L
============================
 mem NL1 A
 < apply negate_lit_unique to _ Neg UC2.

Subgoal 1:

Variables: A L NL1 C1
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 (or L C1)
IsA : is_list is_lit A
UC : unit_clause A (or L C1) L @
Neg : negate_lit L NL1
Mem : mem NL1 A
UC1 : mem L A -> false
UC2 : negate_lit L NL1
UC3 : mem NL1 A -> false
UC4 : unsat_clause A C1
H1 : is_lit L
============================
 mem NL1 A
 < search.

Subgoal 2:

Variables: A L NL NL1 C1 L1
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 (or L1 C1)
IsA : is_list is_lit A
UC : unit_clause A (or L1 C1) L @
Neg : negate_lit L NL
Mem : mem NL A
UC1 : negate_lit L1 NL1
UC2 : mem NL1 A
UC3 : unit_clause A C1 L *
============================
 false
 < case IsC.

Subgoal 2:

Variables: A L NL NL1 C1 L1
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 (or L1 C1) L @
Neg : negate_lit L NL
Mem : mem NL A
UC1 : negate_lit L1 NL1
UC2 : mem NL1 A
UC3 : unit_clause A C1 L *
H1 : is_lit L1
H2 : is_clause C1
============================
 false
 < apply IH to _ _ UC3 _ _.

Proof completed.
 < Extensible_Theorem
      unit_clause_expand : forall A C L E,
         IsC : is_clause C ->
         IsA : is_list is_lit A ->
         IsE : is_list is_lit E ->
         UC : unit_clause A C L ->
         SAT : sat_clause E C ->
         GA_A : good_assignment A ->
         GA_E : good_assignment E ->
         Expand : (forall L,
           mem L A -> mem L E) ->
         mem L E
      on UC.

Subgoal 1:

Variables: A L E NL C1
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 (or L C1)
IsA : is_list is_lit A
IsE : is_list is_lit E
UC : unit_clause A (or L C1) L @
SAT : sat_clause E (or L C1)
GA_A : good_assignment A
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : mem L A -> false
UC2 : negate_lit L NL
UC3 : mem NL A -> false
UC4 : unsat_clause A C1
============================
 mem L E
 < SAT: case SAT.

Subgoal 1.1:

Variables: A L E NL C1
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 (or L C1)
IsA : is_list is_lit A
IsE : is_list is_lit E
UC : unit_clause A (or L C1) L @
GA_A : good_assignment A
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : mem L A -> false
UC2 : negate_lit L NL
UC3 : mem NL A -> false
UC4 : unsat_clause A C1
SAT : mem L E
============================
 mem L E
 < search.

Subgoal 1.2:

Variables: A L E NL C1
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 (or L C1)
IsA : is_list is_lit A
IsE : is_list is_lit E
UC : unit_clause A (or L C1) L @
GA_A : good_assignment A
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : mem L A -> false
UC2 : negate_lit L NL
UC3 : mem NL A -> false
UC4 : unsat_clause A C1
SAT : sat_clause E C1
============================
 mem L E
 < Is: case IsC.

Subgoal 1.2:

Variables: A L E NL C1
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 (or L C1) L @
GA_A : good_assignment A
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : mem L A -> false
UC2 : negate_lit L NL
UC3 : mem NL A -> false
UC4 : unsat_clause A C1
SAT : sat_clause E C1
Is : is_lit L
Is1 : is_clause C1
============================
 mem L E
 < UCE: apply unsat_clause_orderless to _ _ _ UC4 Expand.

Subgoal 1.2:

Variables: A L E NL C1
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 (or L C1) L @
GA_A : good_assignment A
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : mem L A -> false
UC2 : negate_lit L NL
UC3 : mem NL A -> false
UC4 : unsat_clause A C1
SAT : sat_clause E C1
Is : is_lit L
Is1 : is_clause C1
UCE : unsat_clause E C1
============================
 mem L E
 < apply unsat_sat_clause to _ _ UCE SAT _.

Subgoal 2:

Variables: A L E NL C1 L1
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 (or L1 C1)
IsA : is_list is_lit A
IsE : is_list is_lit E
UC : unit_clause A (or L1 C1) L @
SAT : sat_clause E (or L1 C1)
GA_A : good_assignment A
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
============================
 mem L E
 < SAT: case SAT.

Subgoal 2.1:

Variables: A L E NL C1 L1
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 (or L1 C1)
IsA : is_list is_lit A
IsE : is_list is_lit E
UC : unit_clause A (or L1 C1) L @
GA_A : good_assignment A
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : mem L1 E
============================
 mem L E
 < GA_A: case GA_A.

Subgoal 2.1:

Variables: A L E NL C1 L1
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 (or L1 C1)
IsA : is_list is_lit A
IsE : is_list is_lit E
UC : unit_clause A (or L1 C1) L @
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : mem L1 E
GA_A : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
============================
 mem L E
 < Is: case IsC.

Subgoal 2.1:

Variables: A L E NL C1 L1
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 (or L1 C1) L @
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : mem L1 E
GA_A : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
Is : is_lit L1
Is1 : is_clause C1
============================
 mem L E
 < Neg: apply negate_lit_reverse to _ UC1.

Subgoal 2.1:

Variables: A L E NL C1 L1
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 (or L1 C1) L @
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : mem L1 E
GA_A : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
Is : is_lit L1
Is1 : is_clause C1
Neg : negate_lit NL L1
============================
 mem L E
 < apply GA_A to UC2 Neg _.

Subgoal 2.1:

Variables: A L E NL C1 L1
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 (or L1 C1) L @
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : mem L1 E
GA_A : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
Is : is_lit L1
Is1 : is_clause C1
Neg : negate_lit NL L1
============================
 mem L1 A
 < GA_E: case GA_E.

Subgoal 2.1:

Variables: A L E NL C1 L1
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 (or L1 C1) L @
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : mem L1 E
GA_A : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
Is : is_lit L1
Is1 : is_clause C1
Neg : negate_lit NL L1
GA_E : forall L NL, mem L E -> negate_lit L NL -> mem NL E -> false
============================
 mem L1 A
 < apply GA_E to SAT UC1 _.

Subgoal 2.1:

Variables: A L E NL C1 L1
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 (or L1 C1) L @
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : mem L1 E
GA_A : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
Is : is_lit L1
Is1 : is_clause C1
Neg : negate_lit NL L1
GA_E : forall L NL, mem L E -> negate_lit L NL -> mem NL E -> false
============================
 mem NL E
 < apply Expand to UC2.

Subgoal 2.1:

Variables: A L E NL C1 L1
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 (or L1 C1) L @
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : mem L1 E
GA_A : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
Is : is_lit L1
Is1 : is_clause C1
Neg : negate_lit NL L1
GA_E : forall L NL, mem L E -> negate_lit L NL -> mem NL E -> false
H1 : mem NL E
============================
 mem NL E
 < search.

Subgoal 2.2:

Variables: A L E NL C1 L1
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 (or L1 C1)
IsA : is_list is_lit A
IsE : is_list is_lit E
UC : unit_clause A (or L1 C1) L @
GA_A : good_assignment A
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : sat_clause E C1
============================
 mem L E
 < case IsC.

Subgoal 2.2:

Variables: A L E NL C1 L1
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 (or L1 C1) L @
GA_A : good_assignment A
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : sat_clause E C1
H1 : is_lit L1
H2 : is_clause C1
============================
 mem L E
 < apply IH to _ _ _ UC3 _ _ _ _.

Subgoal 2.2:

Variables: A L E NL C1 L1
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 (or L1 C1) L @
GA_A : good_assignment A
GA_E : good_assignment E
Expand : forall L, mem L A -> mem L E
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
SAT : sat_clause E C1
H1 : is_lit L1
H2 : is_clause C1
H3 : mem L E
============================
 mem L E
 < search.

Proof completed.
 < Extensible_Theorem
      unit_clause_add : forall A S C L,
         IsC : is_clause C ->
         IsA : is_list is_lit A ->
         IsS : is_list is_lit S ->
         UC : unit_clause A C L ->
         Mem : mem L S ->
         sat_clause S C
      on UC.

Subgoal 1:

Variables: A S L NL C1
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 (or L C1)
IsA : is_list is_lit A
IsS : is_list is_lit S
UC : unit_clause A (or L C1) L @
Mem : mem L S
UC1 : mem L A -> false
UC2 : negate_lit L NL
UC3 : mem NL A -> false
UC4 : unsat_clause A C1
============================
 sat_clause S (or L C1)
 < search.

Subgoal 2:

Variables: A S L NL C1 L1
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 (or L1 C1)
IsA : is_list is_lit A
IsS : is_list is_lit S
UC : unit_clause A (or L1 C1) L @
Mem : mem L S
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
============================
 sat_clause S (or L1 C1)
 < case IsC.

Subgoal 2:

Variables: A S L NL C1 L1
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 (or L1 C1) L @
Mem : mem L S
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
H1 : is_lit L1
H2 : is_clause C1
============================
 sat_clause S (or L1 C1)
 < apply IH to _ _ _ UC3 _.

Subgoal 2:

Variables: A S L NL C1 L1
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 (or L1 C1) L @
Mem : mem L S
UC1 : negate_lit L1 NL
UC2 : mem NL A
UC3 : unit_clause A C1 L *
H1 : is_lit L1
H2 : is_clause C1
H3 : sat_clause S C1
============================
 sat_clause S (or L1 C1)
 < search.

Proof completed.
 < Theorem remove_all_no_lookup :
     forall Known ID KRest, remove_all Known ID KRest -> no_lookup KRest ID.

============================
 forall Known ID KRest, remove_all Known ID KRest -> no_lookup KRest ID
 < induction on 1.

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

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

Subgoal 1:

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

Subgoal 2:

Variables: ID KRest IRest C
IH : forall Known ID KRest, remove_all Known ID KRest * -> no_lookup KRest ID
RA : remove_all IRest ID KRest *
============================
 no_lookup KRest ID
 < apply IH to RA.

Subgoal 2:

Variables: ID KRest IRest C
IH : forall Known ID KRest, remove_all Known ID KRest * -> no_lookup KRest ID
RA : remove_all IRest ID KRest *
H1 : no_lookup KRest ID
============================
 no_lookup KRest ID
 < search.

Subgoal 3:

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

Subgoal 3:

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

Proof completed.
 < Theorem remove_all_no_mem :
     forall Known ID KRest C,
       remove_all Known ID KRest -> mem (ID, C) KRest -> false.

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

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

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

Subgoal 1:

Variables: ID C
IH : forall Known ID KRest C,
       remove_all Known ID KRest * -> mem (ID, C) KRest -> false
M : mem (ID, C) []
============================
 false
 < case M.

Subgoal 2:

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

Subgoal 3:

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

Subgoal 3.1:

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

Subgoal 3.2:

Variables: ID C Rest C1 A IRest
IH : forall Known ID KRest C,
       remove_all Known ID KRest * -> mem (ID, C) KRest -> false
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
M : mem (ID, C) Rest
============================
 false
 < apply IH to RA1 M.

Proof completed.
 < Theorem remove_all_still_mem :
     forall Known ID KRest Other C,
       remove_all Known ID KRest -> mem (Other, C) Known -> (ID = Other -> false) ->
       mem (Other, C) KRest.

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

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

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

Subgoal 1:

Variables: ID Other C
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) Known -> (ID = Other -> false) ->
       mem (Other, C) KRest
M : mem (Other, C) []
NEq : ID = Other -> false
============================
 mem (Other, C) []
 < case M.

Subgoal 2:

Variables: ID KRest Other C IRest C1
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) Known -> (ID = Other -> false) ->
       mem (Other, C) KRest
M : mem (Other, C) ((ID, C1)::IRest)
NEq : ID = Other -> false
RA : remove_all IRest ID KRest *
============================
 mem (Other, C) KRest
 < M: case M.

Subgoal 2.1:

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

Subgoal 2.2:

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

Subgoal 2.2:

Variables: ID KRest Other C IRest C1
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) Known -> (ID = Other -> false) ->
       mem (Other, C) KRest
NEq : ID = Other -> false
RA : remove_all IRest ID KRest *
M : mem (Other, C) IRest
H1 : mem (Other, C) KRest
============================
 mem (Other, C) KRest
 < search.

Subgoal 3:

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

Subgoal 3.1:

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

Subgoal 3.2:

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

Subgoal 3.2:

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

Proof completed.
 < Theorem remove_all_mem_after :
     forall Known ID KRest Other C,
       remove_all Known ID KRest -> mem (Other, C) KRest -> mem (Other, C) Known.

============================
 forall Known ID KRest Other C,
   remove_all Known ID KRest -> mem (Other, C) KRest -> mem (Other, C) Known
 < induction on 1.

IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) KRest -> mem (Other, C) Known
============================
 forall Known ID KRest Other C,
   remove_all Known ID KRest @ -> mem (Other, C) KRest -> mem (Other, C) Known
 < intros RA M.

Variables: Known ID KRest Other C
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) KRest -> mem (Other, C) Known
RA : remove_all Known ID KRest @
M : mem (Other, C) KRest
============================
 mem (Other, C) Known
 < RA: case RA.

Subgoal 1:

Variables: ID Other C
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) KRest -> mem (Other, C) Known
M : mem (Other, C) []
============================
 mem (Other, C) []
 < search.

Subgoal 2:

Variables: ID KRest Other C IRest C1
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) KRest -> mem (Other, C) Known
M : mem (Other, C) KRest
RA : remove_all IRest ID KRest *
============================
 mem (Other, C) ((ID, C1)::IRest)
 < apply IH to RA M.

Subgoal 2:

Variables: ID KRest Other C IRest C1
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) KRest -> mem (Other, C) Known
M : mem (Other, C) KRest
RA : remove_all IRest ID KRest *
H1 : mem (Other, C) IRest
============================
 mem (Other, C) ((ID, C1)::IRest)
 < search.

Subgoal 3:

Variables: ID Other C Rest C1 A IRest
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) KRest -> mem (Other, C) Known
M : mem (Other, C) ((A, C1)::Rest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 mem (Other, C) ((A, C1)::IRest)
 < M: case M.

Subgoal 3.1:

Variables: ID Rest C1 A IRest
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) KRest -> mem (Other, C) Known
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 mem (A, C1) ((A, C1)::IRest)
 < search.

Subgoal 3.2:

Variables: ID Other C Rest C1 A IRest
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) KRest -> mem (Other, C) Known
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
M : mem (Other, C) Rest
============================
 mem (Other, C) ((A, C1)::IRest)
 < apply IH to RA1 M.

Subgoal 3.2:

Variables: ID Other C Rest C1 A IRest
IH : forall Known ID KRest Other C,
       remove_all Known ID KRest * -> mem (Other, C) KRest -> mem (Other, C) Known
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
M : mem (Other, C) Rest
H1 : mem (Other, C) IRest
============================
 mem (Other, C) ((A, C1)::IRest)
 < search.

Proof completed.
 < Theorem remove_all_lookup_after :
     forall Known KRest ID Other C,
       remove_all Known ID KRest -> lookup KRest Other C -> lookup Known Other C.

============================
 forall Known KRest ID Other C,
   remove_all Known ID KRest -> lookup KRest Other C -> lookup Known Other C
 < induction on 1.

IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
============================
 forall Known KRest ID Other C,
   remove_all Known ID KRest @ -> lookup KRest Other C -> lookup Known Other C
 < intros RA Lkp.

Variables: Known KRest ID Other C
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
RA : remove_all Known ID KRest @
Lkp : lookup KRest Other C
============================
 lookup Known Other C
 < RA: case RA.

Subgoal 1:

Variables: ID Other C
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
Lkp : lookup [] Other C
============================
 lookup [] Other C
 < search.

Subgoal 2:

Variables: KRest ID Other C IRest C1
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
Lkp : lookup KRest Other C
RA : remove_all IRest ID KRest *
============================
 lookup ((ID, C1)::IRest) Other C
 < assert ID = Other -> false.

Subgoal 2.1:

Variables: KRest ID Other C IRest C1
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
Lkp : lookup KRest Other C
RA : remove_all IRest ID KRest *
============================
 ID = Other -> false
 < intros E.

Subgoal 2.1:

Variables: KRest ID Other C IRest C1
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
Lkp : lookup KRest Other C
RA : remove_all IRest ID KRest *
E : ID = Other
============================
 false
 < case E.

Subgoal 2.1:

Variables: KRest Other C IRest C1
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
Lkp : lookup KRest Other C
RA : remove_all IRest Other KRest *
============================
 false
 < M: apply lookup_mem to Lkp.

Subgoal 2.1:

Variables: KRest Other C IRest C1
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
Lkp : lookup KRest Other C
RA : remove_all IRest Other KRest *
M : mem (Other, C) KRest
============================
 false
 < backchain remove_all_no_mem.

Subgoal 2:

Variables: KRest ID Other C IRest C1
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
Lkp : lookup KRest Other C
RA : remove_all IRest ID KRest *
H1 : ID = Other -> false
============================
 lookup ((ID, C1)::IRest) Other C
 < apply IH to RA Lkp.

Subgoal 2:

Variables: KRest ID Other C IRest C1
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
Lkp : lookup KRest Other C
RA : remove_all IRest ID KRest *
H1 : ID = Other -> false
H2 : lookup IRest Other C
============================
 lookup ((ID, C1)::IRest) Other C
 < search.

Subgoal 3:

Variables: ID Other C Rest C1 A IRest
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
Lkp : lookup ((A, C1)::Rest) Other C
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 lookup ((A, C1)::IRest) Other C
 < Lkp: case Lkp.

Subgoal 3.1:

Variables: ID Other C Rest IRest
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
RA : Other = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 lookup ((Other, C)::IRest) Other C
 < search.

Subgoal 3.2:

Variables: ID Other C Rest C1 A IRest
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
Lkp : A = Other -> false
Lkp1 : lookup Rest Other C
============================
 lookup ((A, C1)::IRest) Other C
 < apply IH to RA1 Lkp1.

Subgoal 3.2:

Variables: ID Other C Rest C1 A IRest
IH : forall Known KRest ID Other C,
       remove_all Known ID KRest * -> lookup KRest Other C -> lookup Known Other C
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
Lkp : A = Other -> false
Lkp1 : lookup Rest Other C
H1 : lookup IRest Other C
============================
 lookup ((A, C1)::IRest) Other C
 < search.

Proof completed.
 < Theorem remove_all_is :
     forall Known ID KRest,
       is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest ->
       is_list (is_pair is_integer is_clause) KRest.

============================
 forall Known ID KRest,
   is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest -> is_list (is_pair is_integer is_clause) KRest
 < induction on 2.

IH : forall Known ID KRest,
       is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest * ->
       is_list (is_pair is_integer is_clause) KRest
============================
 forall Known ID KRest,
   is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest @ ->
   is_list (is_pair is_integer is_clause) KRest
 < intros Is RA.

Variables: Known ID KRest
IH : forall Known ID KRest,
       is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest * ->
       is_list (is_pair is_integer is_clause) KRest
Is : is_list (is_pair is_integer is_clause) Known
RA : remove_all Known ID KRest @
============================
 is_list (is_pair is_integer is_clause) KRest
 < RA: case RA.

Subgoal 1:

Variables: ID
IH : forall Known ID KRest,
       is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest * ->
       is_list (is_pair is_integer is_clause) KRest
Is : is_list (is_pair is_integer is_clause) []
============================
 is_list (is_pair is_integer is_clause) []
 < search.

Subgoal 2:

Variables: ID KRest IRest C
IH : forall Known ID KRest,
       is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest * ->
       is_list (is_pair is_integer is_clause) KRest
Is : is_list (is_pair is_integer is_clause) ((ID, C)::IRest)
RA : remove_all IRest ID KRest *
============================
 is_list (is_pair is_integer is_clause) KRest
 < Is: case Is.

Subgoal 2:

Variables: ID KRest IRest C
IH : forall Known ID KRest,
       is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest * ->
       is_list (is_pair is_integer is_clause) KRest
RA : remove_all IRest ID KRest *
Is : is_pair is_integer is_clause (ID, C)
Is1 : is_list (is_pair is_integer is_clause) IRest
============================
 is_list (is_pair is_integer is_clause) KRest
 < apply IH to Is1 RA.

Subgoal 2:

Variables: ID KRest IRest C
IH : forall Known ID KRest,
       is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest * ->
       is_list (is_pair is_integer is_clause) KRest
RA : remove_all IRest ID KRest *
Is : is_pair is_integer is_clause (ID, C)
Is1 : is_list (is_pair is_integer is_clause) IRest
H1 : is_list (is_pair is_integer is_clause) KRest
============================
 is_list (is_pair is_integer is_clause) KRest
 < search.

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall Known ID KRest,
       is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest * ->
       is_list (is_pair is_integer is_clause) KRest
Is : is_list (is_pair is_integer is_clause) ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 is_list (is_pair is_integer is_clause) ((A, C)::Rest)
 < Is: case Is.

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall Known ID KRest,
       is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest * ->
       is_list (is_pair is_integer is_clause) KRest
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
Is : is_pair is_integer is_clause (A, C)
Is1 : is_list (is_pair is_integer is_clause) IRest
============================
 is_list (is_pair is_integer is_clause) ((A, C)::Rest)
 < apply IH to Is1 RA1.

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall Known ID KRest,
       is_list (is_pair is_integer is_clause) Known -> remove_all Known ID KRest * ->
       is_list (is_pair is_integer is_clause) KRest
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
Is : is_pair is_integer is_clause (A, C)
Is1 : is_list (is_pair is_integer is_clause) IRest
H1 : is_list (is_pair is_integer is_clause) Rest
============================
 is_list (is_pair is_integer is_clause) ((A, C)::Rest)
 < search.

Proof completed.
 < Theorem is_remove_all_exists :
     forall Known ID,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID -> exists KRest,
         remove_all Known ID KRest.

============================
 forall Known ID,
   is_list (is_pair is_integer is_clause) Known -> is_integer ID -> exists KRest,
     remove_all Known ID KRest
 < induction on 1.

IH : forall Known ID,
       is_list (is_pair is_integer is_clause) Known * -> is_integer ID -> exists KRest,
         remove_all Known ID KRest
============================
 forall Known ID,
   is_list (is_pair is_integer is_clause) Known @ -> is_integer ID -> exists KRest,
     remove_all Known ID KRest
 < intros IsKnown IsID.

Variables: Known ID
IH : forall Known ID,
       is_list (is_pair is_integer is_clause) Known * -> is_integer ID -> exists KRest,
         remove_all Known ID KRest
IsKnown : is_list (is_pair is_integer is_clause) Known @
IsID : is_integer ID
============================
 exists KRest, remove_all Known ID KRest
 < Is: case IsKnown.

Subgoal 1:

Variables: ID
IH : forall Known ID,
       is_list (is_pair is_integer is_clause) Known * -> is_integer ID -> exists KRest,
         remove_all Known ID KRest
IsID : is_integer ID
============================
 exists KRest, remove_all [] ID KRest
 < search.

Subgoal 2:

Variables: ID T H
IH : forall Known ID,
       is_list (is_pair is_integer is_clause) Known * -> is_integer ID -> exists KRest,
         remove_all Known ID KRest
IsID : is_integer ID
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
============================
 exists KRest, remove_all (H::T) ID KRest
 < apply IH to Is1 IsID.

Subgoal 2:

Variables: ID T H KRest
IH : forall Known ID,
       is_list (is_pair is_integer is_clause) Known * -> is_integer ID -> exists KRest,
         remove_all Known ID KRest
IsID : is_integer ID
Is : is_pair is_integer is_clause H
Is1 : is_list (is_pair is_integer is_clause) T *
H1 : remove_all T ID KRest
============================
 exists KRest, remove_all (H::T) ID KRest
 < Is: case Is.

Subgoal 2:

Variables: ID T KRest B A
IH : forall Known ID,
       is_list (is_pair is_integer is_clause) Known * -> is_integer ID -> exists KRest,
         remove_all Known ID KRest
IsID : is_integer ID
Is1 : is_list (is_pair is_integer is_clause) T *
H1 : remove_all T ID KRest
Is : is_integer A
Is2 : is_clause B
============================
 exists KRest, remove_all ((A, B)::T) ID KRest
 < Or: apply is_integer_eq_or_not to Is IsID.

Subgoal 2:

Variables: ID T KRest B A
IH : forall Known ID,
       is_list (is_pair is_integer is_clause) Known * -> is_integer ID -> exists KRest,
         remove_all Known ID KRest
IsID : is_integer ID
Is1 : is_list (is_pair is_integer is_clause) T *
H1 : remove_all T ID KRest
Is : is_integer A
Is2 : is_clause B
Or : A = ID \/ (A = ID -> false)
============================
 exists KRest, remove_all ((A, B)::T) ID KRest
 < E: case Or.

Subgoal 2.1:

Variables: ID T KRest B
IH : forall Known ID,
       is_list (is_pair is_integer is_clause) Known * -> is_integer ID -> exists KRest,
         remove_all Known ID KRest
IsID : is_integer ID
Is1 : is_list (is_pair is_integer is_clause) T *
H1 : remove_all T ID KRest
Is : is_integer ID
Is2 : is_clause B
============================
 exists KRest, remove_all ((ID, B)::T) ID KRest
 < search.

Subgoal 2.2:

Variables: ID T KRest B A
IH : forall Known ID,
       is_list (is_pair is_integer is_clause) Known * -> is_integer ID -> exists KRest,
         remove_all Known ID KRest
IsID : is_integer ID
Is1 : is_list (is_pair is_integer is_clause) T *
H1 : remove_all T ID KRest
Is : is_integer A
Is2 : is_clause B
E : A = ID -> false
============================
 exists KRest, remove_all ((A, B)::T) ID KRest
 < search.

Proof completed.
 < Theorem remove_all_counts :
     forall Known ID KRest IDC N,
       remove_all Known ID KRest -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N.

============================
 forall Known ID KRest IDC N,
   remove_all Known ID KRest -> count IDC Known N -> ((exists C, IDC = (ID, C)) ->
   false) -> count IDC KRest N
 < induction on 1.

IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
============================
 forall Known ID KRest IDC N,
   remove_all Known ID KRest @ -> count IDC Known N -> ((exists C,
     IDC = (ID, C)) -> false) -> count IDC KRest N
 < intros RA C NEq.

Variables: Known ID KRest IDC N
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
RA : remove_all Known ID KRest @
C : count IDC Known N
NEq : (exists C, IDC = (ID, C)) -> false
============================
 count IDC KRest N
 < RA: case RA.

Subgoal 1:

Variables: ID IDC N
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
C : count IDC [] N
NEq : (exists C, IDC = (ID, C)) -> false
============================
 count IDC [] N
 < case C.

Subgoal 1:

Variables: ID IDC
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
NEq : (exists C, IDC = (ID, C)) -> false
============================
 count IDC [] 0
 < search.

Subgoal 2:

Variables: ID KRest IDC N IRest C
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
C : count IDC ((ID, C)::IRest) N
NEq : (exists C, IDC = (ID, C)) -> false
RA : remove_all IRest ID KRest *
============================
 count IDC KRest N
 < C: case C.

Subgoal 2.1:

Variables: ID KRest N IRest C N1
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
NEq : (exists C1, (ID, C) = (ID, C1)) -> false
RA : remove_all IRest ID KRest *
C : count (ID, C) IRest N1
C1 : 1 + N1 = N
============================
 count (ID, C) KRest N
 < apply NEq to _.

Subgoal 2.2:

Variables: ID KRest IDC N IRest C
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
NEq : (exists C, IDC = (ID, C)) -> false
RA : remove_all IRest ID KRest *
C : IDC = (ID, C) -> false
C1 : count IDC IRest N
============================
 count IDC KRest N
 < apply IH to RA C1 NEq.

Subgoal 2.2:

Variables: ID KRest IDC N IRest C
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
NEq : (exists C, IDC = (ID, C)) -> false
RA : remove_all IRest ID KRest *
C : IDC = (ID, C) -> false
C1 : count IDC IRest N
H1 : count IDC KRest N
============================
 count IDC KRest N
 < search.

Subgoal 3:

Variables: ID IDC N Rest C A IRest
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
C : count IDC ((A, C)::IRest) N
NEq : (exists C, IDC = (ID, C)) -> false
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 count IDC ((A, C)::Rest) N
 < C: case C.

Subgoal 3.1:

Variables: ID N Rest C A IRest N1
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
NEq : (exists C1, (A, C) = (ID, C1)) -> false
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
C : count (A, C) IRest N1
C1 : 1 + N1 = N
============================
 count (A, C) ((A, C)::Rest) N
 < apply IH to RA1 C _.

Subgoal 3.1:

Variables: ID N Rest C A IRest N1
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
NEq : (exists C1, (A, C) = (ID, C1)) -> false
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
C : count (A, C) IRest N1
C1 : 1 + N1 = N
H1 : count (A, C) Rest N1
============================
 count (A, C) ((A, C)::Rest) N
 < search.

Subgoal 3.2:

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

Subgoal 3.2:

Variables: ID IDC N Rest C A IRest
IH : forall Known ID KRest IDC N,
       remove_all Known ID KRest * -> count IDC Known N -> ((exists C,
         IDC = (ID, C)) -> false) -> count IDC KRest N
NEq : (exists C, IDC = (ID, C)) -> false
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
C : IDC = (A, C) -> false
C1 : count IDC IRest N
H1 : count IDC Rest N
============================
 count IDC ((A, C)::Rest) N
 < search.

Proof completed.
 < Theorem remove_all_permutation :
     forall Known ID KRest P,
       is_list (is_pair is_integer is_clause) Known -> is_integer ID -> remove_all Known ID KRest ->
       permutation Known P -> exists P',
         remove_all P ID P' /\ permutation KRest P'.

============================
 forall Known ID KRest P,
   is_list (is_pair is_integer is_clause) Known -> is_integer ID -> remove_all Known ID KRest ->
   permutation Known P -> exists P', remove_all P ID P' /\ permutation KRest P'
 < intros IsKnown IsID RA Prm.

Variables: Known ID KRest P
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
============================
 exists P', remove_all P ID P' /\ permutation KRest P'
 < Prm': apply permutation_symmetric to Prm.

Variables: Known ID KRest P
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
============================
 exists P', remove_all P ID P' /\ permutation KRest P'
 < IsP: apply permutation_is to IsKnown Prm'.

Variables: Known ID KRest P
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
============================
 exists P', remove_all P ID P' /\ permutation KRest P'
 < RAP: apply is_remove_all_exists to IsP IsID.

Variables: Known ID KRest P KRest1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
============================
 exists P', remove_all P ID P' /\ permutation KRest P'
 < IsKRest: apply remove_all_is to IsKnown RA.

Variables: Known ID KRest P KRest1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
============================
 exists P', remove_all P ID P' /\ permutation KRest P'
 < IsKRest1: apply remove_all_is to IsP RAP.

Variables: Known ID KRest P KRest1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
============================
 exists P', remove_all P ID P' /\ permutation KRest P'
 < assert forall X NL NP,
     is_pair is_integer is_clause X -> count X KRest NL -> count X KRest1 NP -> NL = NP.

Subgoal 1:

Variables: Known ID KRest P KRest1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
============================
 forall X NL NP,
   is_pair is_integer is_clause X -> count X KRest NL -> count X KRest1 NP -> NL = NP
 < intros IsX CKRest CKRest1.

Subgoal 1:

Variables: Known ID KRest P KRest1 X NL NP
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause X
CKRest : count X KRest NL
CKRest1 : count X KRest1 NP
============================
 NL = NP
 < Is: case IsX (keep).

Subgoal 1:

Variables: Known ID KRest P KRest1 NL NP B A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest NL
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
============================
 NL = NP
 < Or: apply is_integer_eq_or_not to Is IsID.

Subgoal 1:

Variables: Known ID KRest P KRest1 NL NP B A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest NL
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
Or : A = ID \/ (A = ID -> false)
============================
 NL = NP
 < E: case Or.

Subgoal 1.1:

Variables: Known ID KRest P KRest1 NL NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest NL
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
============================
 NL = NP
 < GEq: apply count_geq_0 to CKRest.

Subgoal 1.1:

Variables: Known ID KRest P KRest1 NL NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest NL
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
GEq : NL >= 0
============================
 NL = NP
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 1.1:

Variables: Known ID KRest P KRest1 NL NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest NL
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
GEq : NL >= 0
Or : NL > 0 \/ NL = 0
============================
 NL = NP
 < L: case Or.

Subgoal 1.1.1:

Variables: Known ID KRest P KRest1 NL NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest NL
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
GEq : NL >= 0
L : NL > 0
============================
 NL = NP
 < M: apply count_mem to CKRest L.

Subgoal 1.1.1:

Variables: Known ID KRest P KRest1 NL NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest NL
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
GEq : NL >= 0
L : NL > 0
M : mem (ID, B) KRest
============================
 NL = NP
 < apply remove_all_no_mem to RA M.

Subgoal 1.1.2:

Variables: Known ID KRest P KRest1 NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest 0
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
GEq : 0 >= 0
============================
 0 = NP
 < clear GEq.

Subgoal 1.1.2:

Variables: Known ID KRest P KRest1 NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest 0
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
============================
 0 = NP
 < GEq: apply count_geq_0 to CKRest1.

Subgoal 1.1.2:

Variables: Known ID KRest P KRest1 NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest 0
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
GEq : NP >= 0
============================
 0 = NP
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 1.1.2:

Variables: Known ID KRest P KRest1 NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest 0
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
GEq : NP >= 0
Or : NP > 0 \/ NP = 0
============================
 0 = NP
 < L: case Or.

Subgoal 1.1.2.1:

Variables: Known ID KRest P KRest1 NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest 0
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
GEq : NP >= 0
L : NP > 0
============================
 0 = NP
 < M: apply count_mem to CKRest1 L.

Subgoal 1.1.2.1:

Variables: Known ID KRest P KRest1 NP B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest 0
CKRest1 : count (ID, B) KRest1 NP
Is : is_integer ID
Is1 : is_clause B
GEq : NP >= 0
L : NP > 0
M : mem (ID, B) KRest1
============================
 0 = NP
 < apply remove_all_no_mem to RAP M.

Subgoal 1.1.2.2:

Variables: Known ID KRest P KRest1 B
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, B)
CKRest : count (ID, B) KRest 0
CKRest1 : count (ID, B) KRest1 0
Is : is_integer ID
Is1 : is_clause B
GEq : 0 >= 0
============================
 0 = 0
 < search.

Subgoal 1.2:

Variables: Known ID KRest P KRest1 NL NP B A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest NL
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
============================
 NL = NP
 < assert (exists C, (A, B) = (ID, C)) -> false.

Subgoal 1.2.1:

Variables: Known ID KRest P KRest1 NL NP B A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest NL
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
============================
 (exists C, (A, B) = (ID, C)) -> false
 < intros Ex.

Subgoal 1.2.1:

Variables: Known ID KRest P KRest1 NL NP B A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest NL
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
Ex : exists C, (A, B) = (ID, C)
============================
 false
 < case Ex.

Subgoal 1.2.1:

Variables: Known ID KRest P KRest1 NL NP C
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (ID, C)
CKRest : count (ID, C) KRest NL
CKRest1 : count (ID, C) KRest1 NP
Is : is_integer ID
Is1 : is_clause C
E : ID = ID -> false
============================
 false
 < backchain E.

Subgoal 1.2:

Variables: Known ID KRest P KRest1 NL NP B A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest NL
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
H1 : (exists C, (A, B) = (ID, C)) -> false
============================
 NL = NP
 < CKnown: apply is_count_exists to IsKnown IsX.

Subgoal 1.2:

Variables: Known ID KRest P KRest1 NL NP B A N
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest NL
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
H1 : (exists C, (A, B) = (ID, C)) -> false
CKnown : count (A, B) Known N
============================
 NL = NP
 < CKRest': apply remove_all_counts to RA CKnown _.

Subgoal 1.2:

Variables: Known ID KRest P KRest1 NL NP B A N
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest NL
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
H1 : (exists C, (A, B) = (ID, C)) -> false
CKnown : count (A, B) Known N
CKRest' : count (A, B) KRest N
============================
 NL = NP
 < CP: apply is_count_exists to IsP IsX.

Subgoal 1.2:

Variables: Known ID KRest P KRest1 NL NP B A N N1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest NL
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
H1 : (exists C, (A, B) = (ID, C)) -> false
CKnown : count (A, B) Known N
CKRest' : count (A, B) KRest N
CP : count (A, B) P N1
============================
 NL = NP
 < CKRest1': apply remove_all_counts to RAP CP _.

Subgoal 1.2:

Variables: Known ID KRest P KRest1 NL NP B A N N1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest NL
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
H1 : (exists C, (A, B) = (ID, C)) -> false
CKnown : count (A, B) Known N
CKRest' : count (A, B) KRest N
CP : count (A, B) P N1
CKRest1' : count (A, B) KRest1 N1
============================
 NL = NP
 < apply count_unique to CKRest CKRest'.

Subgoal 1.2:

Variables: Known ID KRest P KRest1 NP B A N N1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest N
CKRest1 : count (A, B) KRest1 NP
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
H1 : (exists C, (A, B) = (ID, C)) -> false
CKnown : count (A, B) Known N
CKRest' : count (A, B) KRest N
CP : count (A, B) P N1
CKRest1' : count (A, B) KRest1 N1
============================
 N = NP
 < apply count_unique to CKRest1 CKRest1'.

Subgoal 1.2:

Variables: Known ID KRest P KRest1 B A N N1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest N
CKRest1 : count (A, B) KRest1 N1
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
H1 : (exists C, (A, B) = (ID, C)) -> false
CKnown : count (A, B) Known N
CKRest' : count (A, B) KRest N
CP : count (A, B) P N1
CKRest1' : count (A, B) KRest1 N1
============================
 N = N1
 < apply permutation_counts to _ CKnown CP.

Subgoal 1.2:

Variables: Known ID KRest P KRest1 B A N1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
IsX : is_pair is_integer is_clause (A, B)
CKRest : count (A, B) KRest N1
CKRest1 : count (A, B) KRest1 N1
Is : is_integer A
Is1 : is_clause B
E : A = ID -> false
H1 : (exists C, (A, B) = (ID, C)) -> false
CKnown : count (A, B) Known N1
CKRest' : count (A, B) KRest N1
CP : count (A, B) P N1
CKRest1' : count (A, B) KRest1 N1
============================
 N1 = N1
 < search.

Variables: Known ID KRest P KRest1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
H1 : forall X NL NP,
       is_pair is_integer is_clause X -> count X KRest NL -> count X KRest1 NP ->
       NL = NP
============================
 exists P', remove_all P ID P' /\ permutation KRest P'
 < apply counts_permutation to IsKRest IsKRest1 _.

Variables: Known ID KRest P KRest1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsID : is_integer ID
RA : remove_all Known ID KRest
Prm : permutation Known P
Prm' : permutation P Known
IsP : is_list (is_pair is_integer is_clause) P
RAP : remove_all P ID KRest1
IsKRest : is_list (is_pair is_integer is_clause) KRest
IsKRest1 : is_list (is_pair is_integer is_clause) KRest1
H1 : forall X NL NP,
       is_pair is_integer is_clause X -> count X KRest NL -> count X KRest1 NP ->
       NL = NP
H2 : permutation KRest KRest1
============================
 exists P', remove_all P ID P' /\ permutation KRest P'
 < search.

Proof completed.
 < Define good_clause_list : (list (pair integer clause)) -> prop by
   good_clause_list Known :=
     forall ID C1 KRest C2,
       select (ID, C1) KRest Known -> mem (ID, C2) KRest -> false.


 < Theorem good_clause_list_drop :
     forall L IDC, good_clause_list (IDC::L) -> good_clause_list L.

============================
 forall L IDC, good_clause_list (IDC::L) -> good_clause_list L
 < intros GCL.

Variables: L IDC
GCL : good_clause_list (IDC::L)
============================
 good_clause_list L
 < GCL: case GCL.

Variables: L IDC
GCL : forall ID C1 KRest C2,
        select (ID, C1) KRest (IDC::L) -> mem (ID, C2) KRest -> false
============================
 good_clause_list L
 < unfold .

Variables: L IDC
GCL : forall ID C1 KRest C2,
        select (ID, C1) KRest (IDC::L) -> mem (ID, C2) KRest -> false
============================
 forall ID C1 KRest C2, select (ID, C1) KRest L -> mem (ID, C2) KRest -> false
 < intros S M.

Variables: L IDC ID C1 KRest C2
GCL : forall ID C1 KRest C2,
        select (ID, C1) KRest (IDC::L) -> mem (ID, C2) KRest -> false
S : select (ID, C1) KRest L
M : mem (ID, C2) KRest
============================
 false
 < backchain GCL to
   ID = ID
   C1 = C1.

Proof completed.
 < Theorem good_clause_list_select :
     forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L -> good_clause_list Rest.

============================
 forall L Rest ID C,
   good_clause_list L -> select (ID, C) Rest L -> good_clause_list Rest
 < induction on 2.

IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
============================
 forall L Rest ID C,
   good_clause_list L -> select (ID, C) Rest L @ -> good_clause_list Rest
 < intros GCL S.

Variables: L Rest ID C
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list L
S : select (ID, C) Rest L @
============================
 good_clause_list Rest
 < S: case S.

Subgoal 1:

Variables: Rest ID C
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list ((ID, C)::Rest)
============================
 good_clause_list Rest
 < apply good_clause_list_drop to GCL.

Subgoal 1:

Variables: Rest ID C
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list ((ID, C)::Rest)
H1 : good_clause_list Rest
============================
 good_clause_list Rest
 < search.

Subgoal 2:

Variables: ID C L2 I L1
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list (I::L2)
S : select (ID, C) L1 L2 *
============================
 good_clause_list (I::L1)
 < GCL': apply good_clause_list_drop to GCL.

Subgoal 2:

Variables: ID C L2 I L1
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list (I::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
============================
 good_clause_list (I::L1)
 < GCL1: apply IH to GCL' S.

Subgoal 2:

Variables: ID C L2 I L1
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list (I::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
============================
 good_clause_list (I::L1)
 < unfold .

Subgoal 2:

Variables: ID C L2 I L1
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list (I::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
============================
 forall ID C1 KRest C2,
   select (ID, C1) KRest (I::L1) -> mem (ID, C2) KRest -> false
 < intros Slct M.

Subgoal 2:

Variables: ID C L2 I L1 ID1 C1 KRest C2
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list (I::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
Slct : select (ID1, C1) KRest (I::L1)
M : mem (ID1, C2) KRest
============================
 false
 < Slct: case Slct.

Subgoal 2.1:

Variables: ID C L2 L1 ID1 C1 C2
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list ((ID1, C1)::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
M : mem (ID1, C2) L1
============================
 false
 < M': apply mem_after_select_before to S M.

Subgoal 2.1:

Variables: ID C L2 L1 ID1 C1 C2
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list ((ID1, C1)::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
M : mem (ID1, C2) L1
M' : mem (ID1, C2) L2
============================
 false
 < GCL: case GCL.

Subgoal 2.1:

Variables: ID C L2 L1 ID1 C1 C2
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
M : mem (ID1, C2) L1
M' : mem (ID1, C2) L2
GCL : forall ID C2 KRest C3,
        select (ID, C2) KRest ((ID1, C1)::L2) -> mem (ID, C3) KRest -> false
============================
 false
 < apply GCL to _ M'.

Subgoal 2.2:

Variables: ID C L2 I L1 ID1 C1 C2 L3
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list (I::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
M : mem (ID1, C2) (I::L3)
Slct : select (ID1, C1) L3 L1
============================
 false
 < M: case M.

Subgoal 2.2.1:

Variables: ID C L2 L1 ID1 C1 C2 L3
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list ((ID1, C2)::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
Slct : select (ID1, C1) L3 L1
============================
 false
 < MS: apply select_mem to Slct.

Subgoal 2.2.1:

Variables: ID C L2 L1 ID1 C1 C2 L3
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list ((ID1, C2)::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
Slct : select (ID1, C1) L3 L1
MS : mem (ID1, C1) L1
============================
 false
 < M': apply mem_after_select_before to S MS.

Subgoal 2.2.1:

Variables: ID C L2 L1 ID1 C1 C2 L3
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list ((ID1, C2)::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
Slct : select (ID1, C1) L3 L1
MS : mem (ID1, C1) L1
M' : mem (ID1, C1) L2
============================
 false
 < GCL: case GCL.

Subgoal 2.2.1:

Variables: ID C L2 L1 ID1 C1 C2 L3
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
Slct : select (ID1, C1) L3 L1
MS : mem (ID1, C1) L1
M' : mem (ID1, C1) L2
GCL : forall ID C1 KRest C3,
        select (ID, C1) KRest ((ID1, C2)::L2) -> mem (ID, C3) KRest -> false
============================
 false
 < backchain GCL.

Subgoal 2.2.2:

Variables: ID C L2 I L1 ID1 C1 C2 L3
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list (I::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
GCL1 : good_clause_list L1
Slct : select (ID1, C1) L3 L1
M : mem (ID1, C2) L3
============================
 false
 < GCL1: case GCL1.

Subgoal 2.2.2:

Variables: ID C L2 I L1 ID1 C1 C2 L3
IH : forall L Rest ID C,
       good_clause_list L -> select (ID, C) Rest L * -> good_clause_list Rest
GCL : good_clause_list (I::L2)
S : select (ID, C) L1 L2 *
GCL' : good_clause_list L2
Slct : select (ID1, C1) L3 L1
M : mem (ID1, C2) L3
GCL1 : forall ID C1 KRest C2,
         select (ID, C1) KRest L1 -> mem (ID, C2) KRest -> false
============================
 false
 < apply GCL1 to Slct M.

Proof completed.
 < Theorem good_clause_list_remove_all :
     forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest -> good_clause_list KRest.

============================
 forall Known ID KRest,
   good_clause_list Known -> remove_all Known ID KRest -> good_clause_list KRest
 < induction on 2.

IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
============================
 forall Known ID KRest,
   good_clause_list Known -> remove_all Known ID KRest @ -> good_clause_list KRest
 < intros GCL RA.

Variables: Known ID KRest
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list Known
RA : remove_all Known ID KRest @
============================
 good_clause_list KRest
 < RA: case RA.

Subgoal 1:

Variables: ID
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list []
============================
 good_clause_list []
 < search.

Subgoal 2:

Variables: ID KRest IRest C
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((ID, C)::IRest)
RA : remove_all IRest ID KRest *
============================
 good_clause_list KRest
 < GCL': apply good_clause_list_drop to GCL.

Subgoal 2:

Variables: ID KRest IRest C
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((ID, C)::IRest)
RA : remove_all IRest ID KRest *
GCL' : good_clause_list IRest
============================
 good_clause_list KRest
 < apply IH to GCL' RA.

Subgoal 2:

Variables: ID KRest IRest C
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((ID, C)::IRest)
RA : remove_all IRest ID KRest *
GCL' : good_clause_list IRest
H1 : good_clause_list KRest
============================
 good_clause_list KRest
 < search.

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
============================
 good_clause_list ((A, C)::Rest)
 < GCL': apply good_clause_list_drop to GCL.

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
============================
 good_clause_list ((A, C)::Rest)
 < GCLR: apply IH to GCL' RA1.

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
============================
 good_clause_list ((A, C)::Rest)
 < unfold .

Subgoal 3:

Variables: ID Rest C A IRest
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
============================
 forall ID C1 KRest C2,
   select (ID, C1) KRest ((A, C)::Rest) -> mem (ID, C2) KRest -> false
 < intros S M.

Subgoal 3:

Variables: ID Rest C A IRest ID1 C1 KRest1 C2
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
S : select (ID1, C1) KRest1 ((A, C)::Rest)
M : mem (ID1, C2) KRest1
============================
 false
 < S: case S.

Subgoal 3.1:

Variables: ID Rest C A IRest C2
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
M : mem (A, C2) Rest
============================
 false
 < M': apply remove_all_mem_after to RA1 M.

Subgoal 3.1:

Variables: ID Rest C A IRest C2
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
M : mem (A, C2) Rest
M' : mem (A, C2) IRest
============================
 false
 < GCL: case GCL.

Subgoal 3.1:

Variables: ID Rest C A IRest C2
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
M : mem (A, C2) Rest
M' : mem (A, C2) IRest
GCL : forall ID C1 KRest C2,
        select (ID, C1) KRest ((A, C)::IRest) -> mem (ID, C2) KRest -> false
============================
 false
 < backchain GCL.

Subgoal 3.2:

Variables: ID Rest C A IRest ID1 C1 C2 L1
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
M : mem (ID1, C2) ((A, C)::L1)
S : select (ID1, C1) L1 Rest
============================
 false
 < M': apply select_mem to S.

Subgoal 3.2:

Variables: ID Rest C A IRest ID1 C1 C2 L1
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
M : mem (ID1, C2) ((A, C)::L1)
S : select (ID1, C1) L1 Rest
M' : mem (ID1, C1) Rest
============================
 false
 < MS: apply remove_all_mem_after to RA1 M'.

Subgoal 3.2:

Variables: ID Rest C A IRest ID1 C1 C2 L1
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
M : mem (ID1, C2) ((A, C)::L1)
S : select (ID1, C1) L1 Rest
M' : mem (ID1, C1) Rest
MS : mem (ID1, C1) IRest
============================
 false
 < M: case M.

Subgoal 3.2.1:

Variables: ID Rest C A IRest C1 L1
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
S : select (A, C1) L1 Rest
M' : mem (A, C1) Rest
MS : mem (A, C1) IRest
============================
 false
 < GCL: case GCL.

Subgoal 3.2.1:

Variables: ID Rest C A IRest C1 L1
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
S : select (A, C1) L1 Rest
M' : mem (A, C1) Rest
MS : mem (A, C1) IRest
GCL : forall ID C1 KRest C2,
        select (ID, C1) KRest ((A, C)::IRest) -> mem (ID, C2) KRest -> false
============================
 false
 < backchain GCL.

Subgoal 3.2.2:

Variables: ID Rest C A IRest ID1 C1 C2 L1
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
GCLR : good_clause_list Rest
S : select (ID1, C1) L1 Rest
M' : mem (ID1, C1) Rest
MS : mem (ID1, C1) IRest
M : mem (ID1, C2) L1
============================
 false
 < GCLR: case GCLR.

Subgoal 3.2.2:

Variables: ID Rest C A IRest ID1 C1 C2 L1
IH : forall Known ID KRest,
       good_clause_list Known -> remove_all Known ID KRest * -> good_clause_list KRest
GCL : good_clause_list ((A, C)::IRest)
RA : A = ID -> false
RA1 : remove_all IRest ID Rest *
GCL' : good_clause_list IRest
S : select (ID1, C1) L1 Rest
M' : mem (ID1, C1) Rest
MS : mem (ID1, C1) IRest
M : mem (ID1, C2) L1
GCLR : forall ID C1 KRest C2,
         select (ID, C1) KRest Rest -> mem (ID, C2) KRest -> false
============================
 false
 < backchain GCLR.

Proof completed.
 < Theorem good_clause_list_add :
     forall Known ID C,
       good_clause_list Known -> ((exists C', mem (ID, C') Known) -> false) -> good_clause_list ((ID, C)::Known).

============================
 forall Known ID C,
   good_clause_list Known -> ((exists C', mem (ID, C') Known) -> false) -> good_clause_list ((ID, C)::Known)
 < intros GCL NMem.

Variables: Known ID C
GCL : good_clause_list Known
NMem : (exists C', mem (ID, C') Known) -> false
============================
 good_clause_list ((ID, C)::Known)
 < unfold .

Variables: Known ID C
GCL : good_clause_list Known
NMem : (exists C', mem (ID, C') Known) -> false
============================
 forall ID1 C1 KRest C2,
   select (ID1, C1) KRest ((ID, C)::Known) -> mem (ID1, C2) KRest -> false
 < intros S M.

Variables: Known ID C ID1 C1 KRest C2
GCL : good_clause_list Known
NMem : (exists C', mem (ID, C') Known) -> false
S : select (ID1, C1) KRest ((ID, C)::Known)
M : mem (ID1, C2) KRest
============================
 false
 < S: case S.

Subgoal 1:

Variables: Known ID C C2
GCL : good_clause_list Known
NMem : (exists C', mem (ID, C') Known) -> false
M : mem (ID, C2) Known
============================
 false
 < backchain NMem.

Subgoal 2:

Variables: Known ID C ID1 C1 C2 L1
GCL : good_clause_list Known
NMem : (exists C', mem (ID, C') Known) -> false
M : mem (ID1, C2) ((ID, C)::L1)
S : select (ID1, C1) L1 Known
============================
 false
 < M: case M.

Subgoal 2.1:

Variables: Known ID C C1 L1
GCL : good_clause_list Known
NMem : (exists C', mem (ID, C') Known) -> false
S : select (ID, C1) L1 Known
============================
 false
 < M: apply select_mem to S.

Subgoal 2.1:

Variables: Known ID C C1 L1
GCL : good_clause_list Known
NMem : (exists C', mem (ID, C') Known) -> false
S : select (ID, C1) L1 Known
M : mem (ID, C1) Known
============================
 false
 < backchain NMem.

Subgoal 2.2:

Variables: Known ID C ID1 C1 C2 L1
GCL : good_clause_list Known
NMem : (exists C', mem (ID, C') Known) -> false
S : select (ID1, C1) L1 Known
M : mem (ID1, C2) L1
============================
 false
 < GCL: case GCL.

Subgoal 2.2:

Variables: Known ID C ID1 C1 C2 L1
NMem : (exists C', mem (ID, C') Known) -> false
S : select (ID1, C1) L1 Known
M : mem (ID1, C2) L1
GCL : forall ID C1 KRest C2,
        select (ID, C1) KRest Known -> mem (ID, C2) KRest -> false
============================
 false
 < backchain GCL.

Proof completed.
 < Theorem good_clause_list_remove_all_add :
     forall Known ID KRest C,
       good_clause_list Known -> remove_all Known ID KRest -> good_clause_list ((ID, C)::KRest).

============================
 forall Known ID KRest C,
   good_clause_list Known -> remove_all Known ID KRest -> good_clause_list ((ID, C)::KRest)
 < intros GCL RA.

Variables: Known ID KRest C
GCL : good_clause_list Known
RA : remove_all Known ID KRest
============================
 good_clause_list ((ID, C)::KRest)
 < apply good_clause_list_remove_all to GCL RA.

Variables: Known ID KRest C
GCL : good_clause_list Known
RA : remove_all Known ID KRest
H1 : good_clause_list KRest
============================
 good_clause_list ((ID, C)::KRest)
 < backchain good_clause_list_add.

Variables: Known ID KRest C
GCL : good_clause_list Known
RA : remove_all Known ID KRest
H1 : good_clause_list KRest
============================
 (exists C', mem (ID, C') KRest) -> false
 < intros M.

Variables: Known ID KRest C
GCL : good_clause_list Known
RA : remove_all Known ID KRest
H1 : good_clause_list KRest
M : exists C', mem (ID, C') KRest
============================
 false
 < M: case M.

Variables: Known ID KRest C C'
GCL : good_clause_list Known
RA : remove_all Known ID KRest
H1 : good_clause_list KRest
M : mem (ID, C') KRest
============================
 false
 < apply remove_all_no_mem to RA M.

Proof completed.
 < Theorem permutation_good_clause_list :
     forall L P,
       is_list (is_pair is_integer is_clause) P -> permutation L P -> good_clause_list L ->
       good_clause_list P.

============================
 forall L P,
   is_list (is_pair is_integer is_clause) P -> permutation L P -> good_clause_list L ->
   good_clause_list P
 < intros IsP Prm GCL.

Variables: L P
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
GCL : good_clause_list L
============================
 good_clause_list P
 < unfold .

Variables: L P
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
GCL : good_clause_list L
============================
 forall ID C1 KRest C2, select (ID, C1) KRest P -> mem (ID, C2) KRest -> false
 < intros S MK.

Variables: L P ID C1 KRest C2
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
GCL : good_clause_list L
S : select (ID, C1) KRest P
MK : mem (ID, C2) KRest
============================
 false
 < MS: apply select_mem to S.

Variables: L P ID C1 KRest C2
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
GCL : good_clause_list L
S : select (ID, C1) KRest P
MK : mem (ID, C2) KRest
MS : mem (ID, C1) P
============================
 false
 < Prm': apply permutation_symmetric to Prm.

Variables: L P ID C1 KRest C2
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
GCL : good_clause_list L
S : select (ID, C1) KRest P
MK : mem (ID, C2) KRest
MS : mem (ID, C1) P
Prm' : permutation P L
============================
 false
 < ML1: apply permutation_mem to Prm' MS.

Variables: L P ID C1 KRest C2
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
GCL : good_clause_list L
S : select (ID, C1) KRest P
MK : mem (ID, C2) KRest
MS : mem (ID, C1) P
Prm' : permutation P L
ML1 : mem (ID, C1) L
============================
 false
 < SL: apply mem_select to ML1.

Variables: L P ID C1 KRest C2 L'
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
GCL : good_clause_list L
S : select (ID, C1) KRest P
MK : mem (ID, C2) KRest
MS : mem (ID, C1) P
Prm' : permutation P L
ML1 : mem (ID, C1) L
SL : select (ID, C1) L' L
============================
 false
 < IsL: apply permutation_is to IsP Prm.

Variables: L P ID C1 KRest C2 L'
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
GCL : good_clause_list L
S : select (ID, C1) KRest P
MK : mem (ID, C2) KRest
MS : mem (ID, C1) P
Prm' : permutation P L
ML1 : mem (ID, C1) L
SL : select (ID, C1) L' L
IsL : is_list (is_pair is_integer is_clause) L
============================
 false
 < P': apply selects_permutation to _ _ Prm' S SL.

Variables: L P ID C1 KRest C2 L'
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
GCL : good_clause_list L
S : select (ID, C1) KRest P
MK : mem (ID, C2) KRest
MS : mem (ID, C1) P
Prm' : permutation P L
ML1 : mem (ID, C1) L
SL : select (ID, C1) L' L
IsL : is_list (is_pair is_integer is_clause) L
P' : permutation KRest L'
============================
 false
 < ML': apply permutation_mem to P' MK.

Variables: L P ID C1 KRest C2 L'
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
GCL : good_clause_list L
S : select (ID, C1) KRest P
MK : mem (ID, C2) KRest
MS : mem (ID, C1) P
Prm' : permutation P L
ML1 : mem (ID, C1) L
SL : select (ID, C1) L' L
IsL : is_list (is_pair is_integer is_clause) L
P' : permutation KRest L'
ML' : mem (ID, C2) L'
============================
 false
 < GCL: case GCL.

Variables: L P ID C1 KRest C2 L'
IsP : is_list (is_pair is_integer is_clause) P
Prm : permutation L P
S : select (ID, C1) KRest P
MK : mem (ID, C2) KRest
MS : mem (ID, C1) P
Prm' : permutation P L
ML1 : mem (ID, C1) L
SL : select (ID, C1) L' L
IsL : is_list (is_pair is_integer is_clause) L
P' : permutation KRest L'
ML' : mem (ID, C2) L'
GCL : forall ID C1 KRest C2,
        select (ID, C1) KRest L -> mem (ID, C2) KRest -> false
============================
 false
 < backchain GCL.

Proof completed.
 < Theorem good_clause_list_mems :
     forall L X CA CB,
       good_clause_list L -> mem (X, CA) L -> mem (X, CB) L -> CA = CB.

============================
 forall L X CA CB,
   good_clause_list L -> mem (X, CA) L -> mem (X, CB) L -> CA = CB
 < induction on 2.

IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
============================
 forall L X CA CB,
   good_clause_list L -> mem (X, CA) L @ -> mem (X, CB) L -> CA = CB
 < intros GCL MA MB.

Variables: L X CA CB
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
GCL : good_clause_list L
MA : mem (X, CA) L @
MB : mem (X, CB) L
============================
 CA = CB
 < MA: case MA.

Subgoal 1:

Variables: X CA CB Rest
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
GCL : good_clause_list ((X, CA)::Rest)
MB : mem (X, CB) ((X, CA)::Rest)
============================
 CA = CB
 < MB: case MB.

Subgoal 1.1:

Variables: X CA Rest
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
GCL : good_clause_list ((X, CA)::Rest)
============================
 CA = CA
 < search.

Subgoal 1.2:

Variables: X CA CB Rest
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
GCL : good_clause_list ((X, CA)::Rest)
MB : mem (X, CB) Rest
============================
 CA = CB
 < GCL: case GCL.

Subgoal 1.2:

Variables: X CA CB Rest
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
MB : mem (X, CB) Rest
GCL : forall ID C1 KRest C2,
        select (ID, C1) KRest ((X, CA)::Rest) -> mem (ID, C2) KRest -> false
============================
 CA = CB
 < apply GCL to _ MB.

Subgoal 2:

Variables: X CA CB Rest I
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
GCL : good_clause_list (I::Rest)
MB : mem (X, CB) (I::Rest)
MA : mem (X, CA) Rest *
============================
 CA = CB
 < MB: case MB.

Subgoal 2.1:

Variables: X CA CB Rest
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
GCL : good_clause_list ((X, CB)::Rest)
MA : mem (X, CA) Rest *
============================
 CA = CB
 < GCL: case GCL.

Subgoal 2.1:

Variables: X CA CB Rest
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
MA : mem (X, CA) Rest *
GCL : forall ID C1 KRest C2,
        select (ID, C1) KRest ((X, CB)::Rest) -> mem (ID, C2) KRest -> false
============================
 CA = CB
 < apply GCL to _ MA.

Subgoal 2.2:

Variables: X CA CB Rest I
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
GCL : good_clause_list (I::Rest)
MA : mem (X, CA) Rest *
MB : mem (X, CB) Rest
============================
 CA = CB
 < GCL': apply good_clause_list_drop to GCL.

Subgoal 2.2:

Variables: X CA CB Rest I
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
GCL : good_clause_list (I::Rest)
MA : mem (X, CA) Rest *
MB : mem (X, CB) Rest
GCL' : good_clause_list Rest
============================
 CA = CB
 < apply IH to GCL' MA MB.

Subgoal 2.2:

Variables: X CB Rest I
IH : forall L X CA CB,
       good_clause_list L -> mem (X, CA) L * -> mem (X, CB) L -> CA = CB
GCL : good_clause_list (I::Rest)
MA : mem (X, CB) Rest *
MB : mem (X, CB) Rest
GCL' : good_clause_list Rest
============================
 CB = CB
 < search.

Proof completed.
 < Theorem rupProof_help_all_mem :
     forall Known A Proof ID,
       rupProof_help Known A Proof -> mem ID Proof -> exists C,
         lookup Known ID C.

============================
 forall Known A Proof ID,
   rupProof_help Known A Proof -> mem ID Proof -> exists C, lookup Known ID C
 < induction on 1.

IH : forall Known A Proof ID,
       rupProof_help Known A Proof * -> mem ID Proof -> exists C,
         lookup Known ID C
============================
 forall Known A Proof ID,
   rupProof_help Known A Proof @ -> mem ID Proof -> exists C, lookup Known ID C
 < intros RUP Mem.

Variables: Known A Proof ID
IH : forall Known A Proof ID,
       rupProof_help Known A Proof * -> mem ID Proof -> exists C,
         lookup Known ID C
RUP : rupProof_help Known A Proof @
Mem : mem ID Proof
============================
 exists C, lookup Known ID C
 < RUP: case RUP.

Subgoal 1:

Variables: Known A ID C ID1
IH : forall Known A Proof ID,
       rupProof_help Known A Proof * -> mem ID Proof -> exists C,
         lookup Known ID C
Mem : mem ID [ID1]
RUP : lookup Known ID1 C
RUP1 : unsat_clause A C
============================
 exists C, lookup Known ID C
 < Mem: case Mem.

Subgoal 1.1:

Variables: Known A C ID1
IH : forall Known A Proof ID,
       rupProof_help Known A Proof * -> mem ID Proof -> exists C,
         lookup Known ID C
RUP : lookup Known ID1 C
RUP1 : unsat_clause A C
============================
 exists C, lookup Known ID1 C
 < search.

Subgoal 1.2:

Variables: Known A ID C ID1
IH : forall Known A Proof ID,
       rupProof_help Known A Proof * -> mem ID Proof -> exists C,
         lookup Known ID C
RUP : lookup Known ID1 C
RUP1 : unsat_clause A C
Mem : mem ID []
============================
 exists C, lookup Known ID C
 < case Mem.

Subgoal 2:

Variables: Known A ID C L Prf ID1
IH : forall Known A Proof ID,
       rupProof_help Known A Proof * -> mem ID Proof -> exists C,
         lookup Known ID C
Mem : mem ID (ID1::Prf)
RUP : lookup Known ID1 C
RUP1 : unit_clause A C L
RUP2 : rupProof_help Known (L::A) Prf *
============================
 exists C, lookup Known ID C
 < Mem: case Mem.

Subgoal 2.1:

Variables: Known A C L Prf ID1
IH : forall Known A Proof ID,
       rupProof_help Known A Proof * -> mem ID Proof -> exists C,
         lookup Known ID C
RUP : lookup Known ID1 C
RUP1 : unit_clause A C L
RUP2 : rupProof_help Known (L::A) Prf *
============================
 exists C, lookup Known ID1 C
 < search.

Subgoal 2.2:

Variables: Known A ID C L Prf ID1
IH : forall Known A Proof ID,
       rupProof_help Known A Proof * -> mem ID Proof -> exists C,
         lookup Known ID C
RUP : lookup Known ID1 C
RUP1 : unit_clause A C L
RUP2 : rupProof_help Known (L::A) Prf *
Mem : mem ID Prf
============================
 exists C, lookup Known ID C
 < apply IH to RUP2 Mem.

Subgoal 2.2:

Variables: Known A ID C L Prf ID1 C1
IH : forall Known A Proof ID,
       rupProof_help Known A Proof * -> mem ID Proof -> exists C,
         lookup Known ID C
RUP : lookup Known ID1 C
RUP1 : unit_clause A C L
RUP2 : rupProof_help Known (L::A) Prf *
Mem : mem ID Prf
H1 : lookup Known ID C1
============================
 exists C, lookup Known ID C
 < search.

Proof completed.
 < Theorem rupProof_help_is :
     forall Known A Proof,
       rupProof_help Known A Proof -> is_list (is_pair is_integer is_clause) Known ->
       is_list is_integer Proof.

============================
 forall Known A Proof,
   rupProof_help Known A Proof -> is_list (is_pair is_integer is_clause) Known ->
   is_list is_integer Proof
 < induction on 1.

IH : forall Known A Proof,
       rupProof_help Known A Proof * -> is_list (is_pair is_integer is_clause) Known ->
       is_list is_integer Proof
============================
 forall Known A Proof,
   rupProof_help Known A Proof @ -> is_list (is_pair is_integer is_clause) Known ->
   is_list is_integer Proof
 < intros RUP IsK.

Variables: Known A Proof
IH : forall Known A Proof,
       rupProof_help Known A Proof * -> is_list (is_pair is_integer is_clause) Known ->
       is_list is_integer Proof
RUP : rupProof_help Known A Proof @
IsK : is_list (is_pair is_integer is_clause) Known
============================
 is_list is_integer Proof
 < RUP: case RUP.

Subgoal 1:

Variables: Known A C ID
IH : forall Known A Proof,
       rupProof_help Known A Proof * -> is_list (is_pair is_integer is_clause) Known ->
       is_list is_integer Proof
IsK : is_list (is_pair is_integer is_clause) Known
RUP : lookup Known ID C
RUP1 : unsat_clause A C
============================
 is_list is_integer [ID]
 < apply lookup_is_key to IsK RUP.

Subgoal 1:

Variables: Known A C ID
IH : forall Known A Proof,
       rupProof_help Known A Proof * -> is_list (is_pair is_integer is_clause) Known ->
       is_list is_integer Proof
IsK : is_list (is_pair is_integer is_clause) Known
RUP : lookup Known ID C
RUP1 : unsat_clause A C
H1 : is_integer ID
============================
 is_list is_integer [ID]
 < search.

Subgoal 2:

Variables: Known A C L Prf ID
IH : forall Known A Proof,
       rupProof_help Known A Proof * -> is_list (is_pair is_integer is_clause) Known ->
       is_list is_integer Proof
IsK : is_list (is_pair is_integer is_clause) Known
RUP : lookup Known ID C
RUP1 : unit_clause A C L
RUP2 : rupProof_help Known (L::A) Prf *
============================
 is_list is_integer (ID::Prf)
 < apply lookup_is_key to IsK RUP.

Subgoal 2:

Variables: Known A C L Prf ID
IH : forall Known A Proof,
       rupProof_help Known A Proof * -> is_list (is_pair is_integer is_clause) Known ->
       is_list is_integer Proof
IsK : is_list (is_pair is_integer is_clause) Known
RUP : lookup Known ID C
RUP1 : unit_clause A C L
RUP2 : rupProof_help Known (L::A) Prf *
H1 : is_integer ID
============================
 is_list is_integer (ID::Prf)
 < apply IH to RUP2 IsK.

Subgoal 2:

Variables: Known A C L Prf ID
IH : forall Known A Proof,
       rupProof_help Known A Proof * -> is_list (is_pair is_integer is_clause) Known ->
       is_list is_integer Proof
IsK : is_list (is_pair is_integer is_clause) Known
RUP : lookup Known ID C
RUP1 : unit_clause A C L
RUP2 : rupProof_help Known (L::A) Prf *
H1 : is_integer ID
H2 : is_list is_integer Prf
============================
 is_list is_integer (ID::Prf)
 < search.

Proof completed.
 < Theorem rupProof_help_unsat :
     forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof -> (forall (L : lit), mem L A -> mem L Sat) ->
       (forall (InID : integer) (InC : clause),
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false.

============================
 forall Known A Sat Proof,
   is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
   rupProof_help Known A Proof -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
     lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
   false
 < induction on 4.

IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
============================
 forall Known A Sat Proof,
   is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
   rupProof_help Known A Proof @ -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
     lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
   false
 < intros IsKnown IsA IsSat RUP Expand Sat GA_A GA_Sat.

Variables: Known A Sat Proof
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
RUP : rupProof_help Known A Proof @
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
============================
 false
 < RUP: case RUP.

Subgoal 1:

Variables: Known A Sat C ID
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID C
RUP1 : unsat_clause A C
============================
 false
 < SatC: apply Sat to RUP.

Subgoal 1:

Variables: Known A Sat C ID
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID C
RUP1 : unsat_clause A C
SatC : sat_clause Sat C
============================
 false
 < M: apply lookup_mem to RUP.

Subgoal 1:

Variables: Known A Sat C ID
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID C
RUP1 : unsat_clause A C
SatC : sat_clause Sat C
M : mem (ID, C) Known
============================
 false
 < Is: apply mem_is to _ M.

Subgoal 1:

Variables: Known A Sat ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unsat_clause A C1
SatC : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
============================
 false
 < UnsatC: apply unsat_clause_orderless to _ _ _ RUP1 Expand.

Subgoal 1:

Variables: Known A Sat ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unsat_clause A C1
SatC : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
UnsatC : unsat_clause Sat C1
============================
 false
 < apply unsat_sat_clause to _ _ UnsatC SatC _.

Subgoal 2:

Variables: Known A Sat C L Prf ID
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID C
RUP1 : unit_clause A C L
RUP2 : rupProof_help Known (L::A) Prf *
============================
 false
 < Sat: apply Sat to RUP.

Subgoal 2:

Variables: Known A Sat C L Prf ID
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID C
RUP1 : unit_clause A C L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C
============================
 false
 < M: apply lookup_mem to RUP.

Subgoal 2:

Variables: Known A Sat C L Prf ID
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID C
RUP1 : unit_clause A C L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C
M : mem (ID, C) Known
============================
 false
 < Is: apply mem_is to _ M.

Subgoal 2:

Variables: Known A Sat L Prf ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
============================
 false
 < MemL: apply unit_clause_expand to _ _ _ RUP1 _ GA_A GA_Sat Expand.

Subgoal 2:

Variables: Known A Sat L Prf ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
============================
 false
 < MemImp: assert forall (X : lit),
     mem X (L::A) -> mem X Sat.

Subgoal 2.1:

Variables: Known A Sat L Prf ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
============================
 forall X, mem X (L::A) -> mem X Sat
 < intros Mem.

Subgoal 2.1:

Variables: Known A Sat L Prf ID1 C1 X
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
Mem : mem X (L::A)
============================
 mem X Sat
 < Mem: case Mem.

Subgoal 2.1.1:

Variables: Known A Sat L Prf ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
============================
 mem L Sat
 < search.

Subgoal 2.1.2:

Variables: Known A Sat L Prf ID1 C1 X
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
Mem : mem X A
============================
 mem X Sat
 < backchain Expand.

Subgoal 2:

Variables: Known A Sat L Prf ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
============================
 false
 < IsL: apply unit_clause_is to _ _ RUP1.

Subgoal 2:

Variables: Known A Sat L Prf ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
============================
 false
 < backchain IH to
   Known = Known
   A = L::A
   Sat = Sat
   Proof = Prf.

Subgoal 2:

Variables: Known A Sat L Prf ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
============================
 good_assignment (L::A)
 < unfold .

Subgoal 2:

Variables: Known A Sat L Prf ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
============================
 forall L1 NL, mem L1 (L::A) -> negate_lit L1 NL -> mem NL (L::A) -> false
 < intros MemL1 NegL1 MemNL.

Subgoal 2:

Variables: Known A Sat L Prf ID1 C1 L1 NL
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
MemL1 : mem L1 (L::A)
NegL1 : negate_lit L1 NL
MemNL : mem NL (L::A)
============================
 false
 < MemL1: case MemL1.

Subgoal 2.2:

Variables: Known A Sat L Prf ID1 C1 NL
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
NegL1 : negate_lit L NL
MemNL : mem NL (L::A)
============================
 false
 < MemNL: case MemNL.

Subgoal 2.2.1:

Variables: Known A Sat L Prf ID1 C1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
NegL1 : negate_lit L L
============================
 false
 < apply negate_lit_not_same to _ NegL1.

Subgoal 2.2.2:

Variables: Known A Sat L Prf ID1 C1 NL
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
NegL1 : negate_lit L NL
MemNL : mem NL A
============================
 false
 < apply unit_clause_not_assigned_negate to _ _ RUP1 NegL1 MemNL.

Subgoal 2.3:

Variables: Known A Sat L Prf ID1 C1 L1 NL
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
NegL1 : negate_lit L1 NL
MemNL : mem NL (L::A)
MemL1 : mem L1 A
============================
 false
 < MemNL: case MemNL.

Subgoal 2.3.1:

Variables: Known A Sat L Prf ID1 C1 L1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
NegL1 : negate_lit L1 L
MemL1 : mem L1 A
============================
 false
 < apply mem_is_lit to _ MemL1.

Subgoal 2.3.1:

Variables: Known A Sat L Prf ID1 C1 L1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
NegL1 : negate_lit L1 L
MemL1 : mem L1 A
H1 : is_lit L1
============================
 false
 < apply negate_lit_reverse to _ NegL1.

Subgoal 2.3.1:

Variables: Known A Sat L Prf ID1 C1 L1
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
NegL1 : negate_lit L1 L
MemL1 : mem L1 A
H1 : is_lit L1
H2 : negate_lit L L1
============================
 false
 < apply unit_clause_not_assigned_negate to _ _ RUP1 _ MemL1.

Subgoal 2.3.2:

Variables: Known A Sat L Prf ID1 C1 L1 NL
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_A : good_assignment A
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
NegL1 : negate_lit L1 NL
MemL1 : mem L1 A
MemNL : mem NL A
============================
 false
 < GA_A: case GA_A.

Subgoal 2.3.2:

Variables: Known A Sat L Prf ID1 C1 L1 NL
IH : forall Known A Sat Proof,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit A -> is_list is_lit Sat ->
       rupProof_help Known A Proof * -> (forall L, mem L A -> mem L Sat) -> (forall InID InC,
         lookup Known InID InC -> sat_clause Sat InC) -> good_assignment A -> good_assignment Sat ->
       false
IsKnown : is_list (is_pair is_integer is_clause) Known
IsA : is_list is_lit A
IsSat : is_list is_lit Sat
Expand : forall L, mem L A -> mem L Sat
Sat : forall InID InC, lookup Known InID InC -> sat_clause Sat InC
GA_Sat : good_assignment Sat
RUP : lookup Known ID1 C1
RUP1 : unit_clause A C1 L
RUP2 : rupProof_help Known (L::A) Prf *
Sat1 : sat_clause Sat C1
M : mem (ID1, C1) Known
Is : is_integer ID1
Is1 : is_clause C1
MemL : mem L Sat
MemImp : forall X, mem X (L::A) -> mem X Sat
IsL : is_lit L
NegL1 : negate_lit L1 NL
MemL1 : mem L1 A
MemNL : mem NL A
GA_A : forall L NL, mem L A -> negate_lit L NL -> mem NL A -> false
============================
 false
 < apply GA_A to MemL1 NegL1 _.

Proof completed.
 < Theorem rupProof_help_orderless :
     forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf.

============================
 forall K1 K2 A Prf,
   is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
   good_clause_list K2 -> rupProof_help K1 A Prf -> (forall ID C,
     mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
 < induction on 4.

IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
============================
 forall K1 K2 A Prf,
   is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
   good_clause_list K2 -> rupProof_help K1 A Prf @ -> (forall ID C,
     mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
 < intros IsK1 IsK2 GCL2 RUPPH MemK1K2.

Variables: K1 K2 A Prf
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
RUPPH : rupProof_help K1 A Prf @
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
============================
 rupProof_help K2 A Prf
 < RUPPH: case RUPPH.

Subgoal 1:

Variables: K1 K2 A C ID
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID C
RUPPH1 : unsat_clause A C
============================
 rupProof_help K2 A [ID]
 < M1: apply lookup_mem to RUPPH.

Subgoal 1:

Variables: K1 K2 A C ID
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID C
RUPPH1 : unsat_clause A C
M1 : mem (ID, C) K1
============================
 rupProof_help K2 A [ID]
 < M2: apply MemK1K2 to M1.

Subgoal 1:

Variables: K1 K2 A C ID
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID C
RUPPH1 : unsat_clause A C
M1 : mem (ID, C) K1
M2 : mem (ID, C) K2
============================
 rupProof_help K2 A [ID]
 < Is: apply mem_is to IsK1 M1.

Subgoal 1:

Variables: K1 K2 A ID1 C1
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID1 C1
RUPPH1 : unsat_clause A C1
M1 : mem (ID1, C1) K1
M2 : mem (ID1, C1) K2
Is : is_integer ID1
Is1 : is_clause C1
============================
 rupProof_help K2 A [ID1]
 < L: apply is_list_mem_lookup to _ M2 _.

Subgoal 1:

Variables: K1 K2 A ID1 C1 C'
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID1 C1
RUPPH1 : unsat_clause A C1
M1 : mem (ID1, C1) K1
M2 : mem (ID1, C1) K2
Is : is_integer ID1
Is1 : is_clause C1
L : lookup K2 ID1 C'
============================
 rupProof_help K2 A [ID1]
 < ML: apply lookup_mem to L.

Subgoal 1:

Variables: K1 K2 A ID1 C1 C'
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID1 C1
RUPPH1 : unsat_clause A C1
M1 : mem (ID1, C1) K1
M2 : mem (ID1, C1) K2
Is : is_integer ID1
Is1 : is_clause C1
L : lookup K2 ID1 C'
ML : mem (ID1, C') K2
============================
 rupProof_help K2 A [ID1]
 < apply good_clause_list_mems to GCL2 M2 ML.

Subgoal 1:

Variables: K1 K2 A ID1 C'
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID1 C'
RUPPH1 : unsat_clause A C'
M1 : mem (ID1, C') K1
M2 : mem (ID1, C') K2
Is : is_integer ID1
Is1 : is_clause C'
L : lookup K2 ID1 C'
ML : mem (ID1, C') K2
============================
 rupProof_help K2 A [ID1]
 < search.

Subgoal 2:

Variables: K1 K2 A C L Prf1 ID
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID C
RUPPH1 : unit_clause A C L
RUPPH2 : rupProof_help K1 (L::A) Prf1 *
============================
 rupProof_help K2 A (ID::Prf1)
 < M1: apply lookup_mem to RUPPH.

Subgoal 2:

Variables: K1 K2 A C L Prf1 ID
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID C
RUPPH1 : unit_clause A C L
RUPPH2 : rupProof_help K1 (L::A) Prf1 *
M1 : mem (ID, C) K1
============================
 rupProof_help K2 A (ID::Prf1)
 < M2: apply MemK1K2 to M1.

Subgoal 2:

Variables: K1 K2 A C L Prf1 ID
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID C
RUPPH1 : unit_clause A C L
RUPPH2 : rupProof_help K1 (L::A) Prf1 *
M1 : mem (ID, C) K1
M2 : mem (ID, C) K2
============================
 rupProof_help K2 A (ID::Prf1)
 < Is: apply mem_is to IsK1 M1.

Subgoal 2:

Variables: K1 K2 A L Prf1 ID1 C1
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID1 C1
RUPPH1 : unit_clause A C1 L
RUPPH2 : rupProof_help K1 (L::A) Prf1 *
M1 : mem (ID1, C1) K1
M2 : mem (ID1, C1) K2
Is : is_integer ID1
Is1 : is_clause C1
============================
 rupProof_help K2 A (ID1::Prf1)
 < L: apply is_list_mem_lookup to _ M2 _.

Subgoal 2:

Variables: K1 K2 A L Prf1 ID1 C1 C'
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID1 C1
RUPPH1 : unit_clause A C1 L
RUPPH2 : rupProof_help K1 (L::A) Prf1 *
M1 : mem (ID1, C1) K1
M2 : mem (ID1, C1) K2
Is : is_integer ID1
Is1 : is_clause C1
L : lookup K2 ID1 C'
============================
 rupProof_help K2 A (ID1::Prf1)
 < ML: apply lookup_mem to L.

Subgoal 2:

Variables: K1 K2 A L Prf1 ID1 C1 C'
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID1 C1
RUPPH1 : unit_clause A C1 L
RUPPH2 : rupProof_help K1 (L::A) Prf1 *
M1 : mem (ID1, C1) K1
M2 : mem (ID1, C1) K2
Is : is_integer ID1
Is1 : is_clause C1
L : lookup K2 ID1 C'
ML : mem (ID1, C') K2
============================
 rupProof_help K2 A (ID1::Prf1)
 < apply good_clause_list_mems to _ M2 ML.

Subgoal 2:

Variables: K1 K2 A L Prf1 ID1 C'
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID1 C'
RUPPH1 : unit_clause A C' L
RUPPH2 : rupProof_help K1 (L::A) Prf1 *
M1 : mem (ID1, C') K1
M2 : mem (ID1, C') K2
Is : is_integer ID1
Is1 : is_clause C'
L : lookup K2 ID1 C'
ML : mem (ID1, C') K2
============================
 rupProof_help K2 A (ID1::Prf1)
 < apply IH to _ _ _ RUPPH2 _.

Subgoal 2:

Variables: K1 K2 A L Prf1 ID1 C'
IH : forall K1 K2 A Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof_help K1 A Prf * -> (forall ID C,
         mem (ID, C) K1 -> mem (ID, C) K2) -> rupProof_help K2 A Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL2 : good_clause_list K2
MemK1K2 : forall ID C, mem (ID, C) K1 -> mem (ID, C) K2
RUPPH : lookup K1 ID1 C'
RUPPH1 : unit_clause A C' L
RUPPH2 : rupProof_help K1 (L::A) Prf1 *
M1 : mem (ID1, C') K1
M2 : mem (ID1, C') K2
Is : is_integer ID1
Is1 : is_clause C'
L : lookup K2 ID1 C'
ML : mem (ID1, C') K2
H1 : rupProof_help K2 (L::A) Prf1
============================
 rupProof_help K2 A (ID1::Prf1)
 < search.

Proof completed.
 < Extensible_Theorem
      gatherLits_is : forall C L,
         IsC : is_clause C ->
         GL : gatherLits C L ->
         is_list is_lit L
      on GL.

Subgoal 1:

IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L
IsC : is_clause emptyClause
GL : gatherLits emptyClause [] @
============================
 is_list is_lit []
 < search.

Subgoal 2:

Variables: LRest L1 Rest
IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L
IsC : is_clause (or L1 Rest)
GL : gatherLits (or L1 Rest) (L1::LRest) @
GL1 : gatherLits Rest LRest *
============================
 is_list is_lit (L1::LRest)
 < Is: case IsC.

Subgoal 2:

Variables: LRest L1 Rest
IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L
GL : gatherLits (or L1 Rest) (L1::LRest) @
GL1 : gatherLits Rest LRest *
Is : is_lit L1
Is1 : is_clause Rest
============================
 is_list is_lit (L1::LRest)
 < apply IH to _ GL1.

Subgoal 2:

Variables: LRest L1 Rest
IH : forall C L, is_clause C -> gatherLits C L * -> is_list is_lit L
GL : gatherLits (or L1 Rest) (L1::LRest) @
GL1 : gatherLits Rest LRest *
Is : is_lit L1
Is1 : is_clause Rest
H1 : is_list is_lit LRest
============================
 is_list is_lit (L1::LRest)
 < search.

Proof completed.
 < Extensible_Theorem
      gatherLits_exists : forall C,
         IsC : is_clause C ->
         exists L,
           gatherLits C L
      on IsC.

Subgoal 1:

IH : forall C, is_clause C * -> exists L, gatherLits C L
IsC : is_clause emptyClause @
============================
 exists L, gatherLits emptyClause L
 < search.

Subgoal 2:

Variables: Clause Lit
IH : forall C, is_clause C * -> exists L, gatherLits C L
IsC : is_clause (or Lit Clause) @
IsC1 : is_lit Lit
IsC2 : is_clause Clause *
============================
 exists L, gatherLits (or Lit Clause) L
 < apply IH to IsC2.

Subgoal 2:

Variables: Clause Lit L
IH : forall C, is_clause C * -> exists L, gatherLits C L
IsC : is_clause (or Lit Clause) @
IsC1 : is_lit Lit
IsC2 : is_clause Clause *
H1 : gatherLits Clause L
============================
 exists L, gatherLits (or Lit Clause) L
 < search.

Proof completed.
 < Extensible_Theorem
      gatherLits_permutation : forall C L1 L2,
         IsC : is_clause C ->
         GL1 : gatherLits C L1 ->
         GL2 : gatherLits C L2 ->
         permutation L1 L2
      on GL1.

Subgoal 1:

Variables: L2
IH : forall C L1 L2,
       is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2
IsC : is_clause emptyClause
GL1 : gatherLits emptyClause [] @
GL2 : gatherLits emptyClause L2
============================
 permutation [] L2
 < case GL2.

Subgoal 1:

IH : forall C L1 L2,
       is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2
IsC : is_clause emptyClause
GL1 : gatherLits emptyClause [] @
============================
 permutation [] []
 < search.

Subgoal 2:

Variables: L2 LRest L Rest
IH : forall C L1 L2,
       is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2
IsC : is_clause (or L Rest)
GL1 : gatherLits (or L Rest) (L::LRest) @
GL2 : gatherLits (or L Rest) L2
GL3 : gatherLits Rest LRest *
============================
 permutation (L::LRest) L2
 < GL2: case GL2.

Subgoal 2:

Variables: LRest L Rest LRest1
IH : forall C L1 L2,
       is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2
IsC : is_clause (or L Rest)
GL1 : gatherLits (or L Rest) (L::LRest) @
GL3 : gatherLits Rest LRest *
GL2 : gatherLits Rest LRest1
============================
 permutation (L::LRest) (L::LRest1)
 < Is: case IsC.

Subgoal 2:

Variables: LRest L Rest LRest1
IH : forall C L1 L2,
       is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2
GL1 : gatherLits (or L Rest) (L::LRest) @
GL3 : gatherLits Rest LRest *
GL2 : gatherLits Rest LRest1
Is : is_lit L
Is1 : is_clause Rest
============================
 permutation (L::LRest) (L::LRest1)
 < apply IH to _ GL3 GL2.

Subgoal 2:

Variables: LRest L Rest LRest1
IH : forall C L1 L2,
       is_clause C -> gatherLits C L1 * -> gatherLits C L2 -> permutation L1 L2
GL1 : gatherLits (or L Rest) (L::LRest) @
GL3 : gatherLits Rest LRest *
GL2 : gatherLits Rest LRest1
Is : is_lit L
Is1 : is_clause Rest
H1 : permutation LRest LRest1
============================
 permutation (L::LRest) (L::LRest1)
 < search.

Proof completed.
 < Projection_Constraint proj_gatherLits :
   forall C C' L,
   |{clause}- C ~~> C' -> is_clause C -> gatherLits C L -> exists L',
     gatherLits C' L'.

Proof completed.
 < Projection_Constraint proj_gatherLits_permutation :
   forall C C' L L',
   |{clause}- C ~~> C' -> is_clause C -> gatherLits C L -> gatherLits C' L' -> permutation L L'.

Proof completed.
 < Extensible_Theorem
      gatherLits_sat : forall C Lits Sat,
         IsC : is_clause C ->
         IsSat : is_list is_lit Sat ->
         GL : gatherLits C Lits ->
         Sat : sat_clause Sat C ->
         exists L,
           mem L Lits /\ mem L Sat
      on Sat.

Subgoal 1:

Variables: Lits Sat Rest 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
IsC : is_clause (or L Rest)
IsSat : is_list is_lit Sat
GL : gatherLits (or L Rest) Lits
Sat : sat_clause Sat (or L Rest) @
Sat1 : mem L Sat
============================
 exists L, mem L Lits /\ mem L Sat
 < case GL.

Subgoal 1:

Variables: Sat Rest L LRest
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 (or L Rest)
IsSat : is_list is_lit Sat
Sat : sat_clause Sat (or L Rest) @
Sat1 : mem L Sat
H1 : gatherLits Rest LRest
============================
 exists L1, mem L1 (L::LRest) /\ mem L1 Sat
 < search.

Subgoal 2:

Variables: Lits Sat Rest 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
IsC : is_clause (or L Rest)
IsSat : is_list is_lit Sat
GL : gatherLits (or L Rest) Lits
Sat : sat_clause Sat (or L Rest) @
Sat1 : sat_clause Sat Rest *
============================
 exists L, mem L Lits /\ mem L Sat
 < Is: case IsC.

Subgoal 2:

Variables: Lits Sat Rest 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
GL : gatherLits (or L Rest) Lits
Sat : sat_clause Sat (or L Rest) @
Sat1 : sat_clause Sat Rest *
Is : is_lit L
Is1 : is_clause Rest
============================
 exists L, mem L Lits /\ mem L Sat
 < GL: case GL.

Subgoal 2:

Variables: Sat Rest L LRest
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 (or L Rest) @
Sat1 : sat_clause Sat Rest *
Is : is_lit L
Is1 : is_clause Rest
GL : gatherLits Rest LRest
============================
 exists L1, mem L1 (L::LRest) /\ mem L1 Sat
 < apply IH to _ _ GL Sat1.

Subgoal 2:

Variables: Sat Rest L LRest L1
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 (or L Rest) @
Sat1 : sat_clause Sat Rest *
Is : is_lit L
Is1 : is_clause Rest
GL : gatherLits Rest LRest
H1 : mem L1 LRest
H2 : mem L1 Sat
============================
 exists L1, mem L1 (L::LRest) /\ mem L1 Sat
 < search.

Proof completed.
 < Extensible_Theorem
      gatherLits_mem_sat : forall C Lits Sat L,
         IsC : is_clause C ->
         IsSat : is_list is_lit Sat ->
         GL : gatherLits C Lits ->
         MemLits : mem L Lits ->
         MemSat : mem L Sat ->
         sat_clause Sat C
      on GL.

Subgoal 1:

Variables: Sat L
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 emptyClause
IsSat : is_list is_lit Sat
GL : gatherLits emptyClause [] @
MemLits : mem L []
MemSat : mem L Sat
============================
 sat_clause Sat emptyClause
 < case MemLits.

Subgoal 2:

Variables: Sat L LRest L1 Rest
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 (or L1 Rest)
IsSat : is_list is_lit Sat
GL : gatherLits (or L1 Rest) (L1::LRest) @
MemLits : mem L (L1::LRest)
MemSat : mem L Sat
GL1 : gatherLits Rest LRest *
============================
 sat_clause Sat (or L1 Rest)
 < MemLits: case MemLits.

Subgoal 2.1:

Variables: Sat LRest L1 Rest
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 (or L1 Rest)
IsSat : is_list is_lit Sat
GL : gatherLits (or L1 Rest) (L1::LRest) @
MemSat : mem L1 Sat
GL1 : gatherLits Rest LRest *
============================
 sat_clause Sat (or L1 Rest)
 < search.

Subgoal 2.2:

Variables: Sat L LRest L1 Rest
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 (or L1 Rest)
IsSat : is_list is_lit Sat
GL : gatherLits (or L1 Rest) (L1::LRest) @
MemSat : mem L Sat
GL1 : gatherLits Rest LRest *
MemLits : mem L LRest
============================
 sat_clause Sat (or L1 Rest)
 < Is: case IsC.

Subgoal 2.2:

Variables: Sat L LRest L1 Rest
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 (or L1 Rest) (L1::LRest) @
MemSat : mem L Sat
GL1 : gatherLits Rest LRest *
MemLits : mem L LRest
Is : is_lit L1
Is1 : is_clause Rest
============================
 sat_clause Sat (or L1 Rest)
 < apply IH to _ _ GL1 MemLits MemSat.

Subgoal 2.2:

Variables: Sat L LRest L1 Rest
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 (or L1 Rest) (L1::LRest) @
MemSat : mem L Sat
GL1 : gatherLits Rest LRest *
MemLits : mem L LRest
Is : is_lit L1
Is1 : is_clause Rest
H1 : sat_clause Sat Rest
============================
 sat_clause Sat (or L1 Rest)
 < search.

Proof completed.
 < Extensible_Theorem
      gatherLits_unsat : forall C Lits Unsat L,
         GA : good_assignment Unsat ->
         IsC : is_clause C ->
         IsUnsat : is_list is_lit Unsat ->
         GL : gatherLits C Lits ->
         Unsat : unsat_clause Unsat C ->
         MemLits : mem L Lits ->
         MemUnsat : mem L Unsat ->
         false
      on Unsat.

Subgoal 1:

Variables: Lits Unsat L
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 emptyClause
IsUnsat : is_list is_lit Unsat
GL : gatherLits emptyClause Lits
Unsat : unsat_clause Unsat emptyClause @
MemLits : mem L Lits
MemUnsat : mem L Unsat
============================
 false
 < case GL.

Subgoal 1:

Variables: Unsat L
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 emptyClause
IsUnsat : is_list is_lit Unsat
Unsat : unsat_clause Unsat emptyClause @
MemLits : mem L []
MemUnsat : mem L Unsat
============================
 false
 < case MemLits.

Subgoal 2:

Variables: Lits Unsat L NL Rest L1
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 (or L1 Rest)
IsUnsat : is_list is_lit Unsat
GL : gatherLits (or L1 Rest) Lits
Unsat : unsat_clause Unsat (or L1 Rest) @
MemLits : mem L Lits
MemUnsat : mem L Unsat
Unsat1 : negate_lit L1 NL
Unsat2 : mem NL Unsat
Unsat3 : unsat_clause Unsat Rest *
============================
 false
 < GL: case GL.

Subgoal 2:

Variables: Unsat L NL Rest L1 LRest
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 (or L1 Rest)
IsUnsat : is_list is_lit Unsat
Unsat : unsat_clause Unsat (or L1 Rest) @
MemLits : mem L (L1::LRest)
MemUnsat : mem L Unsat
Unsat1 : negate_lit L1 NL
Unsat2 : mem NL Unsat
Unsat3 : unsat_clause Unsat Rest *
GL : gatherLits Rest LRest
============================
 false
 < MemLits: case MemLits.

Subgoal 2.1:

Variables: Unsat NL Rest L1 LRest
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 (or L1 Rest)
IsUnsat : is_list is_lit Unsat
Unsat : unsat_clause Unsat (or L1 Rest) @
MemUnsat : mem L1 Unsat
Unsat1 : negate_lit L1 NL
Unsat2 : mem NL Unsat
Unsat3 : unsat_clause Unsat Rest *
GL : gatherLits Rest LRest
============================
 false
 < GA: case GA.

Subgoal 2.1:

Variables: Unsat NL Rest L1 LRest
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
IsC : is_clause (or L1 Rest)
IsUnsat : is_list is_lit Unsat
Unsat : unsat_clause Unsat (or L1 Rest) @
MemUnsat : mem L1 Unsat
Unsat1 : negate_lit L1 NL
Unsat2 : mem NL Unsat
Unsat3 : unsat_clause Unsat Rest *
GL : gatherLits Rest LRest
GA : forall L NL, mem L Unsat -> negate_lit L NL -> mem NL Unsat -> false
============================
 false
 < apply GA to MemUnsat Unsat1 Unsat2.

Subgoal 2.2:

Variables: Unsat L NL Rest L1 LRest
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 (or L1 Rest)
IsUnsat : is_list is_lit Unsat
Unsat : unsat_clause Unsat (or L1 Rest) @
MemUnsat : mem L Unsat
Unsat1 : negate_lit L1 NL
Unsat2 : mem NL Unsat
Unsat3 : unsat_clause Unsat Rest *
GL : gatherLits Rest LRest
MemLits : mem L LRest
============================
 false
 < Is: case IsC.

Subgoal 2.2:

Variables: Unsat L NL Rest L1 LRest
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 (or L1 Rest) @
MemUnsat : mem L Unsat
Unsat1 : negate_lit L1 NL
Unsat2 : mem NL Unsat
Unsat3 : unsat_clause Unsat Rest *
GL : gatherLits Rest LRest
MemLits : mem L LRest
Is : is_lit L1
Is1 : is_clause Rest
============================
 false
 < apply IH to GA _ _ GL Unsat3 MemLits MemUnsat.

Proof completed.
 < Theorem negateLitList_is :
     forall L NL, is_list is_lit L -> negateLitList L NL -> is_list is_lit NL.

============================
 forall L NL, is_list is_lit L -> negateLitList L NL -> is_list is_lit NL
 < induction on 2.

IH : forall L NL, is_list is_lit L -> negateLitList L NL * -> is_list is_lit NL
============================
 forall L NL, is_list is_lit L -> negateLitList L NL @ -> is_list is_lit NL
 < intros IsL NLL.

Variables: L NL
IH : forall L NL, is_list is_lit L -> negateLitList L NL * -> is_list is_lit NL
IsL : is_list is_lit L
NLL : negateLitList L NL @
============================
 is_list is_lit NL
 < NLL: case NLL.

Subgoal 1:

IH : forall L NL, is_list is_lit L -> negateLitList L NL * -> is_list is_lit NL
IsL : is_list is_lit []
============================
 is_list is_lit []
 < search.

Subgoal 2:

Variables: NRest N LRest L1
IH : forall L NL, is_list is_lit L -> negateLitList L NL * -> is_list is_lit NL
IsL : is_list is_lit (L1::LRest)
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest *
============================
 is_list is_lit (N::NRest)
 < Is: case IsL.

Subgoal 2:

Variables: NRest N LRest L1
IH : forall L NL, is_list is_lit L -> negateLitList L NL * -> is_list is_lit NL
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest *
Is : is_lit L1
Is1 : is_list is_lit LRest
============================
 is_list is_lit (N::NRest)
 < apply IH to _ NLL1.

Subgoal 2:

Variables: NRest N LRest L1
IH : forall L NL, is_list is_lit L -> negateLitList L NL * -> is_list is_lit NL
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest *
Is : is_lit L1
Is1 : is_list is_lit LRest
H1 : is_list is_lit NRest
============================
 is_list is_lit (N::NRest)
 < apply negate_lit_is_lit to _ NLL.

Subgoal 2:

Variables: NRest N LRest L1
IH : forall L NL, is_list is_lit L -> negateLitList L NL * -> is_list is_lit NL
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest *
Is : is_lit L1
Is1 : is_list is_lit LRest
H1 : is_list is_lit NRest
H2 : is_lit N
============================
 is_list is_lit (N::NRest)
 < search.

Proof completed.
 < Theorem negateLitList_exists :
     forall L, is_list is_lit L -> exists NL, negateLitList L NL.

============================
 forall L, is_list is_lit L -> exists NL, negateLitList L NL
 < induction on 1.

IH : forall L, is_list is_lit L * -> exists NL, negateLitList L NL
============================
 forall L, is_list is_lit L @ -> exists NL, negateLitList L NL
 < intros IsL.

Variables: L
IH : forall L, is_list is_lit L * -> exists NL, negateLitList L NL
IsL : is_list is_lit L @
============================
 exists NL, negateLitList L NL
 < Is: case IsL.

Subgoal 1:

IH : forall L, is_list is_lit L * -> exists NL, negateLitList L NL
============================
 exists NL, negateLitList [] NL
 < search.

Subgoal 2:

Variables: T H
IH : forall L, is_list is_lit L * -> exists NL, negateLitList L NL
Is : is_lit H
Is1 : is_list is_lit T *
============================
 exists NL, negateLitList (H::T) NL
 < apply negate_lit_exists to Is.

Subgoal 2:

Variables: T H NL
IH : forall L, is_list is_lit L * -> exists NL, negateLitList L NL
Is : is_lit H
Is1 : is_list is_lit T *
H1 : negate_lit H NL
============================
 exists NL, negateLitList (H::T) NL
 < apply IH to Is1.

Subgoal 2:

Variables: T H NL NL1
IH : forall L, is_list is_lit L * -> exists NL, negateLitList L NL
Is : is_lit H
Is1 : is_list is_lit T *
H1 : negate_lit H NL
H2 : negateLitList T NL1
============================
 exists NL, negateLitList (H::T) NL
 < search.

Proof completed.
 < Theorem negateLitList_mem_negate_before :
     forall X NL L NX,
       is_list is_lit NL -> mem X NL -> negateLitList L NL -> negate_lit X NX ->
       mem NX L.

============================
 forall X NL L NX,
   is_list is_lit NL -> mem X NL -> negateLitList L NL -> negate_lit X NX -> mem NX L
 < induction on 2.

IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
============================
 forall X NL L NX,
   is_list is_lit NL -> mem X NL @ -> negateLitList L NL -> negate_lit X NX -> mem NX L
 < intros IsNL Mem NLL Neg.

Variables: X NL L NX
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
IsNL : is_list is_lit NL
Mem : mem X NL @
NLL : negateLitList L NL
Neg : negate_lit X NX
============================
 mem NX L
 < Mem: case Mem.

Subgoal 1:

Variables: X L NX Rest
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
IsNL : is_list is_lit (X::Rest)
NLL : negateLitList L (X::Rest)
Neg : negate_lit X NX
============================
 mem NX L
 < NLL: case NLL.

Subgoal 1:

Variables: X NX Rest LRest L1
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
IsNL : is_list is_lit (X::Rest)
Neg : negate_lit X NX
NLL : negate_lit L1 X
NLL1 : negateLitList LRest Rest
============================
 mem NX (L1::LRest)
 < Is: case IsNL.

Subgoal 1:

Variables: X NX Rest LRest L1
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
Neg : negate_lit X NX
NLL : negate_lit L1 X
NLL1 : negateLitList LRest Rest
Is : is_lit X
Is1 : is_list is_lit Rest
============================
 mem NX (L1::LRest)
 < apply negate_lit_is_lit_back to _ NLL.

Subgoal 1:

Variables: X NX Rest LRest L1
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
Neg : negate_lit X NX
NLL : negate_lit L1 X
NLL1 : negateLitList LRest Rest
Is : is_lit X
Is1 : is_list is_lit Rest
H1 : is_lit L1
============================
 mem NX (L1::LRest)
 < NegXL1: apply negate_lit_reverse to _ NLL.

Subgoal 1:

Variables: X NX Rest LRest L1
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
Neg : negate_lit X NX
NLL : negate_lit L1 X
NLL1 : negateLitList LRest Rest
Is : is_lit X
Is1 : is_list is_lit Rest
H1 : is_lit L1
NegXL1 : negate_lit X L1
============================
 mem NX (L1::LRest)
 < apply negate_lit_unique to _ Neg NegXL1.

Subgoal 1:

Variables: X Rest LRest L1
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
Neg : negate_lit X L1
NLL : negate_lit L1 X
NLL1 : negateLitList LRest Rest
Is : is_lit X
Is1 : is_list is_lit Rest
H1 : is_lit L1
NegXL1 : negate_lit X L1
============================
 mem L1 (L1::LRest)
 < search.

Subgoal 2:

Variables: X L NX Rest I
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
IsNL : is_list is_lit (I::Rest)
NLL : negateLitList L (I::Rest)
Neg : negate_lit X NX
Mem : mem X Rest *
============================
 mem NX L
 < NLL: case NLL.

Subgoal 2:

Variables: X NX Rest I LRest L1
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
IsNL : is_list is_lit (I::Rest)
Neg : negate_lit X NX
Mem : mem X Rest *
NLL : negate_lit L1 I
NLL1 : negateLitList LRest Rest
============================
 mem NX (L1::LRest)
 < case IsNL.

Subgoal 2:

Variables: X NX Rest I LRest L1
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
Neg : negate_lit X NX
Mem : mem X Rest *
NLL : negate_lit L1 I
NLL1 : negateLitList LRest Rest
H1 : is_lit I
H2 : is_list is_lit Rest
============================
 mem NX (L1::LRest)
 < apply IH to _ Mem _ _.

Subgoal 2:

Variables: X NX Rest I LRest L1
IH : forall X NL L NX,
       is_list is_lit NL -> mem X NL * -> negateLitList L NL -> negate_lit X NX ->
       mem NX L
Neg : negate_lit X NX
Mem : mem X Rest *
NLL : negate_lit L1 I
NLL1 : negateLitList LRest Rest
H1 : is_lit I
H2 : is_list is_lit Rest
H3 : mem NX LRest
============================
 mem NX (L1::LRest)
 < search.

Proof completed.
 < Extensible_Theorem
      negate_lits_unsat : forall C L NL,
         IsC : is_clause C ->
         GL : gatherLits C L ->
         NLL : negateLitList L NL ->
         unsat_clause NL C
      on GL.

Subgoal 1:

Variables: NL
IH : forall C L NL,
       is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C
IsC : is_clause emptyClause
GL : gatherLits emptyClause [] @
NLL : negateLitList [] NL
============================
 unsat_clause NL emptyClause
 < search.

Subgoal 2:

Variables: NL LRest L1 Rest
IH : forall C L NL,
       is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C
IsC : is_clause (or L1 Rest)
GL : gatherLits (or L1 Rest) (L1::LRest) @
NLL : negateLitList (L1::LRest) NL
GL1 : gatherLits Rest LRest *
============================
 unsat_clause NL (or L1 Rest)
 < NLL: case NLL.

Subgoal 2:

Variables: LRest L1 Rest NRest N
IH : forall C L NL,
       is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C
IsC : is_clause (or L1 Rest)
GL : gatherLits (or L1 Rest) (L1::LRest) @
GL1 : gatherLits Rest LRest *
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest
============================
 unsat_clause (N::NRest) (or L1 Rest)
 < Is: case IsC.

Subgoal 2:

Variables: LRest L1 Rest NRest N
IH : forall C L NL,
       is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C
GL : gatherLits (or L1 Rest) (L1::LRest) @
GL1 : gatherLits Rest LRest *
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest
Is : is_lit L1
Is1 : is_clause Rest
============================
 unsat_clause (N::NRest) (or L1 Rest)
 < UC: apply IH to _ GL1 NLL1.

Subgoal 2:

Variables: LRest L1 Rest NRest N
IH : forall C L NL,
       is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C
GL : gatherLits (or L1 Rest) (L1::LRest) @
GL1 : gatherLits Rest LRest *
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest
Is : is_lit L1
Is1 : is_clause Rest
UC : unsat_clause NRest Rest
============================
 unsat_clause (N::NRest) (or L1 Rest)
 < apply negate_lit_is_lit to _ NLL.

Subgoal 2:

Variables: LRest L1 Rest NRest N
IH : forall C L NL,
       is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C
GL : gatherLits (or L1 Rest) (L1::LRest) @
GL1 : gatherLits Rest LRest *
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest
Is : is_lit L1
Is1 : is_clause Rest
UC : unsat_clause NRest Rest
H1 : is_lit N
============================
 unsat_clause (N::NRest) (or L1 Rest)
 < apply gatherLits_is to _ GL1.

Subgoal 2:

Variables: LRest L1 Rest NRest N
IH : forall C L NL,
       is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C
GL : gatherLits (or L1 Rest) (L1::LRest) @
GL1 : gatherLits Rest LRest *
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest
Is : is_lit L1
Is1 : is_clause Rest
UC : unsat_clause NRest Rest
H1 : is_lit N
H2 : is_list is_lit LRest
============================
 unsat_clause (N::NRest) (or L1 Rest)
 < apply negateLitList_is to _ NLL1.

Subgoal 2:

Variables: LRest L1 Rest NRest N
IH : forall C L NL,
       is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C
GL : gatherLits (or L1 Rest) (L1::LRest) @
GL1 : gatherLits Rest LRest *
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest
Is : is_lit L1
Is1 : is_clause Rest
UC : unsat_clause NRest Rest
H1 : is_lit N
H2 : is_list is_lit LRest
H3 : is_list is_lit NRest
============================
 unsat_clause (N::NRest) (or L1 Rest)
 < apply unsat_clause_orderless to _ _ _ UC _ with
     A2 = N::NRest.

Subgoal 2:

Variables: LRest L1 Rest NRest N
IH : forall C L NL,
       is_clause C -> gatherLits C L * -> negateLitList L NL -> unsat_clause NL C
GL : gatherLits (or L1 Rest) (L1::LRest) @
GL1 : gatherLits Rest LRest *
NLL : negate_lit L1 N
NLL1 : negateLitList LRest NRest
Is : is_lit L1
Is1 : is_clause Rest
UC : unsat_clause NRest Rest
H1 : is_lit N
H2 : is_list is_lit LRest
H3 : is_list is_lit NRest
H4 : unsat_clause (N::NRest) Rest
============================
 unsat_clause (N::NRest) (or L1 Rest)
 < search.

Proof completed.
 < Theorem rupProof_all_mem :
     forall Known C Proof ID,
       rupProof Known C Proof -> mem ID Proof -> exists C', lookup Known ID C'.

============================
 forall Known C Proof ID,
   rupProof Known C Proof -> mem ID Proof -> exists C', lookup Known ID C'
 < intros RUP Mem.

Variables: Known C Proof ID
RUP : rupProof Known C Proof
Mem : mem ID Proof
============================
 exists C', lookup Known ID C'
 < RUP: case RUP.

Variables: Known C Proof ID Lits A
Mem : mem ID Proof
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Proof
============================
 exists C', lookup Known ID C'
 < apply rupProof_help_all_mem to RUP2 Mem.

Variables: Known C Proof ID Lits A C1
Mem : mem ID Proof
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Proof
H1 : lookup Known ID C1
============================
 exists C', lookup Known ID C'
 < search.

Proof completed.
 < Theorem rupProof_is :
     forall Known C Proof,
       rupProof Known C Proof -> is_list (is_pair is_integer is_clause) Known ->
       is_list is_integer Proof.

============================
 forall Known C Proof,
   rupProof Known C Proof -> is_list (is_pair is_integer is_clause) Known -> is_list is_integer Proof
 < intros RUP IsK.

Variables: Known C Proof
RUP : rupProof Known C Proof
IsK : is_list (is_pair is_integer is_clause) Known
============================
 is_list is_integer Proof
 < RUP: case RUP.

Variables: Known C Proof Lits A
IsK : is_list (is_pair is_integer is_clause) Known
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Proof
============================
 is_list is_integer Proof
 < apply rupProof_help_is to RUP2 IsK.

Variables: Known C Proof Lits A
IsK : is_list (is_pair is_integer is_clause) Known
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Proof
H1 : is_list is_integer Proof
============================
 is_list is_integer Proof
 < search.

Proof completed.
 < Theorem rupProof_maintains_sat :
     forall Known C Prf Sat,
       is_list (is_pair is_integer is_clause) Known -> is_list is_lit Sat -> rupProof Known C Prf ->
       (forall ID InC, lookup Known ID InC -> sat_clause Sat InC) -> is_clause C ->
       is_list is_lit Sat -> good_assignment Sat -> exists S,
         ((is_list is_lit S /\ good_assignment S) /\
         (forall L, mem L Sat -> mem L S)) /\
         sat_clause S C.

============================
 forall Known C Prf Sat,
   is_list (is_pair is_integer is_clause) Known -> is_list is_lit Sat -> rupProof Known C Prf ->
   (forall ID InC, lookup Known ID InC -> sat_clause Sat InC) -> is_clause C -> is_list is_lit Sat ->
   good_assignment Sat -> exists S,
     ((is_list is_lit S /\ good_assignment S) /\
     (forall L, mem L Sat -> mem L S)) /\
     sat_clause S C
 < intros IsKnown IsSat RUP Sat IsC IsSat GA_Sat.

Variables: Known C Prf Sat
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
RUP : rupProof Known C Prf
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < RUP: case RUP.

Variables: Known C Prf Sat Lits A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < IsLits: apply gatherLits_is to IsC RUP.

Variables: Known C Prf Sat Lits A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < IsA: apply negateLitList_is to IsLits RUP1.

Variables: Known C Prf Sat Lits A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < Or: apply is_list_lit_subset_or_not to IsA IsSat.

Variables: Known C Prf Sat Lits A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Or : (forall X, mem X A -> mem X Sat) \/
     (exists X, mem X A /\ (mem X Sat -> false))
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < Sub: case Or.

Subgoal 1:

Variables: Known C Prf Sat Lits A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : forall X, mem X A -> mem X Sat
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < apply good_assignment_sub to GA_Sat Sub.

Subgoal 1:

Variables: Known C Prf Sat Lits A
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : forall X, mem X A -> mem X Sat
H1 : good_assignment A
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < apply rupProof_help_unsat to _ _ _ RUP2 Sub Sat _ GA_Sat.

Subgoal 2:

Variables: Known C Prf Sat Lits A X
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < IsX: apply mem_is_lit to _ Sub.

Subgoal 2:

Variables: Known C Prf Sat Lits A X
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < Neg: apply negate_lit_exists to IsX.

Subgoal 2:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < IsNX: apply negate_lit_is_lit to IsX Neg.

Subgoal 2:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < Or: apply is_list_lit_mem_or_not to IsSat IsNX.

Subgoal 2:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
Or : mem NL Sat \/ (mem NL Sat -> false)
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < MemNXSat: case Or.

Subgoal 2.1:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < exists Sat.

Subgoal 2.1:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat
============================
 ((is_list is_lit Sat /\ good_assignment Sat) /\
 (forall L, mem L Sat -> mem L Sat)) /\
 sat_clause Sat C
 < split.

Subgoal 2.1.1:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat
============================
 is_list is_lit Sat
 < search.

Subgoal 2.1.2:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat
============================
 good_assignment Sat
 < search.

Subgoal 2.1.3:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat
============================
 forall L, mem L Sat -> mem L Sat
 < search.

Subgoal 2.1.4:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat
============================
 sat_clause Sat C
 < NegNLX: apply negate_lit_reverse to _ Neg.

Subgoal 2.1.4:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat
NegNLX : negate_lit NL X
============================
 sat_clause Sat C
 < apply negateLitList_mem_negate_before to _ Sub RUP1 _.

Subgoal 2.1.4:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat
NegNLX : negate_lit NL X
H1 : mem NL Lits
============================
 sat_clause Sat C
 < apply gatherLits_mem_sat to _ _ RUP _ MemNXSat.

Subgoal 2.1.4:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat
NegNLX : negate_lit NL X
H1 : mem NL Lits
H2 : sat_clause Sat C
============================
 sat_clause Sat C
 < search.

Subgoal 2.2:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
============================
 exists S,
   ((is_list is_lit S /\ good_assignment S) /\ (forall L, mem L Sat -> mem L S)) /\
   sat_clause S C
 < exists NL::Sat.

Subgoal 2.2:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
============================
 ((is_list is_lit (NL::Sat) /\ good_assignment (NL::Sat)) /\
 (forall L, mem L Sat -> mem L (NL::Sat))) /\
 sat_clause (NL::Sat) C
 < split.

Subgoal 2.2.1:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
============================
 is_list is_lit (NL::Sat)
 < search.

Subgoal 2.2.2:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
============================
 good_assignment (NL::Sat)
 < unfold .

Subgoal 2.2.2:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
============================
 forall L NL1, mem L (NL::Sat) -> negate_lit L NL1 -> mem NL1 (NL::Sat) -> false
 < intros ML NegL MNL.

Subgoal 2.2.2:

Variables: Known C Prf Sat Lits A X NL L NL1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
ML : mem L (NL::Sat)
NegL : negate_lit L NL1
MNL : mem NL1 (NL::Sat)
============================
 false
 < ML: case ML.

Subgoal 2.2.2.1:

Variables: Known C Prf Sat Lits A X NL NL1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit NL NL1
MNL : mem NL1 (NL::Sat)
============================
 false
 < NegNXX: apply negate_lit_reverse to _ Neg.

Subgoal 2.2.2.1:

Variables: Known C Prf Sat Lits A X NL NL1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit NL NL1
MNL : mem NL1 (NL::Sat)
NegNXX : negate_lit NL X
============================
 false
 < apply negate_lit_unique to _ NegL NegNXX.

Subgoal 2.2.2.1:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit NL X
MNL : mem X (NL::Sat)
NegNXX : negate_lit NL X
============================
 false
 < MNL: case MNL.

Subgoal 2.2.2.1.1:

Variables: Known C Prf Sat Lits A NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem NL A
Sub1 : mem NL Sat -> false
IsX : is_lit NL
Neg : negate_lit NL NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit NL NL
NegNXX : negate_lit NL NL
============================
 false
 < apply negate_lit_not_same to _ NegL.

Subgoal 2.2.2.1.2:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit NL X
NegNXX : negate_lit NL X
MNL : mem X Sat
============================
 false
 < apply Sub1 to MNL.

Subgoal 2.2.2.2:

Variables: Known C Prf Sat Lits A X NL L NL1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit L NL1
MNL : mem NL1 (NL::Sat)
ML : mem L Sat
============================
 false
 < MNL: case MNL.

Subgoal 2.2.2.2.1:

Variables: Known C Prf Sat Lits A X NL L
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit L NL
ML : mem L Sat
============================
 false
 < NegNXX: apply negate_lit_reverse to _ Neg.

Subgoal 2.2.2.2.1:

Variables: Known C Prf Sat Lits A X NL L
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit L NL
ML : mem L Sat
NegNXX : negate_lit NL X
============================
 false
 < apply mem_is_lit to _ ML.

Subgoal 2.2.2.2.1:

Variables: Known C Prf Sat Lits A X NL L
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit L NL
ML : mem L Sat
NegNXX : negate_lit NL X
H1 : is_lit L
============================
 false
 < NegNXL: apply negate_lit_reverse to _ NegL.

Subgoal 2.2.2.2.1:

Variables: Known C Prf Sat Lits A X NL L
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit L NL
ML : mem L Sat
NegNXX : negate_lit NL X
H1 : is_lit L
NegNXL : negate_lit NL L
============================
 false
 < apply negate_lit_unique to _ NegNXX NegNXL.

Subgoal 2.2.2.2.1:

Variables: Known C Prf Sat Lits A NL L
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem L A
Sub1 : mem L Sat -> false
IsX : is_lit L
Neg : negate_lit L NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit L NL
ML : mem L Sat
NegNXX : negate_lit NL L
H1 : is_lit L
NegNXL : negate_lit NL L
============================
 false
 < apply Sub1 to ML.

Subgoal 2.2.2.2.2:

Variables: Known C Prf Sat Lits A X NL L NL1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit L NL1
ML : mem L Sat
MNL : mem NL1 Sat
============================
 false
 < GA: case GA_Sat.

Subgoal 2.2.2.2.2:

Variables: Known C Prf Sat Lits A X NL L NL1
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
NegL : negate_lit L NL1
ML : mem L Sat
MNL : mem NL1 Sat
GA : forall L NL, mem L Sat -> negate_lit L NL -> mem NL Sat -> false
============================
 false
 < apply GA to ML NegL MNL.

Subgoal 2.2.3:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
============================
 forall L, mem L Sat -> mem L (NL::Sat)
 < search.

Subgoal 2.2.4:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
============================
 sat_clause (NL::Sat) C
 < apply negateLitList_mem_negate_before to _ Sub RUP1 _.

Subgoal 2.2.4:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
H1 : mem NL Lits
============================
 sat_clause (NL::Sat) C
 < apply gatherLits_mem_sat to _ _ RUP _ _ with
     Sat = NL::Sat.

Subgoal 2.2.4:

Variables: Known C Prf Sat Lits A X NL
IsKnown : is_list (is_pair is_integer is_clause) Known
IsSat : is_list is_lit Sat
Sat : forall ID InC, lookup Known ID InC -> sat_clause Sat InC
IsC : is_clause C
IsSat1 : is_list is_lit Sat
GA_Sat : good_assignment Sat
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help Known A Prf
IsLits : is_list is_lit Lits
IsA : is_list is_lit A
Sub : mem X A
Sub1 : mem X Sat -> false
IsX : is_lit X
Neg : negate_lit X NL
IsNX : is_lit NL
MemNXSat : mem NL Sat -> false
H1 : mem NL Lits
H2 : sat_clause (NL::Sat) C
============================
 sat_clause (NL::Sat) C
 < search.

Proof completed.
 < Theorem rupProof_orderless :
     forall K1 K2 C Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof K1 C Prf -> (forall ID C',
         mem (ID, C') K1 -> mem (ID, C') K2) -> rupProof K2 C Prf.

============================
 forall K1 K2 C Prf,
   is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
   good_clause_list K2 -> rupProof K1 C Prf -> (forall ID C',
     mem (ID, C') K1 -> mem (ID, C') K2) -> rupProof K2 C Prf
 < intros IsK1 IsK2 GCL RUP MemK1K2.

Variables: K1 K2 C Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
RUP : rupProof K1 C Prf
MemK1K2 : forall ID C', mem (ID, C') K1 -> mem (ID, C') K2
============================
 rupProof K2 C Prf
 < RUP: case RUP.

Variables: K1 K2 C Prf Lits A
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
MemK1K2 : forall ID C', mem (ID, C') K1 -> mem (ID, C') K2
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help K1 A Prf
============================
 rupProof K2 C Prf
 < apply rupProof_help_orderless to IsK1 IsK2 GCL RUP2 MemK1K2.

Variables: K1 K2 C Prf Lits A
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
MemK1K2 : forall ID C', mem (ID, C') K1 -> mem (ID, C') K2
RUP : gatherLits C Lits
RUP1 : negateLitList Lits A
RUP2 : rupProof_help K1 A Prf
H1 : rupProof_help K2 A Prf
============================
 rupProof K2 C Prf
 < search.

Proof completed.
 < Theorem rupProof_permutation :
     forall K1 K2 C Prf,
       is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> rupProof K1 C Prf -> permutation K1 K2 -> rupProof K2 C Prf.

============================
 forall K1 K2 C Prf,
   is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
   good_clause_list K2 -> rupProof K1 C Prf -> permutation K1 K2 -> rupProof K2 C Prf
 < intros IsK1 IsK2 GCL RUP Prm.

Variables: K1 K2 C Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
RUP : rupProof K1 C Prf
Prm : permutation K1 K2
============================
 rupProof K2 C Prf
 < MemBoth: assert forall ID C',
     mem (ID, C') K1 -> mem (ID, C') K2.

Subgoal 1:

Variables: K1 K2 C Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
RUP : rupProof K1 C Prf
Prm : permutation K1 K2
============================
 forall ID C', mem (ID, C') K1 -> mem (ID, C') K2
 < intros M.

Subgoal 1:

Variables: K1 K2 C Prf ID C'
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
RUP : rupProof K1 C Prf
Prm : permutation K1 K2
M : mem (ID, C') K1
============================
 mem (ID, C') K2
 < apply permutation_mem to Prm M.

Subgoal 1:

Variables: K1 K2 C Prf ID C'
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
RUP : rupProof K1 C Prf
Prm : permutation K1 K2
M : mem (ID, C') K1
H1 : mem (ID, C') K2
============================
 mem (ID, C') K2
 < search.

Variables: K1 K2 C Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
RUP : rupProof K1 C Prf
Prm : permutation K1 K2
MemBoth : forall ID C', mem (ID, C') K1 -> mem (ID, C') K2
============================
 rupProof K2 C Prf
 < apply rupProof_orderless to IsK1 IsK2 GCL RUP MemBoth.

Variables: K1 K2 C Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
RUP : rupProof K1 C Prf
Prm : permutation K1 K2
MemBoth : forall ID C', mem (ID, C') K1 -> mem (ID, C') K2
H1 : rupProof K2 C Prf
============================
 rupProof K2 C Prf
 < search.

Proof completed.
 < Projection_Constraint proj_proof_is :
   forall Known P PT,
   Proj : Known |{proof}- P ~~> PT ->
   IsP : is_proof P ->
   IsKnown : is_list (is_pair is_integer is_clause) Known ->
   GCL : good_clause_list Known ->
   is_proof PT.

Proof completed.
 < Projection_Constraint proj_proof_extend :
   forall Known P PT Known',
   Proj : Known |{proof}- P ~~> PT ->
   IsP : is_proof P ->
   IsKnown : is_list (is_pair is_integer is_clause) Known ->
   IsKnown' : is_list (is_pair is_integer is_clause) Known' ->
   GCL : good_clause_list Known ->
   GCL' : good_clause_list Known' ->
   Mems : (forall ID C,
     mem (ID, C) Known -> mem (ID, C) Known') ->
   Known' |{proof}- P ~~> PT.

Proof completed.
 < Theorem sat_lemma :
     forall ID C Known KRest S,
       (forall CID InC, lookup ((ID, C)::Known) CID InC -> sat_clause S InC) -> remove_all Known ID KRest ->
       forall CID InC, lookup ((ID, C)::KRest) CID InC -> sat_clause S InC.

============================
 forall ID C Known KRest S,
   (forall CID InC, lookup ((ID, C)::Known) CID InC -> sat_clause S InC) -> remove_all Known ID KRest ->
   forall CID InC, lookup ((ID, C)::KRest) CID InC -> sat_clause S InC
 < intros AllSat RA Lkp.

Variables: ID C Known KRest S CID InC
AllSat : forall CID InC, lookup ((ID, C)::Known) CID InC -> sat_clause S InC
RA : remove_all Known ID KRest
Lkp : lookup ((ID, C)::KRest) CID InC
============================
 sat_clause S InC
 < Lkp: case Lkp.

Subgoal 1:

Variables: Known KRest S CID InC
AllSat : forall CID1 InC1,
           lookup ((CID, InC)::Known) CID1 InC1 -> sat_clause S InC1
RA : remove_all Known CID KRest
============================
 sat_clause S InC
 < backchain AllSat.

Subgoal 2:

Variables: ID C Known KRest S CID InC
AllSat : forall CID InC, lookup ((ID, C)::Known) CID InC -> sat_clause S InC
RA : remove_all Known ID KRest
Lkp : ID = CID -> false
Lkp1 : lookup KRest CID InC
============================
 sat_clause S InC
 < apply remove_all_lookup_after to RA Lkp1.

Subgoal 2:

Variables: ID C Known KRest S CID InC
AllSat : forall CID InC, lookup ((ID, C)::Known) CID InC -> sat_clause S InC
RA : remove_all Known ID KRest
Lkp : ID = CID -> false
Lkp1 : lookup KRest CID InC
H1 : lookup Known CID InC
============================
 sat_clause S InC
 < backchain AllSat.

Proof completed.
 < Extensible_Theorem
      check_proof_correct : forall Known P Sat,
         IsP : is_proof P ->
         IsSat : is_list is_lit Sat ->
         GA_Sat : good_assignment Sat ->
         GCL : good_clause_list Known ->
         IsKnown : is_list (is_pair is_integer is_clause) Known ->
         CP : checkProof Known P ->
         Sat : (forall CID C,
           lookup Known CID C -> sat_clause Sat C) ->
         false
      on CP.

Subgoal 1:

Variables: Known Sat Prf ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (emptyLrat ID Prf)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (emptyLrat ID Prf) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : rupProof Known emptyClause Prf
============================
 false
 < assert good_assignment [].

Subgoal 1.1:

Variables: Known Sat Prf ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (emptyLrat ID Prf)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (emptyLrat ID Prf) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : rupProof Known emptyClause Prf
============================
 good_assignment []
 < unfold .

Subgoal 1.1:

Variables: Known Sat Prf ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (emptyLrat ID Prf)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (emptyLrat ID Prf) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : rupProof Known emptyClause Prf
============================
 forall L NL, mem L [] -> negate_lit L NL -> mem NL [] -> false
 < intros M.

Subgoal 1.1:

Variables: Known Sat Prf ID L NL
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (emptyLrat ID Prf)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (emptyLrat ID Prf) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : rupProof Known emptyClause Prf
M : mem L []
H1 : negate_lit L NL
H2 : mem NL []
============================
 false
 < case M.

Subgoal 1:

Variables: Known Sat Prf ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (emptyLrat ID Prf)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (emptyLrat ID Prf) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : rupProof Known emptyClause Prf
H1 : good_assignment []
============================
 false
 < assert forall L,
     mem L [] -> mem L Sat.

Subgoal 1.2:

Variables: Known Sat Prf ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (emptyLrat ID Prf)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (emptyLrat ID Prf) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : rupProof Known emptyClause Prf
H1 : good_assignment []
============================
 forall L, mem L [] -> mem L Sat
 < intros M.

Subgoal 1.2:

Variables: Known Sat Prf ID L
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (emptyLrat ID Prf)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (emptyLrat ID Prf) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : rupProof Known emptyClause Prf
H1 : good_assignment []
M : mem L []
============================
 mem L Sat
 < case M.

Subgoal 1:

Variables: Known Sat Prf ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (emptyLrat ID Prf)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (emptyLrat ID Prf) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : rupProof Known emptyClause Prf
H1 : good_assignment []
H2 : forall L, mem L [] -> mem L Sat
============================
 false
 < S: apply rupProof_maintains_sat to _ _ CP1 Sat _ IsSat GA_Sat.

Subgoal 1:

Variables: Known Sat Prf ID S
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (emptyLrat ID Prf)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (emptyLrat ID Prf) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : rupProof Known emptyClause Prf
H1 : good_assignment []
H2 : forall L, mem L [] -> mem L Sat
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S emptyClause
============================
 false
 < case S3.

Subgoal 2:

Variables: Known Sat KRest Rest Prf C ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (addLrupProof ID C Prf Rest)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
============================
 false
 < GA_Empty: assert good_assignment [].

Subgoal 2.1:

Variables: Known Sat KRest Rest Prf C ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (addLrupProof ID C Prf Rest)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
============================
 good_assignment []
 < unfold .

Subgoal 2.1:

Variables: Known Sat KRest Rest Prf C ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (addLrupProof ID C Prf Rest)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
============================
 forall L NL, mem L [] -> negate_lit L NL -> mem NL [] -> false
 < intros M.

Subgoal 2.1:

Variables: Known Sat KRest Rest Prf C ID L NL
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (addLrupProof ID C Prf Rest)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
M : mem L []
H1 : negate_lit L NL
H2 : mem NL []
============================
 false
 < case M.

Subgoal 2:

Variables: Known Sat KRest Rest Prf C ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (addLrupProof ID C Prf Rest)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
============================
 false
 < ExpandEmpty: assert forall L,
     mem L [] -> mem L Sat.

Subgoal 2.2:

Variables: Known Sat KRest Rest Prf C ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (addLrupProof ID C Prf Rest)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
============================
 forall L, mem L [] -> mem L Sat
 < intros M.

Subgoal 2.2:

Variables: Known Sat KRest Rest Prf C ID L
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (addLrupProof ID C Prf Rest)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
M : mem L []
============================
 mem L Sat
 < case M.

Subgoal 2:

Variables: Known Sat KRest Rest Prf C ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (addLrupProof ID C Prf Rest)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
============================
 false
 < Is: case IsP.

Subgoal 2:

Variables: Known Sat KRest Rest Prf C ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
============================
 false
 < S: apply rupProof_maintains_sat to _ _ CP2 Sat _ IsSat GA_Sat.

Subgoal 2:

Variables: Known Sat KRest Rest Prf C ID S
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
============================
 false
 < NewSat: assert forall CID InC,
     lookup ((ID, C)::Known) CID InC -> sat_clause S InC.

Subgoal 2.3:

Variables: Known Sat KRest Rest Prf C ID S
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
============================
 forall CID InC, lookup ((ID, C)::Known) CID InC -> sat_clause S InC
 < intros Lkp.

Subgoal 2.3:

Variables: Known Sat KRest Rest Prf C ID S CID InC
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
Lkp : lookup ((ID, C)::Known) CID InC
============================
 sat_clause S InC
 < Lkp: case Lkp.

Subgoal 2.3.1:

Variables: Known Sat KRest Rest Prf S CID InC
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof CID InC Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known CID KRest
CP2 : rupProof Known InC Prf
CP3 : checkProof ((CID, InC)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer CID
Is1 : is_clause InC
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S InC
============================
 sat_clause S InC
 < search.

Subgoal 2.3.2:

Variables: Known Sat KRest Rest Prf C ID S CID InC
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
Lkp : ID = CID -> false
Lkp1 : lookup Known CID InC
============================
 sat_clause S InC
 < SC: apply Sat to Lkp1.

Subgoal 2.3.2:

Variables: Known Sat KRest Rest Prf C ID S CID InC
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
Lkp : ID = CID -> false
Lkp1 : lookup Known CID InC
SC : sat_clause Sat InC
============================
 sat_clause S InC
 < M: apply lookup_mem to Lkp1.

Subgoal 2.3.2:

Variables: Known Sat KRest Rest Prf C ID S CID InC
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
Lkp : ID = CID -> false
Lkp1 : lookup Known CID InC
SC : sat_clause Sat InC
M : mem (CID, InC) Known
============================
 sat_clause S InC
 < Is: apply mem_is to _ M.

Subgoal 2.3.2:

Variables: Known Sat KRest Rest Prf C ID S ID1 C1
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
Lkp : ID = ID1 -> false
Lkp1 : lookup Known ID1 C1
SC : sat_clause Sat C1
M : mem (ID1, C1) Known
Is4 : is_integer ID1
Is5 : is_clause C1
============================
 sat_clause S C1
 < apply sat_clause_orderless to _ _ _ SC _.

Subgoal 2.3.2:

Variables: Known Sat KRest Rest Prf C ID S ID1 C1
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
Lkp : ID = ID1 -> false
Lkp1 : lookup Known ID1 C1
SC : sat_clause Sat C1
M : mem (ID1, C1) Known
Is4 : is_integer ID1
Is5 : is_clause C1
H1 : sat_clause S C1
============================
 sat_clause S C1
 < search.

Subgoal 2:

Variables: Known Sat KRest Rest Prf C ID S
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
NewSat : forall CID InC, lookup ((ID, C)::Known) CID InC -> sat_clause S InC
============================
 false
 < GCL_New: apply good_clause_list_remove_all_add to GCL CP1 with
              C = C.

Subgoal 2:

Variables: Known Sat KRest Rest Prf C ID S
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
NewSat : forall CID InC, lookup ((ID, C)::Known) CID InC -> sat_clause S InC
GCL_New : good_clause_list ((ID, C)::KRest)
============================
 false
 < IsKRest: apply remove_all_is to IsKnown CP1.

Subgoal 2:

Variables: Known Sat KRest Rest Prf C ID S
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
NewSat : forall CID InC, lookup ((ID, C)::Known) CID InC -> sat_clause S InC
GCL_New : good_clause_list ((ID, C)::KRest)
IsKRest : is_list (is_pair is_integer is_clause) KRest
============================
 false
 < apply IH to Is3 S S1 GCL_New _ CP3 _.

Subgoal 2:

Variables: Known Sat KRest Rest Prf C ID S
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (addLrupProof ID C Prf Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : remove_all Known ID KRest
CP2 : rupProof Known C Prf
CP3 : checkProof ((ID, C)::KRest) Rest *
GA_Empty : good_assignment []
ExpandEmpty : forall L, mem L [] -> mem L Sat
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf
Is3 : is_proof Rest
S : is_list is_lit S
S1 : good_assignment S
S2 : forall L, mem L Sat -> mem L S
S3 : sat_clause S C
NewSat : forall CID InC, lookup ((ID, C)::Known) CID InC -> sat_clause S InC
GCL_New : good_clause_list ((ID, C)::KRest)
IsKRest : is_list (is_pair is_integer is_clause) KRest
============================
 forall CID C1, lookup ((ID, C)::KRest) CID C1 -> sat_clause S C1
 < backchain sat_lemma.

Subgoal 3:

Variables: Known Sat C KRest Rest ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsP : is_proof (deleteLratProof ID Rest)
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
============================
 false
 < Is: case IsP.

Subgoal 3:

Variables: Known Sat C KRest Rest ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
============================
 false
 < SatKRest: assert forall CID C,
     lookup KRest CID C -> sat_clause Sat C.

Subgoal 3.1:

Variables: Known Sat C KRest Rest ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
============================
 forall CID C, lookup KRest CID C -> sat_clause Sat C
 < assert forall I C1 C2,
     mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2.

Subgoal 3.1.1:

Variables: Known Sat C KRest Rest ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
============================
 forall I C1 C2, mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2
 < intros MA MB.

Subgoal 3.1.1:

Variables: Known Sat C KRest Rest ID I C1 C2
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
MA : mem (I, C1) Known
MB : mem (I, C2) Known
============================
 C1 = C2
 < apply good_clause_list_mems to _ MA MB.

Subgoal 3.1.1:

Variables: Known Sat C KRest Rest ID I C2
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
MA : mem (I, C2) Known
MB : mem (I, C2) Known
============================
 C2 = C2
 < search.

Subgoal 3.1:

Variables: Known Sat C KRest Rest ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
H1 : forall I C1 C2, mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2
============================
 forall CID C, lookup KRest CID C -> sat_clause Sat C
 < intros Lkp.

Subgoal 3.1:

Variables: Known Sat C KRest Rest ID CID C1
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
H1 : forall I C1 C2, mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2
Lkp : lookup KRest CID C1
============================
 sat_clause Sat C1
 < MemKRest: apply lookup_mem to Lkp.

Subgoal 3.1:

Variables: Known Sat C KRest Rest ID CID C1
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
H1 : forall I C1 C2, mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2
Lkp : lookup KRest CID C1
MemKRest : mem (CID, C1) KRest
============================
 sat_clause Sat C1
 < MemKnown: apply mem_after_select_before to CP1 MemKRest.

Subgoal 3.1:

Variables: Known Sat C KRest Rest ID CID C1
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
H1 : forall I C1 C2, mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2
Lkp : lookup KRest CID C1
MemKRest : mem (CID, C1) KRest
MemKnown : mem (CID, C1) Known
============================
 sat_clause Sat C1
 < apply mem_is to IsKnown MemKnown.

Subgoal 3.1:

Variables: Known Sat C KRest Rest ID ID1 C2
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
H1 : forall I C1 C2, mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2
Lkp : lookup KRest ID1 C2
MemKRest : mem (ID1, C2) KRest
MemKnown : mem (ID1, C2) Known
H2 : is_integer ID1
H3 : is_clause C2
============================
 sat_clause Sat C2
 < apply lookup_after_select to IsKnown _ _ CP1 Lkp.

Subgoal 3.1:

Variables: Known Sat C KRest Rest ID ID1 C2
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
H1 : forall I C1 C2, mem (I, C1) Known -> mem (I, C2) Known -> C1 = C2
Lkp : lookup KRest ID1 C2
MemKRest : mem (ID1, C2) KRest
MemKnown : mem (ID1, C2) Known
H2 : is_integer ID1
H3 : is_clause C2
H4 : lookup Known ID1 C2
============================
 sat_clause Sat C2
 < backchain Sat.

Subgoal 3:

Variables: Known Sat C KRest Rest ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
SatKRest : forall CID C, lookup KRest CID C -> sat_clause Sat C
============================
 false
 < GCL_KRest: apply good_clause_list_select to GCL CP1.

Subgoal 3:

Variables: Known Sat C KRest Rest ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
SatKRest : forall CID C, lookup KRest CID C -> sat_clause Sat C
GCL_KRest : good_clause_list KRest
============================
 false
 < IsKRest: apply select_is to IsKnown CP1.

Subgoal 3:

Variables: Known Sat C KRest Rest ID
IH : forall Known P Sat,
       is_proof P -> is_list is_lit Sat -> good_assignment Sat -> good_clause_list Known ->
       is_list (is_pair is_integer is_clause) Known -> checkProof Known P * -> (forall CID C,
         lookup Known CID C -> sat_clause Sat C) -> false
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
GCL : good_clause_list Known
IsKnown : is_list (is_pair is_integer is_clause) Known
CP : checkProof Known (deleteLratProof ID Rest) @
Sat : forall CID C, lookup Known CID C -> sat_clause Sat C
CP1 : select (ID, C) KRest Known
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
SatKRest : forall CID C, lookup KRest CID C -> sat_clause Sat C
GCL_KRest : good_clause_list KRest
IsKRest : is_list (is_pair is_integer is_clause) KRest
============================
 false
 < apply IH to Is1 IsSat GA_Sat GCL_KRest IsKRest CP2 SatKRest.

Proof completed.
 < Extensible_Theorem
      checkProof_orderless : forall K1 K2 Prf,
         IsP : is_proof Prf ->
         IsK1 : is_list (is_pair is_integer is_clause) K1 ->
         IsK2 : is_list (is_pair is_integer is_clause) K2 ->
         GCL : good_clause_list K2 ->
         CP : checkProof K1 Prf ->
         Prm : permutation K1 K2 ->
         checkProof K2 Prf
      on CP.

Subgoal 1:

Variables: K1 K2 Prf1 ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsP : is_proof (emptyLrat ID Prf1)
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (emptyLrat ID Prf1) @
Prm : permutation K1 K2
CP1 : rupProof K1 emptyClause Prf1
============================
 checkProof K2 (emptyLrat ID Prf1)
 < apply rupProof_permutation to IsK1 IsK2 GCL CP1 Prm.

Subgoal 1:

Variables: K1 K2 Prf1 ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsP : is_proof (emptyLrat ID Prf1)
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (emptyLrat ID Prf1) @
Prm : permutation K1 K2
CP1 : rupProof K1 emptyClause Prf1
H1 : rupProof K2 emptyClause Prf1
============================
 checkProof K2 (emptyLrat ID Prf1)
 < search.

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsP : is_proof (addLrupProof ID C Prf1 Rest)
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < Is: case IsP.

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf1
Is3 : is_proof Rest
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < Prm': apply permutation_symmetric to Prm.

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf1
Is3 : is_proof Rest
Prm' : permutation K2 K1
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < GCL_K1: apply permutation_good_clause_list to _ Prm' GCL.

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf1
Is3 : is_proof Rest
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < RUPP: apply rupProof_permutation to IsK1 IsK2 GCL CP2 Prm.

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf1
Is3 : is_proof Rest
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
RUPP : rupProof K2 C Prf1
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < RA': apply remove_all_permutation to _ _ CP1 Prm.

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID P'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf1
Is3 : is_proof Rest
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
RUPP : rupProof K2 C Prf1
RA' : remove_all K2 ID P'
RA'1 : permutation KRest P'
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < Prm': assert permutation ((ID, C)::KRest) ((ID, C)::P').

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID P'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf1
Is3 : is_proof Rest
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
RUPP : rupProof K2 C Prf1
RA' : remove_all K2 ID P'
RA'1 : permutation KRest P'
Prm'1 : permutation ((ID, C)::KRest) ((ID, C)::P')
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < GCL_P': apply good_clause_list_remove_all_add to GCL RA' with
             C = C.

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID P'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf1
Is3 : is_proof Rest
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
RUPP : rupProof K2 C Prf1
RA' : remove_all K2 ID P'
RA'1 : permutation KRest P'
Prm'1 : permutation ((ID, C)::KRest) ((ID, C)::P')
GCL_P' : good_clause_list ((ID, C)::P')
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < apply remove_all_is to _ RA'.

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID P'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf1
Is3 : is_proof Rest
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
RUPP : rupProof K2 C Prf1
RA' : remove_all K2 ID P'
RA'1 : permutation KRest P'
Prm'1 : permutation ((ID, C)::KRest) ((ID, C)::P')
GCL_P' : good_clause_list ((ID, C)::P')
H1 : is_list (is_pair is_integer is_clause) P'
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < apply remove_all_is to _ CP1.

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID P'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf1
Is3 : is_proof Rest
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
RUPP : rupProof K2 C Prf1
RA' : remove_all K2 ID P'
RA'1 : permutation KRest P'
Prm'1 : permutation ((ID, C)::KRest) ((ID, C)::P')
GCL_P' : good_clause_list ((ID, C)::P')
H1 : is_list (is_pair is_integer is_clause) P'
H2 : is_list (is_pair is_integer is_clause) KRest
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < apply IH to Is3 _ _ GCL_P' CP3 _.

Subgoal 2:

Variables: K1 K2 KRest Rest Prf1 C ID P'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (addLrupProof ID C Prf1 Rest) @
Prm : permutation K1 K2
CP1 : remove_all K1 ID KRest
CP2 : rupProof K1 C Prf1
CP3 : checkProof ((ID, C)::KRest) Rest *
Is : is_integer ID
Is1 : is_clause C
Is2 : is_list is_integer Prf1
Is3 : is_proof Rest
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
RUPP : rupProof K2 C Prf1
RA' : remove_all K2 ID P'
RA'1 : permutation KRest P'
Prm'1 : permutation ((ID, C)::KRest) ((ID, C)::P')
GCL_P' : good_clause_list ((ID, C)::P')
H1 : is_list (is_pair is_integer is_clause) P'
H2 : is_list (is_pair is_integer is_clause) KRest
H3 : checkProof ((ID, C)::P') Rest
============================
 checkProof K2 (addLrupProof ID C Prf1 Rest)
 < search.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsP : is_proof (deleteLratProof ID Rest)
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
============================
 checkProof K2 (deleteLratProof ID Rest)
 < Is: case IsP.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
============================
 checkProof K2 (deleteLratProof ID Rest)
 < IsKRest: apply select_is to _ CP1.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
============================
 checkProof K2 (deleteLratProof ID Rest)
 < MK1: apply select_mem to CP1.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
MK1 : mem (ID, C) K1
============================
 checkProof K2 (deleteLratProof ID Rest)
 < MK2: apply permutation_mem to Prm MK1.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
MK1 : mem (ID, C) K1
MK2 : mem (ID, C) K2
============================
 checkProof K2 (deleteLratProof ID Rest)
 < S: apply mem_select to MK2.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID L'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
MK1 : mem (ID, C) K1
MK2 : mem (ID, C) K2
S : select (ID, C) L' K2
============================
 checkProof K2 (deleteLratProof ID Rest)
 < Prm': apply permutation_symmetric to Prm.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID L'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
MK1 : mem (ID, C) K1
MK2 : mem (ID, C) K2
S : select (ID, C) L' K2
Prm' : permutation K2 K1
============================
 checkProof K2 (deleteLratProof ID Rest)
 < GCL_K1: apply permutation_good_clause_list to _ Prm' GCL.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID L'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
MK1 : mem (ID, C) K1
MK2 : mem (ID, C) K2
S : select (ID, C) L' K2
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
============================
 checkProof K2 (deleteLratProof ID Rest)
 < GCL_L': apply good_clause_list_select to GCL S.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID L'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
MK1 : mem (ID, C) K1
MK2 : mem (ID, C) K2
S : select (ID, C) L' K2
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
GCL_L' : good_clause_list L'
============================
 checkProof K2 (deleteLratProof ID Rest)
 < IsL': apply select_is to _ S.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID L'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
MK1 : mem (ID, C) K1
MK2 : mem (ID, C) K2
S : select (ID, C) L' K2
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
GCL_L' : good_clause_list L'
IsL' : is_list (is_pair is_integer is_clause) L'
============================
 checkProof K2 (deleteLratProof ID Rest)
 < P': apply selects_permutation to _ _ Prm' _ _.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID L'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
MK1 : mem (ID, C) K1
MK2 : mem (ID, C) K2
S : select (ID, C) L' K2
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
GCL_L' : good_clause_list L'
IsL' : is_list (is_pair is_integer is_clause) L'
P' : permutation L' KRest
============================
 checkProof K2 (deleteLratProof ID Rest)
 < PrmSub: apply permutation_symmetric to P'.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID L'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
MK1 : mem (ID, C) K1
MK2 : mem (ID, C) K2
S : select (ID, C) L' K2
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
GCL_L' : good_clause_list L'
IsL' : is_list (is_pair is_integer is_clause) L'
P' : permutation L' KRest
PrmSub : permutation KRest L'
============================
 checkProof K2 (deleteLratProof ID Rest)
 < apply IH to Is1 _ _ GCL_L' CP2 PrmSub.

Subgoal 3:

Variables: K1 K2 C KRest Rest ID L'
IH : forall K1 K2 Prf,
       is_proof Prf -> is_list (is_pair is_integer is_clause) K1 -> is_list (is_pair is_integer is_clause) K2 ->
       good_clause_list K2 -> checkProof K1 Prf * -> permutation K1 K2 -> checkProof K2 Prf
IsK1 : is_list (is_pair is_integer is_clause) K1
IsK2 : is_list (is_pair is_integer is_clause) K2
GCL : good_clause_list K2
CP : checkProof K1 (deleteLratProof ID Rest) @
Prm : permutation K1 K2
CP1 : select (ID, C) KRest K1
CP2 : checkProof KRest Rest *
Is : is_integer ID
Is1 : is_proof Rest
IsKRest : is_list (is_pair is_integer is_clause) KRest
MK1 : mem (ID, C) K1
MK2 : mem (ID, C) K2
S : select (ID, C) L' K2
Prm' : permutation K2 K1
GCL_K1 : good_clause_list K1
GCL_L' : good_clause_list L'
IsL' : is_list (is_pair is_integer is_clause) L'
P' : permutation L' KRest
PrmSub : permutation KRest L'
H1 : checkProof L' Rest
============================
 checkProof K2 (deleteLratProof ID Rest)
 < search.

Proof completed.
 < Ext_Size checkProof Known P.

Proof completed.
 < Proj_Rel checkProof Known P.

Proof completed.
 < Ext_Ind forall Known P, checkProof Known P with
            IsP : is_proof P, IsKnown : is_list (is_pair is_integer is_clause) Known, GCL : good_clause_list Known.

Subgoal 1:

Variables: Known Prf ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (emptyLrat ID Prf) 0 @@
Acc : acc 0 @
IsP : is_proof (emptyLrat ID Prf)
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : rupProof Known emptyClause Prf
============================
 <checkProof {P}> Known (emptyLrat ID Prf)
 < search.

Subgoal 2:

Variables: N Known KRest Rest Prf C ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (addLrupProof ID C Prf Rest) N @@
Acc : acc N @
IsP : is_proof (addLrupProof ID C Prf Rest)
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : remove_all Known ID KRest
R2 : rupProof Known C Prf
R3 : <checkProof {ES}> ((ID, C)::KRest) Rest N **
============================
 <checkProof {P}> Known (addLrupProof ID C Prf Rest)
 < case IsP.

Subgoal 2:

Variables: N Known KRest Rest Prf C ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (addLrupProof ID C Prf Rest) N @@
Acc : acc N @
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : remove_all Known ID KRest
R2 : rupProof Known C Prf
R3 : <checkProof {ES}> ((ID, C)::KRest) Rest N **
H1 : is_integer ID
H2 : is_clause C
H3 : is_list is_integer Prf
H4 : is_proof Rest
============================
 <checkProof {P}> Known (addLrupProof ID C Prf Rest)
 < apply remove_all_is to _ R1.

Subgoal 2:

Variables: N Known KRest Rest Prf C ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (addLrupProof ID C Prf Rest) N @@
Acc : acc N @
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : remove_all Known ID KRest
R2 : rupProof Known C Prf
R3 : <checkProof {ES}> ((ID, C)::KRest) Rest N **
H1 : is_integer ID
H2 : is_clause C
H3 : is_list is_integer Prf
H4 : is_proof Rest
H5 : is_list (is_pair is_integer is_clause) KRest
============================
 <checkProof {P}> Known (addLrupProof ID C Prf Rest)
 < apply good_clause_list_remove_all_add to GCL R1 with
     C = C.

Subgoal 2:

Variables: N Known KRest Rest Prf C ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (addLrupProof ID C Prf Rest) N @@
Acc : acc N @
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : remove_all Known ID KRest
R2 : rupProof Known C Prf
R3 : <checkProof {ES}> ((ID, C)::KRest) Rest N **
H1 : is_integer ID
H2 : is_clause C
H3 : is_list is_integer Prf
H4 : is_proof Rest
H5 : is_list (is_pair is_integer is_clause) KRest
H6 : good_clause_list ((ID, C)::KRest)
============================
 <checkProof {P}> Known (addLrupProof ID C Prf Rest)
 < apply IH1 to R3 Acc _ _ _.

Subgoal 2:

Variables: N Known KRest Rest Prf C ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (addLrupProof ID C Prf Rest) N @@
Acc : acc N @
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : remove_all Known ID KRest
R2 : rupProof Known C Prf
R3 : <checkProof {ES}> ((ID, C)::KRest) Rest N **
H1 : is_integer ID
H2 : is_clause C
H3 : is_list is_integer Prf
H4 : is_proof Rest
H5 : is_list (is_pair is_integer is_clause) KRest
H6 : good_clause_list ((ID, C)::KRest)
H7 : <checkProof {P}> ((ID, C)::KRest) Rest
============================
 <checkProof {P}> Known (addLrupProof ID C Prf Rest)
 < search.

Subgoal 3:

Variables: N Known C KRest Rest ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (deleteLratProof ID Rest) N @@
Acc : acc N @
IsP : is_proof (deleteLratProof ID Rest)
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : select (ID, C) KRest Known
R2 : <checkProof {ES}> KRest Rest N **
============================
 <checkProof {P}> Known (deleteLratProof ID Rest)
 < case IsP.

Subgoal 3:

Variables: N Known C KRest Rest ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (deleteLratProof ID Rest) N @@
Acc : acc N @
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : select (ID, C) KRest Known
R2 : <checkProof {ES}> KRest Rest N **
H1 : is_integer ID
H2 : is_proof Rest
============================
 <checkProof {P}> Known (deleteLratProof ID Rest)
 < apply select_is to _ R1.

Subgoal 3:

Variables: N Known C KRest Rest ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (deleteLratProof ID Rest) N @@
Acc : acc N @
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : select (ID, C) KRest Known
R2 : <checkProof {ES}> KRest Rest N **
H1 : is_integer ID
H2 : is_proof Rest
H3 : is_list (is_pair is_integer is_clause) KRest
============================
 <checkProof {P}> Known (deleteLratProof ID Rest)
 < apply good_clause_list_select to GCL R1.

Subgoal 3:

Variables: N Known C KRest Rest ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (deleteLratProof ID Rest) N @@
Acc : acc N @
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : select (ID, C) KRest Known
R2 : <checkProof {ES}> KRest Rest N **
H1 : is_integer ID
H2 : is_proof Rest
H3 : is_list (is_pair is_integer is_clause) KRest
H4 : good_clause_list KRest
============================
 <checkProof {P}> Known (deleteLratProof ID Rest)
 < apply IH1 to R2 Acc _ _ _.

Subgoal 3:

Variables: N Known C KRest Rest ID
IH : forall N Known P,
       <checkProof {ES}> Known P N -> acc N * -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
       good_clause_list Known -> <checkProof {P}> Known P
IH1 : forall N Known P,
        <checkProof {ES}> Known P N ** -> acc N @ -> is_proof P -> is_list (is_pair is_integer is_clause) Known ->
        good_clause_list Known -> <checkProof {P}> Known P
R : <checkProof {ES}> Known (deleteLratProof ID Rest) N @@
Acc : acc N @
IsKnown : is_list (is_pair is_integer is_clause) Known
GCL : good_clause_list Known
R1 : select (ID, C) KRest Known
R2 : <checkProof {ES}> KRest Rest N **
H1 : is_integer ID
H2 : is_proof Rest
H3 : is_list (is_pair is_integer is_clause) KRest
H4 : good_clause_list KRest
H5 : <checkProof {P}> KRest Rest
============================
 <checkProof {P}> Known (deleteLratProof ID Rest)
 < search.

Proof completed.
 < Projection_Constraint proj_checkProof :
   forall Known P P',
   Known |{proof}- P ~~> P' -> checkProof Known P -> is_list (is_pair is_integer is_clause) Known ->
   good_clause_list Known -> checkProof Known P'.

Proof completed.
 < Extensible_Theorem
      formulaToKnown_unique : forall F ID KA KB,
         IsF : is_formula F ->
         IsID : is_integer ID ->
         FTKA : formulaToKnown ID F KA ->
         FTKB : formulaToKnown ID F KB ->
         KA = KB
      on FTKA.

Subgoal 1:

Variables: ID KB
IH : forall F ID KA KB,
       is_formula F -> is_integer ID -> formulaToKnown ID F KA * -> formulaToKnown ID F KB ->
       KA = KB
IsF : is_formula emptyFormula
IsID : is_integer ID
FTKA : formulaToKnown ID emptyFormula [] @
FTKB : formulaToKnown ID emptyFormula KB
============================
 [] = KB
 < case FTKB.

Subgoal 1:

Variables: ID
IH : forall F ID KA KB,
       is_formula F -> is_integer ID -> formulaToKnown ID F KA * -> formulaToKnown ID F KB ->
       KA = KB
IsF : is_formula emptyFormula
IsID : is_integer ID
FTKA : formulaToKnown ID emptyFormula [] @
============================
 [] = []
 < search.

Subgoal 2:

Variables: ID KB NewID KRest C Rest
IH : forall F ID KA KB,
       is_formula F -> is_integer ID -> formulaToKnown ID F KA * -> formulaToKnown ID F KB ->
       KA = KB
IsF : is_formula (and C Rest)
IsID : is_integer ID
FTKA : formulaToKnown ID (and C Rest) ((ID, C)::KRest) @
FTKB : formulaToKnown ID (and C Rest) KB
FTKA1 : ID + 1 = NewID
FTKA2 : formulaToKnown NewID Rest KRest *
============================
 (ID, C)::KRest = KB
 < FTKB: case FTKB.

Subgoal 2:

Variables: ID NewID KRest C Rest NewID1 KRest1
IH : forall F ID KA KB,
       is_formula F -> is_integer ID -> formulaToKnown ID F KA * -> formulaToKnown ID F KB ->
       KA = KB
IsF : is_formula (and C Rest)
IsID : is_integer ID
FTKA : formulaToKnown ID (and C Rest) ((ID, C)::KRest) @
FTKA1 : ID + 1 = NewID
FTKA2 : formulaToKnown NewID Rest KRest *
FTKB : ID + 1 = NewID1
FTKB1 : formulaToKnown NewID1 Rest KRest1
============================
 (ID, C)::KRest = (ID, C)::KRest1
 < apply plus_integer_unique to FTKA1 FTKB.

Subgoal 2:

Variables: ID KRest C Rest NewID1 KRest1
IH : forall F ID KA KB,
       is_formula F -> is_integer ID -> formulaToKnown ID F KA * -> formulaToKnown ID F KB ->
       KA = KB
IsF : is_formula (and C Rest)
IsID : is_integer ID
FTKA : formulaToKnown ID (and C Rest) ((ID, C)::KRest) @
FTKA1 : ID + 1 = NewID1
FTKA2 : formulaToKnown NewID1 Rest KRest *
FTKB : ID + 1 = NewID1
FTKB1 : formulaToKnown NewID1 Rest KRest1
============================
 (ID, C)::KRest = (ID, C)::KRest1
 < apply plus_integer_is_integer to _ _ FTKA1.

Subgoal 2:

Variables: ID KRest C Rest NewID1 KRest1
IH : forall F ID KA KB,
       is_formula F -> is_integer ID -> formulaToKnown ID F KA * -> formulaToKnown ID F KB ->
       KA = KB
IsF : is_formula (and C Rest)
IsID : is_integer ID
FTKA : formulaToKnown ID (and C Rest) ((ID, C)::KRest) @
FTKA1 : ID + 1 = NewID1
FTKA2 : formulaToKnown NewID1 Rest KRest *
FTKB : ID + 1 = NewID1
FTKB1 : formulaToKnown NewID1 Rest KRest1
H1 : is_integer NewID1
============================
 (ID, C)::KRest = (ID, C)::KRest1
 < case IsF.

Subgoal 2:

Variables: ID KRest C Rest NewID1 KRest1
IH : forall F ID KA KB,
       is_formula F -> is_integer ID -> formulaToKnown ID F KA * -> formulaToKnown ID F KB ->
       KA = KB
IsID : is_integer ID
FTKA : formulaToKnown ID (and C Rest) ((ID, C)::KRest) @
FTKA1 : ID + 1 = NewID1
FTKA2 : formulaToKnown NewID1 Rest KRest *
FTKB : ID + 1 = NewID1
FTKB1 : formulaToKnown NewID1 Rest KRest1
H1 : is_integer NewID1
H2 : is_clause C
H3 : is_formula Rest
============================
 (ID, C)::KRest = (ID, C)::KRest1
 < apply IH to _ _ FTKA2 FTKB1.

Subgoal 2:

Variables: ID C Rest NewID1 KRest1
IH : forall F ID KA KB,
       is_formula F -> is_integer ID -> formulaToKnown ID F KA * -> formulaToKnown ID F KB ->
       KA = KB
IsID : is_integer ID
FTKA : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
FTKA1 : ID + 1 = NewID1
FTKA2 : formulaToKnown NewID1 Rest KRest1 *
FTKB : ID + 1 = NewID1
FTKB1 : formulaToKnown NewID1 Rest KRest1
H1 : is_integer NewID1
H2 : is_clause C
H3 : is_formula Rest
============================
 (ID, C)::KRest1 = (ID, C)::KRest1
 < search.

Proof completed.
 < Extensible_Theorem
      formulaToKnown_all_greater : forall F ID K CID C,
         FTK : formulaToKnown ID F K ->
         Mem : mem (CID, C) K ->
         IsID : is_integer ID ->
         CID >= ID
      on FTK.

Subgoal 1:

Variables: ID CID C
IH : forall F ID K CID C,
       formulaToKnown ID F K * -> mem (CID, C) K -> is_integer ID -> CID >= ID
FTK : formulaToKnown ID emptyFormula [] @
Mem : mem (CID, C) []
IsID : is_integer ID
============================
 CID >= ID
 < case Mem.

Subgoal 2:

Variables: ID CID C NewID KRest C1 Rest
IH : forall F ID K CID C,
       formulaToKnown ID F K * -> mem (CID, C) K -> is_integer ID -> CID >= ID
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
Mem : mem (CID, C) ((ID, C1)::KRest)
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
============================
 CID >= ID
 < Mem: case Mem.

Subgoal 2.1:

Variables: ID NewID KRest C1 Rest
IH : forall F ID K CID C,
       formulaToKnown ID F K * -> mem (CID, C) K -> is_integer ID -> CID >= ID
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
============================
 ID >= ID
 < backchain is_integer_greatereq.

Subgoal 2.2:

Variables: ID CID C NewID KRest C1 Rest
IH : forall F ID K CID C,
       formulaToKnown ID F K * -> mem (CID, C) K -> is_integer ID -> CID >= ID
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
Mem : mem (CID, C) KRest
============================
 CID >= ID
 < IsNewID: apply plus_integer_is_integer to _ _ FTK1.

Subgoal 2.2:

Variables: ID CID C NewID KRest C1 Rest
IH : forall F ID K CID C,
       formulaToKnown ID F K * -> mem (CID, C) K -> is_integer ID -> CID >= ID
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
Mem : mem (CID, C) KRest
IsNewID : is_integer NewID
============================
 CID >= ID
 < GEq: apply IH to FTK2 Mem IsNewID.

Subgoal 2.2:

Variables: ID CID C NewID KRest C1 Rest
IH : forall F ID K CID C,
       formulaToKnown ID F K * -> mem (CID, C) K -> is_integer ID -> CID >= ID
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
Mem : mem (CID, C) KRest
IsNewID : is_integer NewID
GEq : CID >= NewID
============================
 CID >= ID
 < G_ID: apply is_integer_greatereq to IsID.

Subgoal 2.2:

Variables: ID CID C NewID KRest C1 Rest
IH : forall F ID K CID C,
       formulaToKnown ID F K * -> mem (CID, C) K -> is_integer ID -> CID >= ID
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
Mem : mem (CID, C) KRest
IsNewID : is_integer NewID
GEq : CID >= NewID
G_ID : ID >= ID
============================
 CID >= ID
 < G_New: apply greatereq_integer__add_positive to G_ID _ FTK1.

Subgoal 2.2:

Variables: ID CID C NewID KRest C1 Rest
IH : forall F ID K CID C,
       formulaToKnown ID F K * -> mem (CID, C) K -> is_integer ID -> CID >= ID
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
Mem : mem (CID, C) KRest
IsNewID : is_integer NewID
GEq : CID >= NewID
G_ID : ID >= ID
G_New : NewID >= ID
============================
 CID >= ID
 < apply greatereq_integer_transitive to GEq G_New.

Subgoal 2.2:

Variables: ID CID C NewID KRest C1 Rest
IH : forall F ID K CID C,
       formulaToKnown ID F K * -> mem (CID, C) K -> is_integer ID -> CID >= ID
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
Mem : mem (CID, C) KRest
IsNewID : is_integer NewID
GEq : CID >= NewID
G_ID : ID >= ID
G_New : NewID >= ID
H1 : CID >= ID
============================
 CID >= ID
 < search.

Proof completed.
 < Extensible_Theorem
      formulaToKnown_all_unique : forall F ID K CID CA KRest CB,
         FTK : formulaToKnown ID F K ->
         IsID : is_integer ID ->
         Slct : select (CID, CA) KRest K ->
         Mem : mem (CID, CB) KRest ->
         false
      on FTK.

Subgoal 1:

Variables: ID CID CA KRest CB
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID emptyFormula [] @
IsID : is_integer ID
Slct : select (CID, CA) KRest []
Mem : mem (CID, CB) KRest
============================
 false
 < case Slct.

Subgoal 2:

Variables: ID CID CA KRest CB NewID KRest1 C Rest
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
Slct : select (CID, CA) KRest ((ID, C)::KRest1)
Mem : mem (CID, CB) KRest
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
============================
 false
 < IsNewID: apply plus_integer_is_integer to _ _ FTK1.

Subgoal 2:

Variables: ID CID CA KRest CB NewID KRest1 C Rest
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
Slct : select (CID, CA) KRest ((ID, C)::KRest1)
Mem : mem (CID, CB) KRest
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
============================
 false
 < G: apply greater_plus_positive to _ _ FTK1 _.

Subgoal 2:

Variables: ID CID CA KRest CB NewID KRest1 C Rest
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
Slct : select (CID, CA) KRest ((ID, C)::KRest1)
Mem : mem (CID, CB) KRest
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
============================
 false
 < Slct: case Slct.

Subgoal 2.1:

Variables: ID CB NewID KRest1 C Rest
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
Mem : mem (ID, CB) KRest1
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
============================
 false
 < GEq: apply formulaToKnown_all_greater to FTK2 Mem IsNewID.

Subgoal 2.1:

Variables: ID CB NewID KRest1 C Rest
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
Mem : mem (ID, CB) KRest1
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
GEq : ID >= NewID
============================
 false
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 2.1:

Variables: ID CB NewID KRest1 C Rest
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
Mem : mem (ID, CB) KRest1
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
GEq : ID >= NewID
Or : ID > NewID \/ ID = NewID
============================
 false
 < Or: case Or.

Subgoal 2.1.1:

Variables: ID CB NewID KRest1 C Rest
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
Mem : mem (ID, CB) KRest1
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
GEq : ID >= NewID
Or : ID > NewID
============================
 false
 < L: apply greater_integer_flip_less to Or.

Subgoal 2.1.1:

Variables: ID CB NewID KRest1 C Rest
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
Mem : mem (ID, CB) KRest1
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
GEq : ID >= NewID
Or : ID > NewID
L : NewID < ID
============================
 false
 < apply greater_less_impossible to G L.

Subgoal 2.1.2:

Variables: CB NewID KRest1 C Rest
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown NewID (and C Rest) ((NewID, C)::KRest1) @
IsID : is_integer NewID
Mem : mem (NewID, CB) KRest1
FTK1 : NewID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > NewID
GEq : NewID >= NewID
============================
 false
 < apply greater_integer_not_eq to G.

Subgoal 2.2:

Variables: ID CID CA CB NewID KRest1 C Rest L1
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
Mem : mem (CID, CB) ((ID, C)::L1)
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
Slct : select (CID, CA) L1 KRest1
============================
 false
 < Mem: case Mem.

Subgoal 2.2.1:

Variables: ID CA NewID KRest1 C Rest L1
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
Slct : select (ID, CA) L1 KRest1
============================
 false
 < MS: apply select_mem to Slct.

Subgoal 2.2.1:

Variables: ID CA NewID KRest1 C Rest L1
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
Slct : select (ID, CA) L1 KRest1
MS : mem (ID, CA) KRest1
============================
 false
 < GEq: apply formulaToKnown_all_greater to FTK2 MS IsNewID.

Subgoal 2.2.1:

Variables: ID CA NewID KRest1 C Rest L1
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
Slct : select (ID, CA) L1 KRest1
MS : mem (ID, CA) KRest1
GEq : ID >= NewID
============================
 false
 < Or: apply greatereq_integer_greater_or_eq to GEq.

Subgoal 2.2.1:

Variables: ID CA NewID KRest1 C Rest L1
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
Slct : select (ID, CA) L1 KRest1
MS : mem (ID, CA) KRest1
GEq : ID >= NewID
Or : ID > NewID \/ ID = NewID
============================
 false
 < Or: case Or.

Subgoal 2.2.1.1:

Variables: ID CA NewID KRest1 C Rest L1
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
Slct : select (ID, CA) L1 KRest1
MS : mem (ID, CA) KRest1
GEq : ID >= NewID
Or : ID > NewID
============================
 false
 < L: apply greater_integer_flip_less to Or.

Subgoal 2.2.1.1:

Variables: ID CA NewID KRest1 C Rest L1
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
Slct : select (ID, CA) L1 KRest1
MS : mem (ID, CA) KRest1
GEq : ID >= NewID
Or : ID > NewID
L : NewID < ID
============================
 false
 < apply greater_less_impossible to G L.

Subgoal 2.2.1.2:

Variables: CA NewID KRest1 C Rest L1
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown NewID (and C Rest) ((NewID, C)::KRest1) @
IsID : is_integer NewID
FTK1 : NewID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > NewID
Slct : select (NewID, CA) L1 KRest1
MS : mem (NewID, CA) KRest1
GEq : NewID >= NewID
============================
 false
 < apply greater_integer_not_eq to G.

Subgoal 2.2.2:

Variables: ID CID CA CB NewID KRest1 C Rest L1
IH : forall F ID K CID CA KRest CB,
       formulaToKnown ID F K * -> is_integer ID -> select (CID, CA) KRest K -> mem (CID, CB) KRest ->
       false
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest1) @
IsID : is_integer ID
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest1 *
IsNewID : is_integer NewID
G : NewID > ID
Slct : select (CID, CA) L1 KRest1
Mem : mem (CID, CB) L1
============================
 false
 < apply IH to FTK2 IsNewID Slct Mem.

Proof completed.
 < Extensible_Theorem
      formulaToKnown_sat_formula : forall F ID K A CID C,
         FTK : formulaToKnown ID F K ->
         Sat : sat_formula A F ->
         Mem : mem (CID, C) K ->
         sat_clause A C
      on FTK.

Subgoal 1:

Variables: ID A CID C
IH : forall F ID K A CID C,
       formulaToKnown ID F K * -> sat_formula A F -> mem (CID, C) K -> sat_clause A C
FTK : formulaToKnown ID emptyFormula [] @
Sat : sat_formula A emptyFormula
Mem : mem (CID, C) []
============================
 sat_clause A C
 < case Mem.

Subgoal 2:

Variables: ID A CID C NewID KRest C1 Rest
IH : forall F ID K A CID C,
       formulaToKnown ID F K * -> sat_formula A F -> mem (CID, C) K -> sat_clause A C
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
Sat : sat_formula A (and C1 Rest)
Mem : mem (CID, C) ((ID, C1)::KRest)
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
============================
 sat_clause A C
 < Sat: case Sat.

Subgoal 2:

Variables: ID A CID C NewID KRest C1 Rest
IH : forall F ID K A CID C,
       formulaToKnown ID F K * -> sat_formula A F -> mem (CID, C) K -> sat_clause A C
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
Mem : mem (CID, C) ((ID, C1)::KRest)
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
Sat : sat_clause A C1
Sat1 : sat_formula A Rest
============================
 sat_clause A C
 < Mem: case Mem.

Subgoal 2.1:

Variables: ID A NewID KRest C1 Rest
IH : forall F ID K A CID C,
       formulaToKnown ID F K * -> sat_formula A F -> mem (CID, C) K -> sat_clause A C
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
Sat : sat_clause A C1
Sat1 : sat_formula A Rest
============================
 sat_clause A C1
 < search.

Subgoal 2.2:

Variables: ID A CID C NewID KRest C1 Rest
IH : forall F ID K A CID C,
       formulaToKnown ID F K * -> sat_formula A F -> mem (CID, C) K -> sat_clause A C
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
Sat : sat_clause A C1
Sat1 : sat_formula A Rest
Mem : mem (CID, C) KRest
============================
 sat_clause A C
 < apply IH to FTK2 Sat1 Mem.

Subgoal 2.2:

Variables: ID A CID C NewID KRest C1 Rest
IH : forall F ID K A CID C,
       formulaToKnown ID F K * -> sat_formula A F -> mem (CID, C) K -> sat_clause A C
FTK : formulaToKnown ID (and C1 Rest) ((ID, C1)::KRest) @
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
Sat : sat_clause A C1
Sat1 : sat_formula A Rest
Mem : mem (CID, C) KRest
H1 : sat_clause A C
============================
 sat_clause A C
 < search.

Proof completed.
 < Extensible_Theorem
      formulaToKnown_is : forall F ID K,
         IsF : is_formula F ->
         IsID : is_integer ID ->
         FTK : formulaToKnown ID F K ->
         is_list (is_pair is_integer is_clause) K
      on FTK.

Subgoal 1:

Variables: ID
IH : forall F ID K,
       is_formula F -> is_integer ID -> formulaToKnown ID F K * -> is_list (is_pair is_integer is_clause) K
IsF : is_formula emptyFormula
IsID : is_integer ID
FTK : formulaToKnown ID emptyFormula [] @
============================
 is_list (is_pair is_integer is_clause) []
 < search.

Subgoal 2:

Variables: ID NewID KRest C Rest
IH : forall F ID K,
       is_formula F -> is_integer ID -> formulaToKnown ID F K * -> is_list (is_pair is_integer is_clause) K
IsF : is_formula (and C Rest)
IsID : is_integer ID
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest) @
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
============================
 is_list (is_pair is_integer is_clause) ((ID, C)::KRest)
 < IsNewID: apply plus_integer_is_integer to IsID _ FTK1.

Subgoal 2:

Variables: ID NewID KRest C Rest
IH : forall F ID K,
       is_formula F -> is_integer ID -> formulaToKnown ID F K * -> is_list (is_pair is_integer is_clause) K
IsF : is_formula (and C Rest)
IsID : is_integer ID
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest) @
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
IsNewID : is_integer NewID
============================
 is_list (is_pair is_integer is_clause) ((ID, C)::KRest)
 < Is: case IsF.

Subgoal 2:

Variables: ID NewID KRest C Rest
IH : forall F ID K,
       is_formula F -> is_integer ID -> formulaToKnown ID F K * -> is_list (is_pair is_integer is_clause) K
IsID : is_integer ID
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest) @
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
IsNewID : is_integer NewID
Is : is_clause C
Is1 : is_formula Rest
============================
 is_list (is_pair is_integer is_clause) ((ID, C)::KRest)
 < apply IH to Is1 IsNewID FTK2.

Subgoal 2:

Variables: ID NewID KRest C Rest
IH : forall F ID K,
       is_formula F -> is_integer ID -> formulaToKnown ID F K * -> is_list (is_pair is_integer is_clause) K
IsID : is_integer ID
FTK : formulaToKnown ID (and C Rest) ((ID, C)::KRest) @
FTK1 : ID + 1 = NewID
FTK2 : formulaToKnown NewID Rest KRest *
IsNewID : is_integer NewID
Is : is_clause C
Is1 : is_formula Rest
H1 : is_list (is_pair is_integer is_clause) KRest
============================
 is_list (is_pair is_integer is_clause) ((ID, C)::KRest)
 < search.

Proof completed.
 < Theorem proveFormula_correct :
     forall F Prf Sat,
       is_formula F -> is_proof Prf -> is_list is_lit Sat -> good_assignment Sat ->
       proveFormula F Prf -> sat_formula Sat F -> false.

============================
 forall F Prf Sat,
   is_formula F -> is_proof Prf -> is_list is_lit Sat -> good_assignment Sat -> proveFormula F Prf ->
   sat_formula Sat F -> false
 < intros IsF IsP IsSat GA_Sat PF Sat.

Variables: F Prf Sat
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
PF : proveFormula F Prf
Sat : sat_formula Sat F
============================
 false
 < PF: case PF.

Variables: F Prf Sat KnownClauses
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
============================
 false
 < GCL: assert good_clause_list KnownClauses.

Subgoal 1:

Variables: F Prf Sat KnownClauses
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
============================
 good_clause_list KnownClauses
 < unfold .

Subgoal 1:

Variables: F Prf Sat KnownClauses
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
============================
 forall ID C1 KRest C2,
   select (ID, C1) KRest KnownClauses -> mem (ID, C2) KRest -> false
 < intros S M.

Subgoal 1:

Variables: F Prf Sat KnownClauses ID C1 KRest C2
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
S : select (ID, C1) KRest KnownClauses
M : mem (ID, C2) KRest
============================
 false
 < backchain formulaToKnown_all_unique.

Variables: F Prf Sat KnownClauses
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
GCL : good_clause_list KnownClauses
============================
 false
 < SatC: assert forall CID C,
     lookup KnownClauses CID C -> sat_clause Sat C.

Subgoal 2:

Variables: F Prf Sat KnownClauses
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
GCL : good_clause_list KnownClauses
============================
 forall CID C, lookup KnownClauses CID C -> sat_clause Sat C
 < intros Lkp.

Subgoal 2:

Variables: F Prf Sat KnownClauses CID C
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
GCL : good_clause_list KnownClauses
Lkp : lookup KnownClauses CID C
============================
 sat_clause Sat C
 < M: apply lookup_mem to Lkp.

Subgoal 2:

Variables: F Prf Sat KnownClauses CID C
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
GCL : good_clause_list KnownClauses
Lkp : lookup KnownClauses CID C
M : mem (CID, C) KnownClauses
============================
 sat_clause Sat C
 < apply formulaToKnown_sat_formula to PF Sat M.

Subgoal 2:

Variables: F Prf Sat KnownClauses CID C
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
GCL : good_clause_list KnownClauses
Lkp : lookup KnownClauses CID C
M : mem (CID, C) KnownClauses
H1 : sat_clause Sat C
============================
 sat_clause Sat C
 < search.

Variables: F Prf Sat KnownClauses
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
GCL : good_clause_list KnownClauses
SatC : forall CID C, lookup KnownClauses CID C -> sat_clause Sat C
============================
 false
 < IsK: apply formulaToKnown_is to IsF _ PF.

Variables: F Prf Sat KnownClauses
IsF : is_formula F
IsP : is_proof Prf
IsSat : is_list is_lit Sat
GA_Sat : good_assignment Sat
Sat : sat_formula Sat F
PF : formulaToKnown 1 F KnownClauses
PF1 : checkProof KnownClauses Prf
GCL : good_clause_list KnownClauses
SatC : forall CID C, lookup KnownClauses CID C -> sat_clause Sat C
IsK : is_list (is_pair is_integer is_clause) KnownClauses
============================
 false
 < apply check_proof_correct to IsP IsSat GA_Sat GCL IsK PF1 SatC.

Proof completed.
Back to example home