Theory Unrestriction

section ‹ Unrestriction ›

theory Unrestriction
  imports Expressions
begin

text ‹ Unrestriction means that an expression does not depend on the value of the state space
  described by the given scene (i.e. set of variables) for its valuation. It is a semantic
  characterisation of fresh variables. ›

consts unrest :: "'s scene  'p  bool"

definition unrest_expr :: "'s scene  ('b, 's) expr  bool" where
[expr_defs]: "unrest_expr a e = ( s s'. e (s S s' on a) = e s)"

adhoc_overloading unrest  unrest_expr

syntax
  "_unrest" :: "salpha  logic  logic  logic" (infix "" 20)

translations
  "_unrest x p" == "CONST unrest x p"                                           

named_theorems unrest

lemma unrest_empty [unrest]: "  P"
  by (simp add: expr_defs lens_defs)

lemma unrest_var_union [unrest]:
  " A  P; B  P   A  B  P"
  by (simp add: expr_defs lens_defs)
     (metis scene_override_union scene_override_unit scene_union_incompat)

lemma unrest_neg_union:
  assumes "A ##S B" "- A  P" "- B  P"
  shows "(- (A  B))  P"
  using assms by (simp add: unrest_expr_def scene_override_commute scene_override_union)

text ‹ The following two laws greatly simplify proof when reasoning about unrestricted lens,
  and so we add them to the expression simplification set. ›

lemma unrest_lens [expr_simps]:
  "mwb_lens x  ($x  e) = ( s v. e (putxs v) = e s)"
  by (simp add: unrest_expr_def var_alpha_def comp_mwb_lens lens_override_def)
     (metis mwb_lens.put_put)

lemma unrest_compl_lens [expr_simps]:
  "mwb_lens x  (- $x  e) = (s s'. e (putxs' (getxs)) = e s)"
  by (simp add: unrest_expr_def var_alpha_def comp_mwb_lens lens_override_def scene_override_commute)

lemma unrest_subscene: " idem_scene a; a  e; b S a   b  e"
  by (metis subscene_eliminate unrest_expr_def)

lemma unrest_lens_comp [unrest]: " mwb_lens x; mwb_lens y; $x  e   $x:y  e"
  by (simp add: unrest_lens, simp add: lens_comp_def ns_alpha_def)

lemma unrest_expr [unrest]: "x  e  x  (e)e"
  by (simp add: expr_defs)

lemma unrest_lit [unrest]: "x  («v»)e"
  by (simp add: expr_defs)

lemma unrest_var [unrest]: 
  " vwb_lens x; idem_scene a; var_alpha x S a   a  ($x)e"
  by (auto simp add: unrest_expr_def scene_indep_override var_alpha_def)
     (metis lens_override_def lens_override_idem mwb_lens_weak vwb_lens_mwb weak_lens_def)

lemma unrest_var_single [unrest]:
  " mwb_lens x; x  y   $x  ($y)e"
  by (simp add: expr_defs lens_indep.lens_put_irr2 lens_indep_sym lens_override_def var_alpha_def)

lemma unrest_sublens:
  assumes "mwb_lens x" "$x  P" "y L x"
  shows "$y  P"
  by (metis assms sublens_pres_mwb sublens_put_put unrest_lens)

text ‹ If two lenses are equivalent, and thus they characterise the same state-space regions,
  then clearly unrestrictions over them are equivalent. ›
    
lemma unrest_equiv:
  assumes "mwb_lens y" "x L y" "$x  P"
  shows "$y  P"
  using assms lens_equiv_def sublens_pres_mwb unrest_sublens by blast

text ‹ If we can show that an expression is unrestricted on a bijective lens, then is unrestricted
  on the entire state-space. ›

lemma bij_lens_unrest_all:
  assumes "bij_lens x" "$x  P"
  shows "Σ  P"
  by (metis assms bij_lens_vwb lens_scene_top_iff_bij_lens univ_alpha_def var_alpha_def vwb_lens_iff_mwb_UNIV_src)

lemma bij_lens_unrest_all_eq:
  assumes "bij_lens x"
  shows "(Σ  P)  ($x  P)"
  by (metis assms bij_lens_vwb lens_scene_top_iff_bij_lens univ_alpha_def var_alpha_def vwb_lens_mwb)

text ‹ If an expression is unrestricted by all variables, then it is unrestricted by any variable ›

lemma unrest_all_var:
  assumes "Σ  e"
  shows "$x  e"
  by (metis assms scene_top_greatest top_idem_scene univ_alpha_def unrest_subscene)

lemma unrest_pair [unrest]:
  assumes "mwb_lens x" "mwb_lens y" "$x  P" "$y  P"
  shows "$(x, y)  P"
  using assms
  by expr_simp (simp add: lens_override_def lens_scene.rep_eq scene_override.rep_eq)

lemma unrest_pair_split:
  assumes "x  y" "vwb_lens x" "vwb_lens y"
  shows "($(x, y)  P) = (($x  P)  ($y  P))"
  using assms
  by (metis lens_equiv_scene lens_indep_sym lens_plus_comm lens_plus_right_sublens plus_vwb_lens sublens_refl unrest_pair unrest_sublens var_alpha_def var_pair_def vwb_lens_def)

lemma unrest_get [unrest]: " mwb_lens x; x  y   $x  gety⇙"
  by (expr_simp, simp add: lens_indep.lens_put_irr2)

lemma unrest_conj [unrest]:
  " x  P; x  Q   x  (P  Q)e"
  by (auto simp add: expr_defs)

lemma unrest_not [unrest]:
  " x  P   x  (¬ P)e"
  by (auto simp add: expr_defs)

lemma unrest_disj [unrest]:
  " x  P; x  Q   x  (P  Q)e"
  by (auto simp add: expr_defs)

lemma unrest_implies [unrest]:
  " x  P; x  Q   x  (P  Q)e"
  by (auto simp add: expr_defs)

lemma unrest_expr_if [unrest]:
  assumes "a  P" "a  Q" "a  (e)e"
  shows "a  (P  e  Q)"
  using assms by expr_simp

lemma unrest_uop:
  " x  e   x  («f» e)e"
  by (auto simp add: expr_defs)

lemma unrest_bop:
  " x  e1; x  e2   x  («f» e1 e2)e"
  by (auto simp add: expr_defs)

lemma unrest_trop:
  " x  e1; x  e2; x  e3   x  («f» e1 e2 e3)e"
  by (auto simp add: expr_defs)

end