fun adm_const T = \<^Const>\<open>adm T\<close> fun mk_adm (x, T, P) = adm_const T $ absfree (x, T) P
fun below_const T = \<^Const>\<open>below T\<close>
(* proving class instances *)
fun prove_cpo
(name: binding)
(newT: typ)
opt_bindings
(type_definition: thm) (* type_definition Rep Abs A *)
(below_def: thm) (* op << == %x y. Rep x << Rep y *)
(admissible: thm) (* adm (%x. x : set) *)
(thy: theory)
= let val {Rep_name, Abs_name, ...} = Typedef.make_bindings name opt_bindings; val cpo_thms = map (Thm.transfer thy) [type_definition, below_def, admissible] val (full_tname, Ts) = dest_Type newT val lhs_sorts = map (snd o dest_TFree) Ts fun tac ctxt = resolve_tac ctxt [@{thm typedef_cpo} OF cpo_thms] 1 val thy = Axclass.prove_arity (full_tname, lhs_sorts, \<^sort>\<open>cpo\<close>) tac thy (* transfer thms so that they will know about the new cpo instance *) val cpo_thms' = map (Thm.transfer thy) cpo_thms fun make thm = Drule.zero_var_indexes (thm OF cpo_thms') val cont_Rep = make @{thm typedef_cont_Rep} val cont_Abs = make @{thm typedef_cont_Abs} val lub = make @{thm typedef_lub} val compact = make @{thm typedef_compact} val (_, thy) =
thy
|> Sign.add_path (Binding.name_of name)
|> Global_Theory.add_thms
([((Binding.prefix_name "adm_" name, admissible), []),
((Binding.prefix_name "cont_" Rep_name, cont_Rep ), []),
((Binding.prefix_name "cont_" Abs_name, cont_Abs ), []),
((Binding.prefix_name "lub_" name, lub ), []),
((Binding.prefix_name "compact_" name, compact ), [])])
||> Sign.parent_path val cpo_info : cpo_info =
{ below_def = below_def, adm = admissible, cont_Rep = cont_Rep,
cont_Abs = cont_Abs, lub = lub, compact = compact } in
(cpo_info, thy) end
fun prove_pcpo
(name: binding)
(newT: typ)
opt_bindings
(type_definition: thm) (* type_definition Rep Abs A *)
(below_def: thm) (* op << == %x y. Rep x << Rep y *)
(bottom_mem: thm) (* bottom : set *)
(thy: theory)
= let val {Rep_name, Abs_name, ...} = Typedef.make_bindings name opt_bindings; val pcpo_thms = map (Thm.transfer thy) [type_definition, below_def, bottom_mem] val (full_tname, Ts) = dest_Type newT val lhs_sorts = map (snd o dest_TFree) Ts fun tac ctxt = resolve_tac ctxt [@{thm typedef_pcpo} OF pcpo_thms] 1 val thy = Axclass.prove_arity (full_tname, lhs_sorts, \<^sort>\<open>pcpo\<close>) tac thy val pcpo_thms' = map (Thm.transfer thy) pcpo_thms fun make thm = Drule.zero_var_indexes (thm OF pcpo_thms') val Rep_strict = make @{thm typedef_Rep_strict} val Abs_strict = make @{thm typedef_Abs_strict} val Rep_bottom_iff = make @{thm typedef_Rep_bottom_iff} val Abs_bottom_iff = make @{thm typedef_Abs_bottom_iff} val (_, thy) =
thy
|> Sign.add_path (Binding.name_of name)
|> Global_Theory.add_thms
([((Binding.suffix_name "_strict" Rep_name, Rep_strict), []),
((Binding.suffix_name "_strict" Abs_name, Abs_strict), []),
((Binding.suffix_name "_bottom_iff" Rep_name, Rep_bottom_iff), []),
((Binding.suffix_name "_bottom_iff" Abs_name, Abs_bottom_iff), [])])
||> Sign.parent_path val pcpo_info =
{ Rep_strict = Rep_strict, Abs_strict = Abs_strict,
Rep_bottom_iff = Rep_bottom_iff, Abs_bottom_iff = Abs_bottom_iff } in
(pcpo_info, thy) end
(* prepare_cpodef *)
fun prepare prep_term name (tname, raw_args, _) raw_set thy = let (*rhs*) val tmp_ctxt =
Proof_Context.init_global thy
|> fold (Variable.declare_typ o TFree) raw_args valset = prep_term tmp_ctxt raw_set val tmp_ctxt' = tmp_ctxt |> Variable.declare_term set
val setT = Term.fastype_of set val oldT = HOLogic.dest_setT setT handleTYPE _ =>
error ("Not a set type: " ^ quote (Syntax.string_of_typ tmp_ctxt setT))
(*lhs*) val lhs_tfrees = map (Proof_Context.check_tfree tmp_ctxt') raw_args val full_tname = Sign.full_name thy tname val newT = Type (full_tname, map TFree lhs_tfrees) in
(newT, oldT, set) end
fun add_podef typ set opt_bindings tac thy = let val name = #1 typ val ((full_tname, info as ({Rep_name, ...}, {type_definition, ...})), thy) =
thy
|> Named_Target.theory_map_result (apsnd o Typedef.transform_info)
(Typedef.add_typedef {overloaded = false} typ set opt_bindings tac) val oldT = #rep_type (#1 info) val newT = #abs_type (#1 info) val lhs_tfrees = map dest_TFree (dest_Type_args newT)
fun prepare_cpodef
(prep_term: Proof.context -> 'a -> term)
(typ: binding * (string * sort) list * mixfix)
(raw_set: 'a)
opt_bindings
(thy: theory)
: term * term * (thm -> thm -> theory -> (Typedef.info * cpo_info) * theory) = let val name = #1 typ val (newT, oldT, set) = prepare prep_term name typ raw_set thy
fun cpodef_result nonempty admissible thy = let val ((info as (_, {type_definition, ...}), below_def), thy) = thy
|> add_podef typ set opt_bindings (fn ctxt => resolve_tac ctxt [nonempty] 1) val (cpo_info, thy) = thy
|> prove_cpo name newT opt_bindings type_definition below_def admissible in
((info, cpo_info), thy) end in
(goal_nonempty, goal_admissible, cpodef_result) end handle ERROR msg =>
cat_error msg ("The error(s) above occurred in cpodef " ^ Binding.print (#1 typ))
fun prepare_pcpodef
(prep_term: Proof.context -> 'a -> term)
(typ: binding * (string * sort) list * mixfix)
(raw_set: 'a)
opt_bindings
(thy: theory)
: term * term * (thm -> thm -> theory -> (Typedef.info * cpo_info * pcpo_info) * theory) = let val name = #1 typ val (newT, oldT, set) = prepare prep_term name typ raw_set thy
val goal_bottom_mem =
HOLogic.mk_Trueprop (HOLogic.mk_mem (\<^Const>\<open>bottom oldT\<close>, set))
fun pcpodef_result bottom_mem admissible thy = let fun tac ctxt = resolve_tac ctxt [exI] 1 THEN resolve_tac ctxt [bottom_mem] 1 val ((info as (_, {type_definition, ...}), below_def), thy) = thy
|> add_podef typ set opt_bindings tac val (cpo_info, thy) = thy
|> prove_cpo name newT opt_bindings type_definition below_def admissible val (pcpo_info, thy) = thy
|> prove_pcpo name newT opt_bindings type_definition below_def bottom_mem in
((info, cpo_info, pcpo_info), thy) end in
(goal_bottom_mem, goal_admissible, pcpodef_result) end handle ERROR msg =>
cat_error msg ("The error(s) above occurred in pcpodef " ^ Binding.print (#1 typ))
(* tactic interface *)
fun add_cpodef typ set opt_bindings (tac1, tac2) thy = let val (goal1, goal2, cpodef_result) =
prepare_cpodef Syntax.check_term typ set opt_bindings thy val thm1 = Goal.prove_global thy [] [] goal1 (tac1 o #context) handle ERROR msg => cat_error msg
("Failed to prove non-emptiness of " ^ quote (Syntax.string_of_term_global thy set)) val thm2 = Goal.prove_global thy [] [] goal2 (tac2 o #context) handle ERROR msg => cat_error msg
("Failed to prove admissibility of " ^ quote (Syntax.string_of_term_global thy set)) in cpodef_result thm1 thm2 thy end
fun add_pcpodef typ set opt_bindings (tac1, tac2) thy = let val (goal1, goal2, pcpodef_result) =
prepare_pcpodef Syntax.check_term typ set opt_bindings thy val thm1 = Goal.prove_global thy [] [] goal1 (tac1 o #context) handle ERROR msg => cat_error msg
("Failed to prove non-emptiness of " ^ quote (Syntax.string_of_term_global thy set)) val thm2 = Goal.prove_global thy [] [] goal2 (tac2 o #context) handle ERROR msg => cat_error msg
("Failed to prove admissibility of " ^ quote (Syntax.string_of_term_global thy set)) in pcpodef_result thm1 thm2 thy end
(* proof interface *)
local
fun gen_cpodef_proof prep_term prep_constraint
((b, raw_args, mx), set, opt_bindings) thy = let val ctxt = Proof_Context.init_global thy val args = map (apsnd (prep_constraint ctxt)) raw_args val (goal1, goal2, make_result) =
prepare_cpodef prep_term (b, args, mx) set opt_bindings thy fun after_qed [[th1, th2]] = Proof_Context.background_theory (snd o make_result th1 th2)
| after_qed _ = raise Fail "cpodef_proof" in Proof.theorem NONE after_qed [[(goal1, []), (goal2, [])]] ctxt end
fun gen_pcpodef_proof prep_term prep_constraint
((b, raw_args, mx), set, opt_bindings) thy = let val ctxt = Proof_Context.init_global thy val args = map (apsnd (prep_constraint ctxt)) raw_args val (goal1, goal2, make_result) =
prepare_pcpodef prep_term (b, args, mx) set opt_bindings thy fun after_qed [[th1, th2]] = Proof_Context.background_theory (snd o make_result th1 th2)
| after_qed _ = raise Fail "pcpodef_proof" in Proof.theorem NONE after_qed [[(goal1, []), (goal2, [])]] ctxt end
in
fun cpodef_proof x = gen_cpodef_proof Syntax.check_term (K I) x fun cpodef_proof_cmd x = gen_cpodef_proof Syntax.read_term Typedecl.read_constraint x
fun pcpodef_proof x = gen_pcpodef_proof Syntax.check_term (K I) x fun pcpodef_proof_cmd x = gen_pcpodef_proof Syntax.read_term Typedecl.read_constraint x
end
(** outer syntax **)
local
fun cpodef pcpo =
(Parse.type_args_constrained -- Parse.binding) -- Parse.opt_mixfix --
(\<^keyword>\<open>=\<close> |-- Parse.term) --
Scan.option
(\<^keyword>\<open>morphisms\<close> |-- Parse.!!! (Parse.binding -- Parse.binding))
>> (fn ((((args, t), mx), A), morphs) =>
Toplevel.theory_to_proof
((if pcpo then pcpodef_proof_cmd else cpodef_proof_cmd)
((t, args, mx), A, SOME (Typedef.make_morphisms t morphs))))
in
val _ =
Outer_Syntax.command \<^command_keyword>\<open>pcpodef\<close> "HOLCF type definition (requires admissibility proof)"
(cpodef true)
val _ =
Outer_Syntax.command \<^command_keyword>\<open>cpodef\<close> "HOLCF type definition (requires admissibility proof)"
(cpodef false)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.