Theory PhiSem_Generic_Boolean

chapter โ€นGeneric Booleanโ€บ

theory PhiSem_Generic_Boolean
  imports PhiSem_Base
  abbrevs "<bool>" = "๐–ป๐—ˆ๐—ˆ๐—…"
begin

section โ€นSemanticsโ€บ

debt_axiomatization ๐–ป๐—ˆ๐—ˆ๐—…          :: TY
                and sem_mk_bool   :: โ€นbool โ‡’ VALโ€บ
                and sem_dest_bool :: โ€นVAL โ‡’ boolโ€บ
  where sem_mk_dest_bool[simp]: โ€นsem_dest_bool (sem_mk_bool b) = bโ€บ
    and ๐–ป๐—ˆ๐—ˆ๐—…_neq_๐—‰๐—ˆ๐—‚๐—Œ๐—ˆ๐—‡[simp]: โ€น๐–ป๐—ˆ๐—ˆ๐—… โ‰  ๐—‰๐—ˆ๐—‚๐—Œ๐—ˆ๐—‡โ€บ
    and can_eq_bool: โ€นCan_EqCompare res (sem_mk_bool x1) (sem_mk_bool x2)โ€บ
    and eq_bool:     โ€นEqCompare (sem_mk_bool x1) (sem_mk_bool x2) = (x1 = x2)โ€บ
    and zero_bool[simp]: โ€นZero ๐–ป๐—ˆ๐—ˆ๐—… = Some (sem_mk_bool False)โ€บ
    and WT_bool[simp]:   โ€นWell_Type ๐–ป๐—ˆ๐—ˆ๐—… = { sem_mk_bool x |x. True }โ€บ  

lemma sem_mk_bool_inj[simp]:
  โ€นsem_mk_bool x = sem_mk_bool y โ‰ก x = yโ€บ
  by (smt (verit, del_insts) sem_mk_dest_bool)

lemma ๐—‰๐—ˆ๐—‚๐—Œ๐—ˆ๐—‡_neq_๐–ป๐—ˆ๐—ˆ๐—…[simp]:
  โ€น๐—‰๐—ˆ๐—‚๐—Œ๐—ˆ๐—‡ โ‰  ๐–ป๐—ˆ๐—ˆ๐—…โ€บ
  using ๐–ป๐—ˆ๐—ˆ๐—…_neq_๐—‰๐—ˆ๐—‚๐—Œ๐—ˆ๐—‡ by fastforce

lemma [ฯ†reason add]:
  โ€น Is_Type_Literal ๐–ป๐—ˆ๐—ˆ๐—… โ€บ
  unfolding Is_Type_Literal_def ..

section โ€นInstructionsโ€บ

definition op_const_bool :: "bool โ‡’ VAL proc"
  where "op_const_bool b = Return (ฯ†arg (sem_mk_bool b))"

definition op_not :: "(VAL, VAL) proc'"
  where "op_not v =
    ฯ†M_getV ๐–ป๐—ˆ๐—ˆ๐—… sem_dest_bool v (ฮปv.
    Return (ฯ†arg (sem_mk_bool (ยฌ v)))
  )"

definition op_and :: "(VAL ร— VAL, VAL) proc'"
  where "op_and =
    ฯ†M_caseV (ฮปva vb.
    ฯ†M_getV ๐–ป๐—ˆ๐—ˆ๐—… sem_dest_bool va (ฮปv.
    ฯ†M_getV ๐–ป๐—ˆ๐—ˆ๐—… sem_dest_bool vb (ฮปu.
    Return (ฯ†arg (sem_mk_bool (v โˆง u)))
  )))"

definition op_or :: "(VAL ร— VAL, VAL) proc'"
  where "op_or =
    ฯ†M_caseV (ฮปva vb.
    ฯ†M_getV ๐–ป๐—ˆ๐—ˆ๐—… sem_dest_bool va (ฮปv.
    ฯ†M_getV ๐–ป๐—ˆ๐—ˆ๐—… sem_dest_bool vb (ฮปu.
    Return (ฯ†arg (sem_mk_bool (v โˆจ u)))
  )))"

