Theory Saturation_Framework_Extensions.Clausal_Calculus
section ‹Clausal Calculi›
theory Clausal_Calculus
imports
Ordered_Resolution_Prover.Unordered_Ground_Resolution
Soundness
Standard_Redundancy_Criterion
begin
text ‹Various results about consequence relations, counterexample-reducing inference systems, and
the standard redundancy criteria are specialized and customized for clauses as opposed to arbitrary
formulas.›
subsection ‹Setup›
text ‹To avoid confusion, we use the symbol ‹⊫› (with or without subscripts) for the ``models''
and entailment relations on clauses and ‹⊨› for the abstract concept of consequence.›
abbreviation true_lit_thick :: "'a interp ⇒ 'a literal ⇒ bool" (infix "⊫l" 50) where
"I ⊫l L ≡ I ⊨l L"
abbreviation true_cls_thick :: "'a interp ⇒ 'a clause ⇒ bool" (infix "⊫" 50) where
"I ⊫ C ≡ I ⊨ C"
abbreviation true_clss_thick :: "'a interp ⇒ 'a clause set ⇒ bool" (infix "⊫s" 50) where
"I ⊫s 𝒞 ≡ I ⊨s 𝒞"
abbreviation true_cls_mset_thick :: "'a interp ⇒ 'a clause multiset ⇒ bool" (infix "⊫m" 50) where
"I ⊫m 𝒞 ≡ I ⊨m 𝒞"
no_notation true_lit (infix "⊨l" 50)
no_notation true_cls (infix "⊨" 50)
no_notation true_clss (infix "⊨s" 50)
no_notation true_cls_mset (infix "⊨m" 50)
subsection ‹Consequence Relation›
abbreviation entails_clss :: "'a clause set ⇒ 'a clause set ⇒ bool" (infix "⊫e" 50) where
"N1 ⊫e N2 ≡ ∀I. I ⊫s N1 ⟶ I ⊫s N2"
lemma entails_iff_unsatisfiable_single:
"CC ⊫e {E} ⟷ ¬ satisfiable (CC ∪ {{#- L#} |L. L ∈# E})" (is "_ ⟷ _ (_ ∪ ?NegD)")
proof
assume c_ent_e: "CC ⊫e {E}"
have "¬ I ⊫s CC ∪ ?NegD" for I
using c_ent_e[rule_format, of I]
unfolding true_clss_def true_cls_def true_lit_def if_distribR if_bool_eq_conj
by (fastforce simp: ball_Un is_pos_neg_not_is_pos)
then show "¬ satisfiable (CC ∪ ?NegD)"
by auto
next
assume "¬ satisfiable (CC ∪ ?NegD)"
then have "¬ I ⊫s CC ∪ ?NegD" for I
by auto
then show "CC ⊫e {E}"
unfolding true_clss_def true_cls_def true_lit_def if_distribR if_bool_eq_conj
by (fastforce simp: ball_Un is_pos_neg_not_is_pos)
qed
lemma entails_iff_unsatisfiable:
"CC ⊫e EE ⟷ (∀E ∈ EE. ¬ satisfiable (CC ∪ {{#- L#} |L. L ∈# E}))" (is "?lhs = ?rhs")
proof -
have "?lhs ⟷ (∀E ∈ EE. CC ⊫e {E})"
unfolding true_clss_def by auto
also have "... ⟷ ?rhs"
unfolding entails_iff_unsatisfiable_single by auto
finally show ?thesis
.
qed
interpretation consequence_relation "{{#}}" "(⊫e)"
proof
fix N2 N1 :: "'a clause set"
assume "∀C ∈ N2. N1 ⊫e {C}"
then show "N1 ⊫e N2"
unfolding true_clss_singleton by (simp add: true_clss_def)
qed (auto intro: true_clss_mono)
interpretation concl_compact_consequence_relation "{{#}} :: ('a :: wellorder) clause set" "(⊫e)"
proof
fix CC EE :: "'a clause set"
assume
fin_e: "finite EE" and
c_ent_e: "CC ⊫e EE"
have "∀E ∈ EE. ¬ satisfiable (CC ∪ {{#- L#} |L. L ∈# E})"
using c_ent_e[unfolded entails_iff_unsatisfiable] .
then have "∀E ∈ EE. ∃DD ⊆ CC ∪ {{#- L#} |L. L ∈# E}. finite DD ∧ ¬ satisfiable DD"
by (subst (asm) clausal_logic_compact)
then obtain DD_of where
d_of: "∀E ∈ EE. DD_of E ⊆ CC ∪ {{#- L#} |L. L ∈# E} ∧ finite (DD_of E)
∧ ¬ satisfiable (DD_of E)"
by moura
define CC' where
"CC' = (⋃E ∈ EE. DD_of E - {{#- L#} |L. L ∈# E})"
have "CC' ⊆ CC"
unfolding CC'_def using d_of by auto
moreover have c'_fin: "finite CC'"
unfolding CC'_def using d_of fin_e by blast
moreover have "CC' ⊫e EE"
unfolding entails_iff_unsatisfiable
proof
fix E
assume e_in: "E ∈ EE"
have "DD_of E ⊆ CC' ∪ {{#- L#} |L. L ∈# E}"
using e_in d_of unfolding CC'_def by auto
moreover have "¬ satisfiable (DD_of E)"
using e_in d_of by auto
ultimately show "¬ satisfiable (CC' ∪ {{#- L#} |L. L ∈# E})"
by (rule unsatisfiable_mono[of "DD_of E"])
qed
ultimately show "∃CC' ⊆ CC. finite CC' ∧ CC' ⊫e EE"
by blast
qed
subsection ‹Counterexample-Reducing Inference Systems›
definition clss_of_interp :: "'a set ⇒ 'a literal multiset set" where
"clss_of_interp I = {{#(if A ∈ I then Pos else Neg) A#} |A. True}"
lemma true_clss_of_interp_iff_equal[simp]: "J ⊫s clss_of_interp I ⟷ J = I"
unfolding clss_of_interp_def true_clss_def true_cls_def true_lit_def by force
lemma entails_iff_models[simp]: "clss_of_interp I ⊫e CC ⟷ I ⊫s CC"
by simp
locale clausal_counterex_reducing_inference_system = inference_system Inf
for Inf :: "('a :: wellorder) clause inference set" +
fixes J_of :: "'a clause set ⇒ 'a interp"
assumes clausal_Inf_counterex_reducing:
"{#} ∉ N ⟹ D ∈ N ⟹ ¬ J_of N ⊫ D ⟹ (⋀C. C ∈ N ⟹ ¬ J_of N ⊫ C ⟹ D ≤ C) ⟹
∃ι ∈ Inf. prems_of ι ≠ [] ∧ main_prem_of ι = D ∧ set (side_prems_of ι) ⊆ N ∧
J_of N ⊫s set (side_prems_of ι) ∧ ¬ J_of N ⊫ concl_of ι ∧ concl_of ι < D"
begin
abbreviation I_of :: "'a clause set ⇒ 'a clause set" where
"I_of N ≡ clss_of_interp (J_of N)"
lemma Inf_counterex_reducing:
assumes
bot_ni_n: "N ∩ {{#}} = {}" and
d_in_n: "D ∈ N" and
n_ent_d: "¬ I_of N ⊫e {D}" and
d_min: "⋀C. C ∈ N ⟹ ¬ I_of N ⊫e {C} ⟹ D ≤ C"
shows "∃ι ∈ Inf. prems_of ι ≠ [] ∧ main_prem_of ι = D ∧ set (side_prems_of ι) ⊆ N
∧ I_of N ⊫e set (side_prems_of ι) ∧ ¬ I_of N ⊫e {concl_of ι} ∧ concl_of ι < D"
using bot_ni_n clausal_Inf_counterex_reducing d_in_n d_min n_ent_d by auto
sublocale counterex_reducing_inference_system "{{#}}" "(⊫e)" Inf I_of
"(<) :: 'a clause ⇒ 'a clause ⇒ bool"
using Inf_counterex_reducing
by unfold_locales (simp_all add: less_eq_multiset_def)
end
subsection ‹Counterexample-Reducing Calculi Equipped with a Standard Redundancy Criterion›
locale clausal_counterex_reducing_calculus_with_standard_redundancy =
calculus_with_standard_redundancy Inf "{{#}}" "(⊫e)" "(<) :: 'a clause ⇒ 'a clause ⇒ bool" +
clausal_counterex_reducing_inference_system Inf J_of
for
Inf :: "('a :: wellorder) clause inference set" and
J_of :: "'a clause set ⇒ 'a set"
begin
sublocale counterex_reducing_calculus_with_standard_inferance_redundancy "{{#}}" Inf "(⊫e)" Red_I
Red_F I_of "(<) :: 'a clause ⇒ 'a clause ⇒ bool"
proof unfold_locales
fix C D :: "'a clause"
show "C ≠ D ⟹ C < D ∨ D < C"
by fastforce
qed
lemma clausal_saturated_model: "saturated N ⟹ {#} ∉ N ⟹ J_of N ⊫s N"
by (simp add: saturated_model[simplified])
corollary clausal_saturated_complete: "saturated N ⟹ (∀I. ¬ I ⊫s N) ⟹ {#} ∈ N"
using clausal_saturated_model by blast
end
end