signature NOMINAL_PERMEQ = sig datatype eqvt_config =
Eqvt_Config of {strict_mode: bool, pre_thms: thm list, post_thms: thm list, excluded: stringlist}
val eqvt_relaxed_config: eqvt_config val eqvt_strict_config: eqvt_config val addpres : (eqvt_config * thm list) -> eqvt_config val addposts : (eqvt_config * thm list) -> eqvt_config val addexcls : (eqvt_config * stringlist) -> eqvt_config val delpres : eqvt_config -> eqvt_config val delposts : eqvt_config -> eqvt_config
val eqvt_conv: Proof.context -> eqvt_config -> conv val eqvt_rule: Proof.context -> eqvt_config -> thm -> thm val eqvt_tac: Proof.context -> eqvt_config -> int -> tactic
val perm_simp_meth: thm list * stringlist -> Proof.context -> Proof.method val perm_strict_simp_meth: thm list * stringlist -> Proof.context -> Proof.method val args_parser: (thm list * stringlist) context_parser
fun trace_enabled ctxt = Config.get ctxt trace_eqvt
fun trace_msg ctxt result = let val lhs_str = Syntax.string_of_term ctxt (Thm.term_of (Thm.lhs_of result)) val rhs_str = Syntax.string_of_term ctxt (Thm.term_of (Thm.rhs_of result)) in
warning (Pretty.string_of (Pretty.strs ["Rewriting", lhs_str, "to", rhs_str])) end
fun trace_conv ctxt conv ctrm = let val result = conv ctrm in if Thm.is_reflexive result then result else (trace_msg ctxt result; result) end
(* this conversion always fails, but prints
out the analysed term *) fun trace_info_conv ctxt ctrm = let val trm = Thm.term_of ctrm val _ = case (head_of trm) of
\<^Const_>\<open>Trueprop\<close> => ()
| _ => warning ("Analysing term " ^ Syntax.string_of_term ctxt trm) in
Conv.no_conv ctrm end
(* conversion for applications *) fun eqvt_apply_conv ctrm = case Thm.term_of ctrm of
\<^Const_>\<open>permute _ for _ \<open>_ $ _\<close>\<close> => let val (perm, t) = Thm.dest_comb ctrm val (_, p) = Thm.dest_comb perm val (f, x) = Thm.dest_comb t val a = Thm.ctyp_of_cterm x; val b = Thm.ctyp_of_cterm t; val ty_insts = map SOME [b, a] val term_insts = map SOME [p, f, x] in
Thm.instantiate' ty_insts term_insts @{thm eqvt_apply} end
| _ => Conv.no_conv ctrm
(* conversion for lambdas *) fun eqvt_lambda_conv ctrm = case Thm.term_of ctrm of
\<^Const_>\<open>permute _ for _ \<open>Abs _\<close>\<close> =>
Conv.rewr_conv @{thm eqvt_lambda} ctrm
| _ => Conv.no_conv ctrm
(* conversion that raises an error or prints a warning message,
if a permutation on a constant or application cannot be analysed *)
fun is_excluded excluded (Const (a, _)) = member (op=) excluded a
| is_excluded _ _ = false
fun progress_info_conv ctxt strict_flag excluded ctrm = let fun msg trm = if is_excluded excluded trm then () else
(if strict_flag then error else warning)
("Cannot solve equivariance for " ^ (Syntax.string_of_term ctxt trm))
val _ = case Thm.term_of ctrm of
\<^Const_>\<open>permute _ for _ \<open>trm as Const _\<close>\<close> => msg trm
| \<^Const_>\<open>permute _ for _ \<open>trm as _ $ _\<close>\<close> => msg trm
| _ => () in
Conv.all_conv ctrm end
(* main conversion *) fun main_eqvt_conv ctxt config ctrm = let val Eqvt_Config {strict_mode, pre_thms, post_thms, excluded} = config
val first_conv_wrapper = if trace_enabled ctxt then Conv.first_conv o (cons (trace_info_conv ctxt)) o (map (trace_conv ctxt)) else Conv.first_conv
val all_pre_thms = map safe_mk_equiv (pre_thms @ get_eqvts_raw_thms ctxt) val all_post_thms = map safe_mk_equiv post_thms in
first_conv_wrapper
[ Conv.rewrs_conv all_pre_thms,
eqvt_apply_conv,
eqvt_lambda_conv,
Conv.rewrs_conv all_post_thms,
progress_info_conv ctxt strict_mode excluded
] ctrm end
(* the eqvt-conversion first eta-normalises goals in ordertoavoidproblemswithinductionsinthe
equivariance command. *) fun eqvt_conv ctxt config =
Conv.top_conv (fn ctxt => Thm.eta_conversion then_conv (main_eqvt_conv ctxt config)) ctxt
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 und die Messung sind noch experimentell.