Я пытаюсь написать собственное правило индукции для индуктивного набора. К сожалению, когда я пытаюсь применить это с induction rule: my_induct_rule
, я получаю лишнее, невозможно доказать. Имею следующее:
inductive iterate :: "('a ⇒ 'a ⇒ bool) ⇒ 'a ⇒ 'a ⇒ bool" for f where
iter_refl [simp]: "iterate f a a"
| iter_step [elim]: "f a b ⟹ iterate f b c ⟹ iterate f a c"
theorem my_iterate_induct: "iterate f x y ⟹ (⋀a. P a a) ⟹
(⋀a b c. f a b ⟹ iterate f b c ⟹ P b c ⟹ P a c) ⟹ P x y"
by (induction x y rule: iterate.induct) simp_all
lemma iter_step_backwards: "iterate f a b ⟹ f b c ⟹ iterate f a c"
proof (induction a b rule: my_iterate_induct)
...
qed
Очевидно, что настраиваемое правило индукции не дает мне никаких новых возможностей (мой реальный вариант использования более сложен), но это своего рода суть. my_iterate_induct
в точности совпадает с автогенерированным правилом iterate.induct
, насколько я могу судить, но внутри блока доказательства у меня есть следующие цели:
goal (3 subgoals):
1. iterate ?f a b
2. ⋀a. iterate f a a ⟹ f a c ⟹ iterate f a c
3. ⋀a b ca. ?f a b ⟹ iterate ?f b ca ⟹
(iterate f b ca ⟹ f ca c ⟹ iterate f b c) ⟹ iterate f a ca ⟹
f ca c ⟹ iterate f a c
Цель 1, кажется, возникла из-за некоторой неспособности унифицировать? F с фактическим аргументом f, но если я проигнорирую тот факт, что f фиксирован, и попробую induction f a b rule: my_iterate_induct
, я просто получу Failed to apply proof method
, как и ожидалось. Как добиться хорошего поведения, которое обеспечивает обычный iterate.induct
?