If you first transform your goal to look like this:
⋀x y. y ∈ foo x ⟹ qux x y ⟶ baz x []
then apply (induct_tac rule: foo.induct)
will instantiate the induction rule in the way that you want. (It will also leave the object-level implications in the resulting goals, to which you will need to apply (rule impI)
.)
The induct
method does these extra steps dealing with implications automatically, which is one of its major advantages.
On the other hand, induct_tac rule: foo.induct
doesn't do anything more than apply (rule foo.induct)
. (In general, induct_tac
can match the variables you specify, and automatically choose an induction rule based on their types, but you're not taking advantage of those features here.)
I think your best option is to go ahead and use a proof block at the end of your apply chain. If you are worried that all the fix
, assume
and show
statements are too verbose, then you can use the little-advertised case goaln
feature:
apply ...
apply ...
proof -
case goal1 thus ?case
apply induct
...
qed