Theory Refine_Monadic.Refine_Monadic
section ‹Refinement Framework›
theory Refine_Monadic
imports 
  Refine_Chapter
  Refine_Basic 
  Refine_Leof
  Refine_Heuristics 
  Refine_More_Comb
  Refine_While 
  Refine_Foreach 
  Refine_Transfer
  Refine_Pfun
  Refine_Automation
  Autoref_Monadic
begin
  text ‹
    This theory summarizes all default theories of the refinement framework.
›
  subsection ‹Convenience Constructs›
  definition "REC_annot pre post body x ≡ 
    REC (λD x. do {ASSERT (pre x); r←body D x; ASSERT (post x r); RETURN r}) x"
  
  theorem REC_annot_rule[refine_vcg]:
    assumes M: "trimono body"
    and P: "pre x"
    and S: "⋀f x. ⟦⋀x. pre x ⟹ f x ≤ SPEC (post x); pre x⟧ 
            ⟹ body f x ≤ SPEC (post x)"
    and C: "⋀r. post x r ⟹ Φ r"
    shows "REC_annot pre post body x ≤ SPEC Φ"
  proof -
    from ‹trimono body› have [refine_mono]:
      "⋀f g x xa. (⋀x. flat_ge (f x) (g x)) ⟹ flat_ge (body f x) (body g x)"
      "⋀f g x xa. (⋀x. f x ≤ g x) ⟹ body f x ≤ body g x"
      apply -
      unfolding trimono_def monotone_def fun_ord_def mono_def le_fun_def
      apply (auto)
      done
  
    show ?thesis
      unfolding REC_annot_def
      apply (rule order_trans[where y="SPEC (post x)"])
      apply (refine_rcg 
        refine_vcg 
        REC_rule[where pre=pre and M="λx. SPEC (post x)"]
        order_trans[OF S]
      )
      apply fact
      apply simp
      using C apply (auto) []
      done
  qed
  
  subsection ‹Syntax Sugar›
  locale Refine_Monadic_Syntax begin
  
    notation SPEC (binder ‹spec › 10)
    notation ASSERT (‹assert›)
    notation RETURN (‹return›)
    notation FOREACH (‹foreach›)
    notation WHILE (‹while›)
    notation WHILET (‹while⇩T›)
    notation WHILEI (‹while⇗_⇖›)
    notation WHILET (‹while⇩T›)
    notation WHILEIT (‹while⇩T⇗_⇖›)
    notation RECT (binder ‹rec⇩T › 10)
    notation REC (binder ‹rec › 10)
    notation SELECT (binder ‹select › 10)
      
  end
    
end