File ‹transport.ML›
structure Transport =
struct
structure Util = Transport_Util
structure Transport_Defs = Named_Thms(
val name = @{binding "trp_def"}
val description = "Definitions used by Transport"
)
val _ = Theory.setup Transport_Defs.setup
val simp_rhs = Simplifier.rewrite #> Conversion_Util.rhs_conv #> Conversion_Util.apply_thm_conv
fun simp_transported_def ctxt simps y_def =
let
val ctxt = ctxt addsimps simps
val y_def_eta_expanded = Util.equality_eta_expand ctxt "x" y_def
in apply2 (simp_rhs ctxt) (y_def, y_def_eta_expanded) end
val any_unify_trp_hints_resolve_tac = Unify_Resolve_Base.unify_resolve_any_tac
Transport_Mixed_Comb_Unification.norms_first_higherp_comb_unify
Transport_Mixed_Comb_Unification.first_higherp_comb_unify
fun get_theorems_tac f get_theorems ctxt = f (get_theorems ctxt) ctxt
val get_theorems_resolve_tac = get_theorems_tac any_unify_trp_hints_resolve_tac
val _ = Theory.setup (
Method.setup @{binding trp_hints_resolve}
(Attrib.thms >> (SIMPLE_METHOD' oo any_unify_trp_hints_resolve_tac))
"Resolution with unification hints for Transport"
)
structure PER_Intros = Named_Thms(
val name = @{binding "per_intro"}
val description = "Introduction rules for per_prover"
)
val _ = Theory.setup PER_Intros.setup
fun per_prover_tac ctxt = REPEAT_ALL_NEW (get_theorems_resolve_tac PER_Intros.get ctxt)
val _ = Theory.setup (
Method.setup @{binding per_prover}
(Scan.succeed (SIMPLE_METHOD' o per_prover_tac))
"PER prover for Transport"
)
structure Transport_in_dom = Named_Thms(
val name = @{binding "trp_in_dom"}
val description = "In domain theorems for Transport"
)
val _ = Theory.setup Transport_in_dom.setup
fun transport_in_dom_prover_tac ctxt = get_theorems_resolve_tac Transport_in_dom.get ctxt
val _ = Theory.setup (
Method.setup @{binding trp_in_dom_prover}
(Scan.succeed (SIMPLE_METHOD' o transport_in_dom_prover_tac))
"in_dom prover for Transport"
)
fun unfold_tac thms ctxt = simp_tac (clear_simpset ctxt addsimps thms)
val unfold_transport_defs_tac = get_theorems_tac unfold_tac Transport_Defs.get
fun transport_prover ctxt i =
per_prover_tac ctxt i
THEN TRY (SOMEGOAL
(TRY o unfold_transport_defs_tac ctxt
THEN' transport_in_dom_prover_tac ctxt)
)
val _ = Theory.setup (
Method.setup @{binding trp_prover}
(Scan.succeed (SIMPLE_METHOD' o transport_prover))
"Blackbox prover for Transport"
)
structure Transport_Related_Intros = Named_Thms(
val name = @{binding "trp_related_intro"}
val description = "Introduction rules for Transport whitebox proofs"
)
val _ = Theory.setup Transport_Related_Intros.setup
structure Transport_Relator_Rewrites = Named_Thms(
val name = @{binding "trp_relator_rewrite"}
val description = "Rewrite rules for relators used by Transport"
)
val _ = Theory.setup Transport_Relator_Rewrites.setup
fun per_simp_prover ctxt thm =
let
val prems = Thm.cprems_of thm
val per_prover_tac = per_prover_tac ctxt
fun prove_prem prem = Goal.prove_internal ctxt [] prem (fn _ => HEADGOAL per_prover_tac)
in try (map prove_prem) prems |> Option.map (curry (op OF) thm) end
fun transport_relator_rewrite ctxt thm =
let
val transport_defs = Transport_Defs.get ctxt
val transport_relator_rewrites = Transport_Relator_Rewrites.get ctxt
val ctxt = (clear_simpset ctxt) addsimps transport_relator_rewrites
in
Local_Defs.fold ctxt transport_defs thm
|> Simplifier.rewrite_thm (false, false, false) per_simp_prover ctxt
end
fun transport_relator_rewrite_tac ctxt =
EqSubst.eqsubst_tac ctxt [0] (Transport_Relator_Rewrites.get ctxt)
THEN_ALL_NEW TRY o SOLVED' (per_prover_tac ctxt)
val _ = Theory.setup (
Method.setup @{binding trp_relator_rewrite}
(Scan.succeed (SIMPLE_METHOD' o transport_relator_rewrite_tac))
"Rewrite Transport relator"
)