Theory Overriding
section ‹ Polymorphic Overriding Operator ›
theory Overriding
imports Main
begin
text ‹ We here use type classes to create the overriding operator and instantiate it for relations,
partial function, and finite functions. ›
class oplus =
fixes oplus :: "'a ⇒ 'a ⇒ 'a" (infixl "⊕" 65)
class compatible =
fixes compatible :: "'a ⇒ 'a ⇒ bool" (infix "##" 60)
assumes compatible_sym: "x ## y ⟹ y ## x"
unbundle lattice_syntax
class override = oplus + bot + compatible +
assumes compatible_zero [simp]: "x ## ⊥"
and override_idem [simp]: "P ⊕ P = P"
and override_assoc: "P ⊕ (Q ⊕ R) = (P ⊕ Q) ⊕ R"
and override_lzero [simp]: "⊥ ⊕ P = P"
and override_comm: "P ## Q ⟹ P ⊕ Q = Q ⊕ P"
and override_compat: "⟦ P ## Q; (P ⊕ Q) ## R ⟧ ⟹ P ## R"
and override_compatI: "⟦ P ## Q; P ## R; Q ## R ⟧ ⟹ (P ⊕ Q) ## R"
begin
lemma override_rzero [simp]: "P ⊕ ⊥ = P"
by (metis compatible_zero override_comm override_lzero)
lemma override_compat': "⟦ P ## Q; (P ⊕ Q) ## R ⟧ ⟹ Q ## R"
by (metis compatible_sym override_comm override_compat)
lemma override_compat_iff: "P ## Q ⟹ (P ⊕ Q) ## R ⟷ (P ## R) ∧ (Q ## R)"
by (meson override_compat override_compatI override_compat')
end
end