definition op_xor :: "(VAL ร— VAL, VAL) proc'"
  where "op_xor =
    ฯ†M_caseV (ฮปva vb.
    ฯ†M_getV ๐–ป๐—ˆ๐—ˆ๐—… sem_dest_bool va (ฮปv.
    ฯ†M_getV ๐–ป๐—ˆ๐—ˆ๐—… sem_dest_bool vb (ฮปu.
    Return (ฯ†arg (sem_mk_bool (v โˆง ยฌ u โˆจ ยฌ v โˆง u)))
  )))"

definition op_equal :: "TY โ‡’ (VAL ร— VAL, VAL) proc'"
  where "op_equal TY =
    ฯ†M_caseV (ฮปva vb.
    ฯ†M_getV TY id va (ฮปv.
    ฯ†M_getV TY id vb (ฮปu.
    (ฮปres. ฯ†M_assert (Can_EqCompare res v u) res) โชข
    Return (ฯ†arg (sem_mk_bool (EqCompare v u)))
)))"


section โ€นฯ†-Typeโ€บ
 
ฯ†type_def ฯ†Bool :: "(VAL, bool) ฯ†" ("๐”น")
  where โ€นx โฆ‚ ๐”น โ‰ก sem_mk_bool x โฆ‚ Itselfโ€บ
  deriving Basic
       and Abstract_DomainL
       and Functionality
       and โ€นSemantic_Zero_Val ๐–ป๐—ˆ๐—ˆ๐—… ๐”น Falseโ€บ
       and Inhabited
       and โ€น๐—๐—’๐—‰๐–พ๐—ˆ๐–ฟ ๐”น = ๐–ป๐—ˆ๐—ˆ๐—…โ€บ
       and Equiv_Class

lemma ฯ†Bool_eqcmp[ฯ†reason 2000]:
  "ฯ†Equal ๐”น (ฮปx y. True) (=)" (*TODO: auto derive!*)
  unfolding ฯ†Equal_def
  by (simp add: can_eq_bool eq_bool)


section โ€นAbstractions of Boolean Arithmeticโ€บ
 
declare_ฯ†lang_operator
  infix 50 "="
  infix 35 "โˆง"
  infix 30 "โˆจ"
  infix 30 โŠ• โ€• โ€นXorโ€บ
  prefix 40 "ยฌ"


subsection โ€นConstantโ€บ

lemma op_const_bool_ฯ†app[ฯ†synthesis for โ€นฮปv. True โฆ‚ ?T vโ€บ (1200) and โ€นฮปv. False โฆ‚ ?T vโ€บ (1200)]:
  โ€น Is_Literal b
โŸน ๐—‰๐—‹๐—ˆ๐–ผ op_const_bool b โฆƒ Void โŸผ ๐—๐–บ๐—… b โฆ‚ ๐”น โฆ„โ€บ
  unfolding op_const_bool_def
  by (rule, simp)

lemma True_ฯ†app:
  โ€น๐—‰๐—‹๐—ˆ๐–ผ op_const_bool True โฆƒ Void โŸผ ๐—๐–บ๐—… True โฆ‚ ๐”น โฆ„โ€บ
  โด โ€นTrueโ€บ โต.

lemma False_ฯ†app:
  โ€น๐—‰๐—‹๐—ˆ๐–ผ op_const_bool False โฆƒ Void โŸผ ๐—๐–บ๐—… False โฆ‚ ๐”น โฆ„โ€บ
  โด โ€นFalseโ€บ โต.


subsection โ€นNotโ€บ

lemma op_not[ฯ†overload ยฌ, ฯ†synthesis 100]:
  โ€น๐—‰๐—‹๐—ˆ๐–ผ op_not raw โฆƒ x โฆ‚ ๐—๐–บ๐—…[raw] ๐”น โŸผ ๐—๐–บ๐—… ยฌ x โฆ‚ ๐”น โฆ„โ€บ
  unfolding op_not_def
  by (cases raw, simp, rule, simp, rule,  simp)

