Theory Quantifiers

subsection ‹ Quantifying Lenses ›

theory Quantifiers
  imports Liberation
begin

text ‹ We define operators to existentially and universally quantify an expression over a lens. ›

subsection ‹ Operators and Syntax ›

definition ex_expr :: "('a  's)  (bool, 's) expr  (bool, 's) expr" where
[expr_defs]: "ex_expr x e = (λ s. ( v. e (putxs v)))"

definition ex1_expr :: "('a  's)  (bool, 's) expr  (bool, 's) expr" where
[expr_defs]: "ex1_expr x e = (λ s. (∃! v. e (putxs v)))"

definition all_expr :: "('a  's)  (bool, 's) expr  (bool, 's) expr" where
[expr_defs]: "all_expr x e = (λ s. ( v. e (putxs v)))"

expr_constructor ex_expr (1)
expr_constructor ex1_expr (1)
expr_constructor all_expr (1)

syntax 
  "_ex_expr"  :: "svid  logic  logic" (" _  _" [0, 20] 20)
  "_ex1_expr" :: "svid  logic  logic" ("1 _  _" [0, 20] 20)
  "_all_expr" :: "svid  logic  logic" (" _  _" [0, 20] 20)

translations
  "_ex_expr x P" == "CONST ex_expr x P"
  "_ex1_expr x P" == "CONST ex1_expr x P"
  "_all_expr x P" == "CONST all_expr x P"

subsection ‹ Laws ›

lemma ex_is_liberation: "mwb_lens x  ( x  P) = (P \\ $x)"
  by (expr_auto, metis mwb_lens_weak weak_lens.put_get)

lemma ex_unrest_iff: " mwb_lens x   ($x  P)  ( x  P) = P"
  by (simp add: ex_is_liberation unrest_liberate_iff)

lemma ex_unrest: " mwb_lens x; $x  P   ( x  P) = P"
  using ex_unrest_iff by blast

lemma unrest_ex_in [unrest]:
  " mwb_lens y; x L y   $x  ( y  P)"
  by (simp add: ex_expr_def sublens_pres_mwb sublens_put_put unrest_lens)

lemma unrest_ex_out [unrest]:
  " mwb_lens x; $x  P; x  y   $x  ( y  P)"
  by (simp add: ex_expr_def unrest_lens, metis lens_indep.lens_put_comm)

lemma subst_ex_out [usubst]: " mwb_lens x; $x s σ   σ  ( x  P) = ( x  σ  P)"
  by (expr_simp)

lemma subst_lit_ex_indep [usubst]:
  "y  x  σ(y  «v»)  ( x  P) = σ  ( x  [y  «v»]  P)"
  by (expr_simp, simp add: lens_indep.lens_put_comm)

lemma subst_ex_in [usubst]:
  " vwb_lens a; x L a   σ(x  e)  ( a  P) = σ  ( a  P)"
  by (expr_simp, force)

declare lens_plus_right_sublens [simp]

lemma ex_as_subst: "vwb_lens x  ( x  e) = ( v. e«v»/x)e"
  by expr_auto

lemma ex_twice [simp]: "mwb_lens x  ( x   x  P) = ( x  P)"
  by (expr_simp)

lemma ex_commute: "x  y  ( x   y  P) = ( y   x  P)"
  by (expr_auto, metis lens_indep_comm)+
  
lemma ex_true [simp]: "( x  (True)e) = (True)e"
  by expr_simp

lemma ex_false [simp]: "( x  (False)e) = (False)e"
  by (expr_simp)

lemma ex_disj [simp]: "( x  (P  Q)e) = (( x  P)  ( x  Q))e"
  by (expr_auto)

lemma ex_plus:
  "( (y,x)  P) = ( x   y  P)"
  by (expr_auto)

lemma all_as_ex: "( x  P) = (¬ ( x  ¬ P))e"
  by (expr_auto)

lemma ex_as_all: "( x  P) = (¬ ( x  ¬ P))e"
  by (expr_auto)

subsection ‹ Cylindric Algebra ›

lemma ex_C1: "( x  (False)e) = (False)e"
  by (expr_auto)

lemma ex_C2: "wb_lens x  `P  ( x  P)`"
  by (expr_simp, metis wb_lens.get_put)

lemma ex_C3: "mwb_lens x  ( x  (P  ( x  Q)))e = (( x  P)  ( x  Q))e"
  by (expr_auto)

lemma ex_C4a: "x L y  ( x   y  P) = ( y   x  P)"
  by (expr_simp, metis (mono_tags, lifting) lens.select_convs(2))

lemma ex_C4b: "x  y  ( x   y  P) = ( y   x  P)"
  using ex_commute by blast

lemma ex_C5:
  fixes x :: "('a  )"
  shows "($x = $x)e = (True)e"
  by simp

lemma ex_C6:
  assumes "wb_lens x" "x  y" "x  z"
  shows "($y = $z)e = ( x  $y = $x  $x = $z)e"
  using assms
  by (expr_simp, metis lens_indep_def)

lemma ex_C7:
  assumes "weak_lens x" "x  y"
  shows "(( x  $x = $y  P)  ( x  $x = $y  ¬ P))e = (False)e"
  using assms by (expr_simp, simp add: lens_indep_sym)

end