DNF transformation #
@[simp]
push_neg p returns the result of normalizing ¬ p by pushing the outermost negation all the way down, until it reaches either a negation or an atom
Equations
- omega.int.push_neg (p.and q) = (omega.int.push_neg p).or (omega.int.push_neg q)
- omega.int.push_neg (p.or q) = (omega.int.push_neg p).and (omega.int.push_neg q)
- omega.int.push_neg p.not = p
- omega.int.push_neg (omega.int.preform.le ᾰ ᾰ_1) = (omega.int.preform.le ᾰ ᾰ_1).not
- omega.int.push_neg (omega.int.preform.eq ᾰ ᾰ_1) = (omega.int.preform.eq ᾰ ᾰ_1).not
NNF transformation
Equations
- omega.int.nnf (p.and q) = (omega.int.nnf p).and (omega.int.nnf q)
- omega.int.nnf (p.or q) = (omega.int.nnf p).or (omega.int.nnf q)
- omega.int.nnf p.not = omega.int.push_neg (omega.int.nnf p)
- omega.int.nnf (omega.int.preform.le ᾰ ᾰ_1) = omega.int.preform.le ᾰ ᾰ_1
- omega.int.nnf (omega.int.preform.eq ᾰ ᾰ_1) = omega.int.preform.eq ᾰ ᾰ_1
Equations
- omega.int.is_nnf (p.and q) = (omega.int.is_nnf p ∧ omega.int.is_nnf q)
- omega.int.is_nnf (p.or q) = (omega.int.is_nnf p ∧ omega.int.is_nnf q)
- omega.int.is_nnf (ᾰ.and ᾰ_1).not = false
- omega.int.is_nnf (ᾰ.or ᾰ_1).not = false
- omega.int.is_nnf ᾰ.not.not = false
- omega.int.is_nnf (omega.int.preform.le t s).not = true
- omega.int.is_nnf (omega.int.preform.eq t s).not = true
- omega.int.is_nnf (omega.int.preform.le t s) = true
- omega.int.is_nnf (omega.int.preform.eq t s) = true
Argument is free of negations
Equations
- omega.int.neg_free (p.and q) = (omega.int.neg_free p ∧ omega.int.neg_free q)
- omega.int.neg_free (p.or q) = (omega.int.neg_free p ∧ omega.int.neg_free q)
- omega.int.neg_free ᾰ.not = false
- omega.int.neg_free (omega.int.preform.le t s) = true
- omega.int.neg_free (omega.int.preform.eq t s) = true
@[simp]
Eliminate all negations from preform
Equations
- omega.int.neg_elim (p.and q) = (omega.int.neg_elim p).and (omega.int.neg_elim q)
- omega.int.neg_elim (p.or q) = (omega.int.neg_elim p).or (omega.int.neg_elim q)
- omega.int.neg_elim (ᾰ.and ᾰ_1).not = (ᾰ.and ᾰ_1).not
- omega.int.neg_elim (ᾰ.or ᾰ_1).not = (ᾰ.or ᾰ_1).not
- omega.int.neg_elim ᾰ.not.not = ᾰ.not.not
- omega.int.neg_elim (omega.int.preform.le t s).not = omega.int.preform.le s.add_one t
- omega.int.neg_elim (omega.int.preform.eq t s).not = (omega.int.preform.le t.add_one s).or (omega.int.preform.le s.add_one t)
- omega.int.neg_elim (omega.int.preform.le ᾰ ᾰ_1) = omega.int.preform.le ᾰ ᾰ_1
- omega.int.neg_elim (omega.int.preform.eq ᾰ ᾰ_1) = omega.int.preform.eq ᾰ ᾰ_1
@[simp]
Equations
- omega.int.dnf_core (p.and q) = list.map (λ (pq : omega.clause × omega.clause), pq.fst.append pq.snd) (omega.int.dnf_core p ×ˢ omega.int.dnf_core q)
- omega.int.dnf_core (p.or q) = omega.int.dnf_core p ++ omega.int.dnf_core q
- omega.int.dnf_core _x.not = list.nil
- omega.int.dnf_core (omega.int.preform.le t s) = [(list.nil omega.term, [(omega.int.canonize s).sub (omega.int.canonize t)])]
- omega.int.dnf_core (omega.int.preform.eq t s) = [([(omega.int.canonize s).sub (omega.int.canonize t)], list.nil omega.term)]
DNF transformation
Equations
theorem
omega.int.exists_clause_holds
{v : ℕ → ℤ}
{p : omega.int.preform} :
omega.int.neg_free p → omega.int.preform.holds v p → (∃ (c : omega.clause) (H : c ∈ omega.int.dnf_core p), omega.clause.holds v c)