subsection โ€นAndโ€บ

lemma op_and[ฯ†overload โˆง, ฯ†synthesis add]:
  โ€น๐—‰๐—‹๐—ˆ๐–ผ op_and (va, vb) โฆƒ a โฆ‚ ๐—๐–บ๐—…[va] ๐”นโŸ b โฆ‚ ๐—๐–บ๐—…[vb] ๐”น โŸผ ๐—๐–บ๐—… (a โˆง b) โฆ‚ ๐”น โฆ„โ€บ
  unfolding op_and_def
  by (cases va; cases vb; simp, rule, rule, simp, rule, simp, rule, simp)


subsection โ€นOrโ€บ

lemma op_or[ฯ†overload โˆจ, ฯ†synthesis 100]:
  โ€น๐—‰๐—‹๐—ˆ๐–ผ op_or (va, vb) โฆƒ a โฆ‚ ๐—๐–บ๐—…[va] ๐”นโŸ b โฆ‚ ๐—๐–บ๐—…[vb] ๐”น โŸผ ๐—๐–บ๐—… (a โˆจ b) โฆ‚ ๐”น โฆ„โ€บ
  unfolding op_or_def
  by (cases va; cases vb, simp, rule, rule, simp, rule, simp, rule, simp)

subsection โ€นXorโ€บ

lemma op_xor[ฯ†overload โŠ•, ฯ†synthesis 100]:
  โ€น๐—‰๐—‹๐—ˆ๐–ผ op_xor (va, vb) โฆƒ a โฆ‚ ๐—๐–บ๐—…[va] ๐”นโŸ b โฆ‚ ๐—๐–บ๐—…[vb] ๐”น โŸผ ๐—๐–บ๐—… (a โˆง ยฌ b โˆจ ยฌ a โˆง b) โฆ‚ ๐”น โฆ„โ€บ
  unfolding op_xor_def
  by (cases va; cases vb, simp, rule, rule, simp, rule, simp, rule, simp)

subsection โ€นEqualโ€บ

declare [[
    overloaded_operator_in_synthesis โ€นฮปv. x โฆ‚ T vโ€บ โ€นฮปv. y โฆ‚ U vโ€บ โ‡’ โ€นฮปv. x = y โฆ‚ ๐—๐–บ๐—…[v] ๐”นโ€บ,
    overloaded_operator_in_synthesis
        โ€นฮปv. x mod N โฆ‚ T vโ€บ โ€นฮปv. y mod N โฆ‚ U vโ€บ โ‡’ โ€นฮปv. x mod N = y mod N โฆ‚ ๐—๐–บ๐—…[v] ๐”นโ€บ
]]

lemma op_equal_ฯ†app[ฯ†overload =]:
  โ€น ฯ†Equal T can_eq eq
โŸน Semantic_Type' (a โฆ‚ T) TY
โŸน Semantic_Type' (b โฆ‚ T) TY
โŸน ๐—‰๐—‹๐–พ๐—†๐—‚๐—Œ๐–พ can_eq a b
โŸน ๐—‰๐—‹๐—ˆ๐–ผ op_equal TY (ฯ†V_pair rawa rawb) โฆƒ a โฆ‚ ๐—๐–บ๐—…[rawa] TโŸ b โฆ‚ ๐—๐–บ๐—…[rawb] T โŸผ eq a b โฆ‚ ๐—๐–บ๐—… ๐”น โฆ„โ€บ
  unfolding op_equal_def
  by ((cases rawa; cases rawb; simp, rule, rule),
      simp add: Semantic_Type'_def subset_iff Premise_def,
      simp add: Semantic_Type'_def subset_iff Premise_def, rule,
      unfold ฯ†Equal_def Premise_def, simp, simp,
      rule, simp)

declare op_equal_ฯ†app[where eq=โ€น(=)โ€บ, ฯ†synthesis 100]
declare op_equal_ฯ†app[where eq=โ€น(ฮปx y. x mod N = y mod N)โ€บ for N, ฯ†synthesis 100]



end