Theory iq.Isar_Explore
theory Isar_Explore
imports Main
begin
ML‹
fun register {name, pri} f =
Command.print_function (name ^ "_query")
(fn {args = instance :: args, exec_id, ...} =>
SOME {delay = NONE, pri = pri, persistent = false, strict = false,
print_fn = fn _ =>
Thread_Attributes.uninterruptible
(fn run => fn state =>
let
fun output_result s = Output.result [(Markup.instanceN, instance)] [s];
val status = YXML.output_markup_only #> output_result;
val writeln_result = Markup.markup Markup.writeln #> output_result
val report_error = Markup.markup Markup.error #> output_result
val report_exn = Runtime.exn_message #> report_error
val _ = status Markup.running
val _ = OS.Process.sleep (Time.fromMilliseconds 100)
fun main () =
f {state = state, args = args, output_result = output_result,
writeln_result = writeln_result, instance=instance, exec_id=exec_id}
val _ =
(case Exn.capture_body (run main) of
Exn.Res () => ()
| Exn.Exn exn => report_exn exn)
val _ = status Markup.finished
in () end)}
| _ => NONE);
›
ML‹
fun isar_explore exec_id instance text state =
let
val overlay_file = "overlay_instance(" ^ instance ^ ")"
val pos = Position.none
val thy = Toplevel.theory_of state
val transitions = Outer_Syntax.parse_text thy (fn () => thy) pos text
|> List.map (Toplevel.exec_id exec_id)
fun run_transition (tr, st) =
let
val old_parallel_proofs = ! Multithreading.parallel_proofs
val _ = Multithreading.parallel_proofs := Int.min(2, old_parallel_proofs)
val (st', err_opt) = Toplevel.transition false tr st
val _ = Multithreading.parallel_proofs := old_parallel_proofs
in case err_opt of NONE => st' | SOME (exn, _) =>
(raise exn) end
in
List.foldl (fn (tr, st) => run_transition (tr, st)) state transitions
end;
val _ = register {name = "isar_explore", pri = Task_Queue.urgent_pri}
(fn {state, args, writeln_result, instance, exec_id, ...} =>
(case args of [isar_text] => isar_explore exec_id instance isar_text state
|> Toplevel.string_of_state
|> writeln_result
| _ => raise (ERROR "Invalid number of arguments for isar_explore")))
›
end