В учебном пособии Программирование и проверка в Изабель / HOL есть пошаговое объяснение доказательства обратного изменения списка в два раза, что дает исходный список (2.2.4 Процесс проверки).
theorem rev_rev [simp]: "rev(rev xs) = xs"
apply(induction xs)
apply(auto)
После автоматического шага остается одна подцель:
1. V x1 xs.
rev (rev xs) = xs =⇒
rev (app (rev xs) (Cons x1 Nil)) = Cons x1 xs
Затем автор говорит: «Чтобы еще больше упростить эту подцель, лемма напрашивается сама собой». И представляет rev_app.приведенная ниже лемма:
lemma rev_app [simp]: "rev(app xs ys) = app (rev ys) (rev xs)"
Является ли это просто интуицией и практикой, как в случае ручных и бумажных доказательств, которые позволяют увидеть, как подзадача 1. может быть упрощена, и придумать лемму, подобную rev_app?Я просто не могу понять, как эта лемма предлагает себя.