Theory Option_Binders

subsection ‹Binders for the option type \label{sect:binders}›

theory Option_Binders
  imports Main
begin

text ‹
  The following functions are used as binders in the theorems that are proven.
  At all times, when a result is None, the theorem becomes vacuously true.
  The expression ``$m \rightharpoonup \alpha$'' means ``First compute $m$, if it is None then return True, otherwise pass the result to $\alpha$''.
  B2 is a short hand for sequentially doing two independent computations. The following syntax is associated to B2:
  ``$m_1 || m_2 \rightharpoonup \alpha$'' represents ``First compute $m_1$ and $m_2$, if one of them is None then return True, otherwise pass the result to $\alpha$''.
›
definition B :: "'a option  ('a  bool)  bool" (infixl  65)
where "B m α  case m of None  True | (Some a)  α a"

definition B2 :: "'a option  'a option  ('a  'a  bool)  bool"
where "B2 m1 m2 α  m1  (λ a . m2  (λ b . α a b))"

syntax "B2" :: "['a option, 'a option, ('a  'a  bool)] => bool" ((_  _  _)  [0, 0, 10] 10)


  
text ‹
  Some rewriting rules for the binders
›
lemma rewrite_B2_to_cases[simp]:
  shows "B2 s t f = (case s of None  True | (Some s1)  (case t of None  True | (Some t1)  f s1 t1))"
unfolding B2_def B_def by(cases s,cases t,simp+)
lemma rewrite_B_None[simp]:
  shows "None  α = True"
unfolding B_def by(auto)
lemma rewrite_B_m_True[simp]:
  shows "m  (λ a . True) = True"
unfolding B_def by(cases m,simp+)
lemma rewrite_B2_cases:
  shows "(case a of None  True | (Some s)  (case b of None  True | (Some t)  f s t))
          = ( s t . a = (Some s)  b = (Some t)  f s t)"
by(cases a,simp,cases b,simp+)

definition strict_equal :: "'a option  'a  bool"
where "strict_equal m a  case m of None  False | (Some a')  a' = a"

end