Theory Probabilistic_Timed_Automata.Instantiate_Existentials
theory Instantiate_Existentials
imports Main
begin
ML ‹
fun inst_existentials_tac ctxt [] = TRY o REPEAT_ALL_NEW (resolve_tac ctxt @{thms conjI})
| inst_existentials_tac ctxt (t :: ts) =
(TRY o REPEAT_ALL_NEW (resolve_tac ctxt @{thms conjI}))
THEN_ALL_NEW (TRY o (
let
val inst = Drule.infer_instantiate' ctxt [NONE, SOME (Thm.cterm_of ctxt t)]
val thms = map inst @{thms exI bexI}
in
resolve_tac ctxt thms THEN' inst_existentials_tac ctxt ts
end))
›
method_setup inst_existentials =
‹
Scan.lift (Scan.repeat Parse.term) >>
(fn ts => fn ctxt => SIMPLE_METHOD' (inst_existentials_tac ctxt
(map (Syntax.read_term ctxt) ts)))
›
text ‹Test›
lemma
"∃ x. ∃ y ∈ UNIV. (∃ z ∈ UNIV. x + y = (z::nat)) ∧ (∃ z. x + y = (z::nat))"
by (inst_existentials "1 :: nat" "2 :: nat" "3 :: nat"; simp)
end