Theory Liberation
subsection ‹ Liberation ›
theory Liberation
imports Extension
begin
text ‹ Liberation~\cite{Dongol19} is an operator that removes dependence on a number of variables.
It is similar to existential quantification, but is defined over a scene (a variable set). ›
subsection ‹ Definition and Syntax ›
definition liberate :: "('s ⇒ bool) ⇒ 's scene ⇒ ('s ⇒ bool)" where
[expr_defs]: "liberate P x = (λ s. ∃ s'. P (s ⊕⇩S s' on x))"
syntax
"_liberate" :: "logic ⇒ salpha ⇒ logic" (infixl "\\" 80)
translations
"_liberate P x" == "CONST liberate P x"
"_liberate P x" <= "_liberate (P)⇩e x"
expr_constructor liberate (0)
subsection ‹ Laws ›
lemma liberate_lens [expr_simps]:
"mwb_lens x ⟹ P \\ $x = (λs. ∃s'. P (s ◃⇘x⇙ s'))"
by (simp add: liberate_def)
lemma liberate_lens': "mwb_lens x ⟹ P \\ $x = (λs. ∃v. P (put⇘x⇙ s v))"
by (auto simp add: liberate_def lens_defs fun_eq_iff)
(metis mwb_lens_weak weak_lens.put_get)
lemma liberate_as_subst: "vwb_lens x ⟹ e \\ $x = (∃ v. e⟦«v»/x⟧)⇩e"
by (expr_simp, metis vwb_lens.put_eq)
lemma unrest_liberate: "a ♯ P \\ a"
by (expr_simp)
lemma unrest_liberate_iff: "(a ♯ P) ⟷ (P \\ a = P)"
by (expr_simp, metis (full_types) scene_override_overshadow_left)
lemma liberate_none [simp]: "P \\ ∅ = P"
by (expr_simp)
lemma liberate_idem [simp]: "P \\ a \\ a = P \\ a"
by (expr_simp)
lemma liberate_commute [simp]: "a ⨝⇩S b ⟹ P \\ a \\ b = P \\ b \\ a"
using scene_override_commute_indep by (expr_auto, fastforce+)
lemma liberate_true [simp]: "(True)⇩e \\ a = (True)⇩e"
by (expr_simp)
lemma liberate_false [simp]: "(False)⇩e \\ a = (False)⇩e"
by (expr_simp)
lemma liberate_disj [simp]: "(P ∨ Q)⇩e \\ a = (P \\ a ∨ Q \\ a)⇩e"
by (expr_auto)
end