Cette question est un suivi à la question suivante isabelle proving commutativity for add, mon suivi était trop long pour être un commentaire. Le problème comme indiqué était de montrer la commutativité de la fonction d'ajout défini comme suit:Prouver la commutativité d'ajouter, Prendre 2
fun add :: "nat ⇒ nat ⇒ nat" where
"add 0 n = n" |
"add (Suc m) n = Suc(add m n)"
Essayer
theorem "add m n = add n m"
apply(induct_tac m)
apply(auto)
se coince (le cas inductif) en raison d'un manque lemme. Je me suis intéressé à ce problème et j'étudiais une autre méthode (quoique moins efficace) pour le prouver. Supposons que nous avons défini le Lemme
lemma Lemma1 [simp]: "add n (Suc 0) = Suc n
qu'Isabelle peut se révéler automatiquement par induction Ensuite, l'étape inductive est de prouver
Suc (add k m) = add m (Suc k)
que nous pourrions faire à la main comme suit
Suc (add k m)
= Suc (add m k) by the IH
= add (add m k) (Suc 0) by Lemma1 <--
= add m (add k (Suc 0)) by associativity (already proved)
= add m (Suc k) by the Lemma1 -->
Cependant , Isabelle est incapable de le prouver, et il semble que le simplificateur soit bloqué à la 2ème ligne. Cependant, en utilisant le plus évident
lemma Lemma2 [simp]: "add m (Suc n) = Suc (add m n)"
au lieu de Lemma1, la preuve réussit. Il semble pouvoir utiliser Lemma2 dans les deux directions mais pas Lemma1 I défini ci-dessus. Est-ce que quelqu'un sait pourquoi? Je me sens comme je donne sur quelque chose d'évident, quelque part ..
Remarques: Je me rends compte du fait simplificateur applique uniquement les définitions dans un sens, mais utilise des heuristiques pour tenter de réduire les deux côtés de l'équation au même terme
où vous dites "coincé à cause d'un lemme manquant"? –