Theory Partial_Function_Command

section ‹ Partial Function Command ›

theory Partial_Function_Command
  imports Function_Toolkit
  keywords "zfun" :: "thy_decl_block" and "precondition" "postcondition"
begin

definition pfun_spec :: "('a ⇒ bool) ⇒ ('a ⇒ 'b ⇒ bool) ⇒ 'a ⇸ 'b" where
"pfun_spec P Q = (λ x | P x ∧ (∃ y. Q x y) ∙ SOME y. Q x y)"

lemma pfun_spec_app_eqI [intro]: "⟦ P x; ⋀ y. Q x y ⟷ y = f x ⟧ ⟹ (pfun_spec P Q)(x)p = f x"
  by (simp add: pfun_spec_def, subst pabs_apply, auto)

ML_file ‹Partial_Function_Command.ML›

ML ‹
val _ =
  Outer_Syntax.command @{command_keyword zfun} "define Z-like partial functions" 
    (Zfun_Command.zfun_parser >> (Toplevel.theory o Zfun_Command.compile_zfun));
›

end