Theory MLSSmf_to_MLSS_Completeness
theory MLSSmf_to_MLSS_Completeness
imports MLSSmf_Semantics MLSSmf_to_MLSS MLSSmf_HF_Extras
Proper_Venn_Regions Reduced_MLSS_Formula_Singleton_Model_Property
begin
locale MLSSmf_to_MLSS_complete =
normalized_MLSSmf_clause š for š :: "('v, 'f) MLSSmf_clause" +
fixes ⬠:: "('v, 'f) Composite ā hf"
assumes ā¬: "is_model_for_reduced_dnf ā¬"
fixes Ī :: "hf ā 'v set set"
assumes Ī_subset_V: "Ī x ā Pā§+ V"
and Ī_preserves_zero: "Ī 0 = {}"
and Ī_inc: "a ⤠b ā¹ Ī a ā Ī b"
and Ī_add: "Ī (a ā b) = Ī a āŖ Ī b"
and Ī_mul: "Ī (a ā b) = Ī a ā© Ī b"
and Ī_discr: "l ā Pā§+ V ā¹
a = āØHF ((⬠ā VennRegion) ` l) ā¹ a = āØHF ((⬠ā VennRegion) ` (Ī a))"
begin
fun discretizeā©v :: "(('v, 'f) Composite ā hf) ā ('v ā hf)" where
"discretizeā©v ā³ = ā³ ā Solo"
fun discretizeā©f :: "(('v, 'f) Composite ā hf) ā ('f ā hf ā hf)" where
"discretizeā©f ā³ = (Ī»f a. ā³ wāfāāĪ aā)"
interpretation proper_Venn_regions V "discretizeā©v ā¬"
using finite_V by unfold_locales
lemma all_literal_sat: "ālt ā set š. Iā©l (discretizeā©v ā¬) (discretizeā©f ā¬) lt"
proof
fix lt assume "lt ā set š"
from ⬠obtain clause where clause: "clause ā reduced_dnf"
and ā¬_sat_clause: "ālt ā clause. interp Iā©sā©a ⬠lt"
unfolding is_model_for_reduced_dnf_def by blast
from ā¹lt ā set šāŗ have "norm_literal lt"
using norm_š by blast
then show "Iā©l (discretizeā©v ā¬) (discretizeā©f ā¬) lt"
proof (cases lt rule: norm_literal.cases)
case (inc f)
have "s ⤠t ā¹ discretizeā©f ⬠f s ⤠discretizeā©f ⬠f t" for s t
proof -
let ?atom = "Var wāfāāĪ tā =ā©s Var wāfāāĪ tā āā©s Var wāfāāĪ sā"
assume "s ⤠t"
then have "Ī s ā Ī t" using Ī_inc by simp
then have "?atom ā reduce_atom (inc(f))"
using Ī_subset_V
by (simp add: V_def)
then have "AT ?atom ā clause"
using ā¹lt = ATā©m (inc(f))āŗ ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "Iā©sā©a ⬠?atom" by fastforce
then have "⬠wāfāāĪ tā = ⬠wāfāāĪ tā ā ⬠wāfāāĪ sā" by simp
then have "⬠wāfāāĪ sā ⤠⬠wāfāāĪ tā"
by (simp add: sup.order_iff)
then show "discretizeā©f ⬠f s ⤠discretizeā©f ⬠f t" by simp
qed
then show ?thesis using inc by auto
next
case (dec f)
have "s ⤠t ā¹ discretizeā©f ⬠f t ⤠discretizeā©f ⬠f s" for s t
proof -
let ?atom = "Var wāfāāĪ sā =ā©s Var wāfāāĪ sā āā©s Var wāfāāĪ tā"
assume "s ⤠t"
then have "Ī s ā Ī t" using Ī_inc by simp
then have "?atom ā reduce_atom (dec(f))"
using Ī_subset_V
by (simp add: V_def)
then have "AT ?atom ā clause"
using ā¹lt = ATā©m (dec(f))āŗ ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "Iā©sā©a ⬠?atom" by fastforce
then have "⬠wāfāāĪ sā = ⬠wāfāāĪ sā ā ⬠wāfāāĪ tā" by simp
then have "⬠wāfāāĪ tā ⤠⬠wāfāāĪ sā"
by (simp add: sup.order_iff)
then show "discretizeā©f ⬠f t ⤠discretizeā©f ⬠f s" by simp
qed
then show ?thesis using dec by auto
next
case (add f)
have "discretizeā©f ⬠f (s ā t) = discretizeā©f ⬠f s ā discretizeā©f ⬠f t" for s t
proof -
let ?atom = "Var wāfāāĪ (s ā t)ā =ā©s Var wāfāāĪ sā āā©s Var wāfāāĪ tā"
have "?atom ā reduce_atom (add(f))"
using Ī_subset_V Ī_add
by (simp add: V_def)
then have "AT ?atom ā clause"
using ā¹lt = ATā©m (add(f))āŗ ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "Iā©sā©a ⬠?atom" by fastforce
then have "⬠wāfāāĪ (s ā t)ā = ⬠wāfāāĪ sā ā ⬠wāfāāĪ tā" by simp
then show "discretizeā©f ⬠f (s ā t) = discretizeā©f ⬠f s ā discretizeā©f ⬠f t" by simp
qed
then show ?thesis using add by auto
next
case (mul f)
have "discretizeā©f ⬠f (s ā t) = discretizeā©f ⬠f s ā discretizeā©f ⬠f t" for s t
proof -
let ?atom_1 = "Var (InterOfWAux f (Ī s) (Ī t)) =ā©s Var wāfāāĪ sā -ā©s Var wāfāāĪ tā"
have "?atom_1 ā reduce_atom (mul(f))"
using Ī_subset_V
by (simp add: V_def)
then have "AT ?atom_1 ā clause"
using ā¹lt = ATā©m (mul(f))āŗ ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "Iā©sā©a ⬠?atom_1" by fastforce
then have "⬠(InterOfWAux f (Ī s) (Ī t)) = ⬠wāfāāĪ sā - ⬠wāfāāĪ tā" by simp
moreover
let ?atom_2 = "Var wāfāāĪ (s ā t)ā =ā©s Var wāfāāĪ sā -ā©s Var (InterOfWAux f (Ī s) (Ī t))"
have "?atom_2 ā reduce_atom (mul(f))"
using Ī_subset_V Ī_mul
by (simp add: V_def)
then have "AT ?atom_2 ā clause"
using ā¹lt = ATā©m (mul(f))āŗ ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "Iā©sā©a ⬠?atom_2" by fastforce
then have "⬠wāfāāĪ (s ā t)ā = ⬠wāfāāĪ sā - ⬠(InterOfWAux f (Ī s) (Ī t))" by simp
ultimately
have "⬠wāfāāĪ (s ā t)ā = ⬠wāfāāĪ sā ā ⬠wāfāāĪ tā" by auto
then show "discretizeā©f ⬠f (s ā t) = discretizeā©f ⬠f s ā discretizeā©f ⬠f t" by simp
qed
then show ?thesis using mul by auto
next
case (le f g)
have "discretizeā©f ⬠f s ⤠discretizeā©f ⬠g s" for s
proof -
let ?atom = "Var wāgāāĪ sā =ā©s Var wāgāāĪ sā āā©s Var wāfāāĪ sā"
have "?atom ā reduce_atom (f ā¼ā©m g)"
using Ī_subset_V
by (simp add: V_def)
then have "AT ?atom ā clause"
using ā¹lt = ATā©m (f ā¼ā©m g)āŗ ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "Iā©sā©a ⬠?atom" by fastforce
then have "⬠wāgāāĪ sā = ⬠wāgāāĪ sā ā ⬠wāfāāĪ sā" by simp
then have "⬠wāfāāĪ sā ⤠⬠wāgāāĪ sā"
by (simp add: sup.orderI)
then show "discretizeā©f ⬠f s ⤠discretizeā©f ⬠g s" by simp
qed
then show ?thesis using le by auto
next
case (eq_empty x n)
let ?lt = "AT (Var (Solo x) =ā©s ā
n)"
from eq_empty have "?lt ā reduce_literal lt"
using ā¹lt ā set šāŗ by simp
then have "?lt ā clause"
using ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "interp Iā©sā©a ⬠?lt" by fastforce
with eq_empty show ?thesis by simp
next
case (eq x y)
let ?lt = "AT (Var (Solo x) =ā©s Var (Solo y))"
from eq have "?lt ā reduce_literal lt"
using ā¹lt ā set šāŗ by simp
then have "?lt ā clause"
using ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "interp Iā©sā©a ⬠?lt" by fastforce
with eq show ?thesis by simp
next
case (neq x y)
let ?lt = "AF (Var (Solo x) =ā©s Var (Solo y))"
from neq have "?lt ā reduce_literal lt"
using ā¹lt ā set šāŗ by simp
then have "?lt ā clause"
using ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "interp Iā©sā©a ⬠?lt" by fastforce
with neq show ?thesis by simp
next
case (union x y z)
let ?lt = "AT (Var (Solo x) =ā©s Var (Solo y) āā©s Var (Solo z))"
from union have "?lt ā reduce_literal lt"
using ā¹lt ā set šāŗ by simp
then have "?lt ā clause"
using neq ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "interp Iā©sā©a ⬠?lt" by fastforce
with union show ?thesis by simp
next
case (diff x y z)
let ?lt = "AT (Var (Solo x) =ā©s Var (Solo y) -ā©s Var (Solo z))"
from diff have "?lt ā reduce_literal lt"
using ā¹lt ā set šāŗ by simp
then have "?lt ā clause"
using neq ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "interp Iā©sā©a ⬠?lt" by fastforce
with diff show ?thesis by simp
next
case (single x y)
let ?lt = "AT (Var (Solo x) =ā©s Single (Var (Solo y)))"
from single have "?lt ā reduce_literal lt"
using ā¹lt ā set šāŗ by simp
then have "?lt ā clause"
using neq ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "interp Iā©sā©a ⬠?lt" by fastforce
with single show ?thesis by simp
next
case (app x f y)
with ā¹lt ā set šāŗ have "f ā F" unfolding F_def by force
from ā¬_sat_clause clause eval_v
have ā¬_v: "(⬠ā VennRegion) α = proper_Venn_region α" if "α ā Pā§+ V" for α
unfolding reduced_dnf_def
using proper_Venn_region.simps that by force
from ā¬_sat_clause clause eval_w
have ā¬_w: "āØHF ((⬠ā VennRegion) ` l) = āØHF ((⬠ā VennRegion) ` m) ⶠ⬠wāfāālā = ⬠wāfāāmā"
if "l ā Pā§+ V" "m ā Pā§+ V" "f ā F" for l m f
by (meson in_mono introduce_UnionOfVennRegions_subset_reduced_fms introduce_w_subset_reduced_fms that)
from app ā¹lt ā set šāŗ have "y ā V" using V_def by fastforce
with variable_as_composition_of_proper_Venn_regions
have "āØHF (proper_Venn_region ` ā V y) = discretizeā©v ⬠y" by blast
with Ī_discr ā_subset_P_plus ā¬_v
have "āØHF ((⬠ā VennRegion) ` ā V y) = āØHF ((⬠ā VennRegion) ` Ī (discretizeā©v ⬠y))"
by (smt (verit, best) HUnion_eq subset_eq)
with ā¬_w have ā¬_w_eq: "⬠wāfāāā V yā = ⬠wāfāāĪ (discretizeā©v ⬠y)ā"
using ā_subset_P_plus Ī_subset_V ā¹f ā Fāŗ finite_V by meson
let ?lt = "AT (Var (Solo x) =ā©s Var wāfāāā V yā)"
from app have "?lt ā reduce_literal lt"
using ā¹lt ā set šāŗ by simp
then have "?lt ā clause"
using neq ā¹lt ā set šāŗ clause
unfolding reduced_dnf_def reduce_clause_def by fastforce
with ā¬_sat_clause have "interp Iā©sā©a ⬠?lt" by fastforce
then have "⬠(Solo x) = ⬠wāfāāā V yā" by simp
with ā¬_w_eq have "⬠(Solo x) = ⬠wāfāāĪ (discretizeā©v ⬠y)ā" by argo
then have "⬠(Solo x) = (discretizeā©f ⬠f) (discretizeā©v ⬠y)" by simp
then have "discretizeā©v ⬠x = (discretizeā©f ⬠f) (discretizeā©v ⬠y)" by simp
with app show ?thesis by simp
qed
qed
lemma š_sat: "Iā©cā©l (discretizeā©v ā¬) (discretizeā©f ā¬) š"
using all_literal_sat by blast
end
lemma (in normalized_MLSSmf_clause) MLSSmf_to_MLSS_completeness:
assumes "is_model_for_reduced_dnf M"
shows "āMā©v Mā©f. Iā©cā©l Mā©v Mā©f š"
proof -
from assms singleton_model_for_reduced_MLSS_clause obtain ā³ where
ā³_singleton: "āα ā Pā§+ V. hcard (ā³ (vāαā)) ⤠1" and
ā³_model: "is_model_for_reduced_dnf ā³"
using normalized_MLSSmf_clause_axioms V_def by blast
then obtain clause where "clause ā reduced_dnf" "ālt ā clause. interp Iā©sā©a ā³ lt"
unfolding is_model_for_reduced_dnf_def by blast
with normalized_clause_contains_all_v_α have v_α_in_vars:
"āαāPā§+ V. vāαā ā ā (vars ` clause)"
by blast
from ā³_singleton have assigned_set_card_0_or_1:
"āα ā Pā§+ V. hcard (ā³ (vāαā)) = 0 ⨠hcard (ā³ (vāαā)) = 1"
using antisym_conv2 by blast
let ?Ī = "Ī»a. {α ā Pā§+ V. ā³ vāαā ā a ā 0}"
have Ī_subset_V: "?Ī x ā Pā§+ V" for x
by fast
have Ī_preserves_zero: "?Ī 0 = {}" by blast
have Ī_inc: "a ⤠b ā¹ ?Ī a ā ?Ī b" for a b
by (smt (verit) Collect_mono hinter_hempty_right inf.absorb_iff1 inf_left_commute)
have Ī_add: "?Ī (a ā b) = ?Ī a āŖ ?Ī b" for a b
proof (standard; standard)
fix α assume α: "α ā {α ā Pā§+ V. ā³ vāαā ā (a ā b) ā 0}"
then have "α ā Pā§+ V" "ā³ vāαā ā (a ā b) ā 0" by blast+
then have "ā³ vāαā ā a ā 0 ⨠Ⳡvāαā ā b ā 0"
by (metis hunion_hempty_right inf_sup_distrib1)
then show "α ā {α ā Pā§+ V. ā³ vāαā ā a ā 0} āŖ {α ā Pā§+ V. ā³ vāαā ā b ā 0}"
using α by blast
next
fix α assume "α ā {α ā Pā§+ V. ā³ vāαā ā a ā 0} āŖ {α ā Pā§+ V. ā³ vāαā ā b ā 0}"
then have "α ā Pā§+ V" "ā³ vāαā ā a ā 0 ⨠Ⳡvāαā ā b ā 0"
by blast+
then have "ā³ vāαā ā (a ā b) ā 0"
by (metis hinter_hempty_right hunion_hempty_left inf_sup_absorb inf_sup_distrib1)
then show "α ā {α ā Pā§+ V. ā³ vāαā ā (a ā b) ā 0}"
using ā¹Ī± ā Pā§+ Vāŗ by blast
qed
have Ī_mul: "?Ī (a ā b) = ?Ī a ā© ?Ī b" for a b
proof (standard; standard)
fix α assume α: "α ā {α ā Pā§+ V. ā³ vāαā ā (a ā b) ā 0}"
then have "α ā Pā§+ V" "ā³ vāαā ā (a ā b) ā 0" by blast+
then have "ā³ vāαā ā a ā 0 ā§ ā³ vāαā ā b ā 0"
by (metis hinter_hempty_left inf_assoc inf_left_commute)
then show "α ā {α ā Pā§+ V. ā³ vāαā ā a ā 0} ā© {α ā Pā§+ V. ā³ vāαā ā b ā 0}"
using α by blast
next
fix α assume "α ā {α ā Pā§+ V. ā³ vāαā ā a ā 0} ā© {α ā Pā§+ V. ā³ vāαā ā b ā 0}"
then have "α ā Pā§+ V" "ā³ vāαā ā a ā 0" "ā³ vāαā ā b ā 0"
by blast+
then have "ā³ vāαā ā 0" by force
then have "hcard (ā³ vāαā) ā 0" using hcard_0E by blast
then have "hcard (ā³ vāαā) = 1"
using assigned_set_card_0_or_1 v_α_in_vars ā¹Ī± ā Pā§+ Vāŗ
by fastforce
then obtain c where "ā³ vāαā = 0 ā c"
using hcard_1E by blast
moreover
from ā¹ā³ vāαā = 0 ā cāŗ ā¹ā³ vāαā ā a ā 0āŗ
have "ā³ vāαā ā a = 0 ā c" by auto
moreover
from ā¹ā³ vāαā = 0 ā cāŗ ā¹ā³ vāαā ā b ā 0āŗ
have "ā³ vāαā ā b = 0 ā c" by auto
ultimately
have "ā³ vāαā ā (a ā b) = 0 ā c"
by (simp add: inf_commute inf_left_commute)
then have "ā³ vāαā ā (a ā b) ā 0" by simp
then show "α ā {α ā Pā§+ V. ā³ vāαā ā (a ā b) ā 0}"
using ā¹Ī± ā Pā§+ Vāŗ by blast
qed
have "l ā Pā§+ V ā¹
a = āØHF ((ā³ ā VennRegion) ` l) ā¹ a ⤠āØHF ((ā³ ā VennRegion) ` (?Ī a))" for l a
proof
fix c assume l_a_c: "l ā Pā§+ V" "a = āØHF ((ā³ ā VennRegion) ` l)" "c āā a"
then obtain α where "α ā l" "c āā ā³ vāαā" by auto
then have "α ā ?Ī a" using l_a_c by blast
then have "ā³ vāαā ā (ā³ ā VennRegion) ` (?Ī a)" by simp
then have "ā³ vāαā āā HF ((ā³ ā VennRegion) ` (?Ī a))" by fastforce
with ā¹c āā ā³ vāαāāŗ show "c āā āØHF ((ā³ ā VennRegion) ` (?Ī a))" by blast
qed
moreover
have "l ā Pā§+ V ā¹
a = āØHF ((ā³ ā VennRegion) ` l) ā¹ āØHF ((ā³ ā VennRegion) ` (?Ī a)) ⤠a" for l a
proof -
assume "l ā Pā§+ V" and a: "a = āØHF ((ā³ ā VennRegion) ` l)"
then have "finite l"
by (simp add: finite_V finite_subset)
have "?Ī a ā l"
proof
fix α assume "α ā ?Ī a"
then obtain c where "c āā ā³ vāαā ā a" by blast
then have "c āā ā³ vāαā" "c āā a" by blast+
then obtain β where "β ā l" "c āā ā³ vāβā" using a by force
interpret proper_Venn_regions V "ā³ ā Solo"
using finite_V by unfold_locales
from ā¹Ī± ā ?Ī aāŗ have "α ā Pā§+ V" by auto
moreover
from ā¹l ā Pā§+ Vāŗ ā¹Ī² ā lāŗ have "β ā Pā§+ V" by auto
moreover
from ā¹c āā ā³ vāαāāŗ have "c āā proper_Venn_region α"
using eval_v ā¹Ī± ā Pā§+ Vāŗ ā³_model
unfolding is_model_for_reduced_dnf_def reduced_dnf_def
by fastforce
moreover
from ā¹c āā ā³ vāβāāŗ have "c āā proper_Venn_region β"
using eval_v ā¹Ī² ā Pā§+ Vāŗ ā³_model
unfolding is_model_for_reduced_dnf_def reduced_dnf_def
by fastforce
ultimately
have "α = β"
using finite_V proper_Venn_region_strongly_injective by auto
with ā¹Ī² ā lāŗ show "α ā l" by simp
qed
then have "(ā³ ā VennRegion) ` ?Ī a ā (ā³ ā VennRegion) ` l" by blast
moreover
from ā¹finite lāŗ have "finite ((ā³ ā VennRegion) ` l)" by blast
ultimately
have "āØHF ((ā³ ā VennRegion) ` ?Ī a) ⤠āØHF ((ā³ ā VennRegion) ` l)"
by (metis (no_types, lifting) HUnion_hunion finite_subset sup.orderE sup.orderI union_hunion)
then show "āØHF ((ā³ ā VennRegion) ` (?Ī a)) ⤠a"
using a by blast
qed
ultimately
have Ī_discr: "l ā Pā§+ V ā¹
a = āØHF ((ā³ ā VennRegion) ` l) ā¹ a = āØHF ((ā³ ā VennRegion) ` (?Ī a))" for l a
by (simp add: inf.absorb_iff1 inf_commute)
interpret Ī_plus: MLSSmf_to_MLSS_complete š ā³ ?Ī
using assms ā³_singleton ā³_model
Ī_subset_V Ī_preserves_zero Ī_inc Ī_add Ī_mul Ī_discr
by unfold_locales
show ?thesis
using Ī_plus.š_sat by fast
qed
end