У меня есть
theory Even
imports Main
begin
inductive
structural_even :: "nat ⇒ bool"
where
"structural_even 0"
| "structural_even n ⟹ structural_even (Suc(Suc n))"
fun
computational_even :: "nat ⇒ bool"
where
"computational_even 0 = True"
| "computational_even (Suc 0) = False"
| "computational_even (Suc(Suc n)) = computational_even n"
lemma "computational_even n ⟹ structural_even n"
proof (induct n rule: computational_even.induct)
show "computational_even 0 ⟹ structural_even 0"
by (metis structural_even.intros(1))
next
После доказательства я получаю
goal (3 subgoals):
1. computational_even 0 ⟹ structural_even 0
2. computational_even (Suc 0) ⟹ structural_even (Suc 0)
3. ⋀n. (computational_even n ⟹ structural_even n) ⟹ computational_even (Suc (Suc n)) ⟹ structural_even (Suc (Suc n))
Я получил вызов метиса от кувалды, где
Structure_even.intros(1) = Structure_even 0
я получил
show computational_even 0 ⟹ structural_even 0
Successful attempt to solve goal by exported rule:
computational_even 0 ⟹ structural_even 0
proof (state): depth 0
потом. Однако после следующего я получаю
goal (3 subgoals):
1. computational_even 0 ⟹ computational_even 0
2. computational_even (Suc 0) ⟹ structural_even (Suc 0)
3. ⋀n. (computational_even n ⟹ structural_even n) ⟹ computational_even (Suc (Suc n)) ⟹ structural_even (Suc (Suc n))
Таким образом, есть тривиальная остаточная подцель в 1., несмотря на то, что система сказала «Успешная попытка решить цель по экспортированному правилу».
Почему это происходит, и как я могу это исправить?