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