Theory Channel_Type

section ‹ Channel Types ›

theory Channel_Type
  imports Prisms
  keywords "chantype" :: "thy_defn"
begin

text ‹ A channel type is a simplified algebraic datatype where each constructor has exactly 
  one parameter, and it is wrapped up as a prism. It a dual of an alphabet type. ›

definition ctor_prism :: "('a ⇒ 'd) ⇒ ('d ⇒ bool) ⇒ ('d ⇒ 'a) ⇒ ('a ⟹△ 'd)" where
[lens_defs]: 
"ctor_prism ctor disc sel = ⦇ prism_match = (λ d. if (disc d) then Some (sel d) else None)
                            , prism_build = ctor ⦈"

lemma wb_ctor_prism_intro:
  assumes 
    "⋀ v. disc (ctor v)" 
    "⋀ v. sel (ctor v) = v"
    "⋀ s. disc s ⟹ ctor (sel s) = s"
  shows "wb_prism (ctor_prism ctor disc sel)"
  by (unfold_locales, simp_all add: lens_defs assms)
     (metis assms(3) option.distinct(1) option.sel)

lemma ctor_codep_intro:
  assumes "⋀ x y. ctor1 x ≠ ctor2 y"
  shows "ctor_prism ctor1 disc1 sel1 ∇ ctor_prism ctor2 disc2 sel2"
  by (rule prism_diff_intro, simp add: lens_defs assms)

ML_file "Channel_Type.ML"

end