Theory Automatic_Refinement.Autoref_Gen_Algo
section ‹Infrastructure for Generic Algorithms›
theory Autoref_Gen_Algo
imports Autoref_Translate
begin
definition [simp, autoref_tag_defs]: "GEN_ALGO_tag P == P"
lemma GEN_ALGO_tagI: "P ==> GEN_ALGO_tag P" by simp
abbreviation "SIDE_GEN_ALGO P == PREFER_tag (GEN_ALGO_tag P)"
ML ‹
  structure Autoref_Gen_Algo = struct 
    fun transform_ga_rule context rl = let
      val ctxt = Context.proof_of context
      fun warn msg = Pretty.block [
        Pretty.str msg, 
        Pretty.brk 1,
        Pretty.str "(",
        Thm.pretty_thm ctxt rl,
        Pretty.str ")"
        ]
      |> Pretty.string_of |> warning
   
      fun is_side_prem @{mpat "Trueprop (PREFER_tag _)"} = true
        | is_side_prem @{mpat "Trueprop (DEFER_tag _)"} = true
        | is_side_prem _ = false
    in
      if exists is_side_prem (Thm.prems_of rl) then
        warn ("autoref_ga_rules: SIDE condition premise not allowed here")
      else ()
      ;
      case Thm.concl_of rl of
        @{mpat "Trueprop ((_,_)∈_)"} => 
          warn ("autoref_ga_rules: Refinement condition conclusion. Did you"
            ^" mean an autoref_rule?")  
      | _ => ()
      ;
      [rl]
    end
    structure ga_side_thms = Named_Sorted_Thms (
      val name = @{binding autoref_ga_rules}
      val description = "Additional rules for generic algorithm side conditions"
      val sort = K I
      val transform = transform_ga_rule
    )
    fun side_ga_tac ctxt = resolve_tac ctxt (ga_side_thms.get ctxt)
    fun side_ga_op_tac ctxt = 
      SOLVED' (Autoref_Tacticals.REPEAT_ON_SUBGOAL 
        (Autoref_Translate.trans_step_tac ctxt))
    val setup = ga_side_thms.setup
    fun decl_setup phi = I
    #> Tagged_Solver.declare_solver @{thms GEN_ALGO_tagI} @{binding GEN_ALGO} 
        "Autoref: Generic algorithm side condition solver" 
        ( side_ga_tac) phi
    #> Autoref_Phases.declare_solver @{thms GEN_OP_tagI} @{binding GEN_OP} 
        "Autoref: Generic algorithm operation instantiation" 
        ( side_ga_op_tac) phi
  end
›  
setup Autoref_Gen_Algo.setup
declaration Autoref_Gen_Algo.decl_setup
end