Diese Frage ist eine Follow-up auf die folgende Frage isabelle proving commutativity for add, meine Follow-up war zu lang, um ein Kommentar zu sein. Das Problem, wie angegeben war, die Kommutativität der Add-Funktion definiert wie folgt anzuzeigen:Überprüfung der Kommutativität von hinzufügen, Take 2
fun add :: "nat ⇒ nat ⇒ nat" where
"add 0 n = n" |
"add (Suc m) n = Suc(add m n)"
Versuch
theorem "add m n = add n m"
apply(induct_tac m)
apply(auto)
stecken bleibt (auf dem induktiven Fall) wegen einer fehlenden Lemma. Ich wurde neugierig auf dieses Problem und erforschte alternative (wenn auch weniger effiziente) Wege, es zu beweisen. Angenommen definierten wir das Lemma
lemma Lemma1 [simp]: "add n (Suc 0) = Suc n
, die Isabelle durch Induktion automatisch nachweisen kann, dann der induktive Schritt ist
Suc (add k m) = add m (Suc k)
zu beweisen, die wir von Hand tun könnten als
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 -->
folgen jedoch , Isabelle ist nicht in der Lage, dies zu beweisen, und es scheint, dass der Vereinfacher in der zweiten Zeile festsitzt. Unter Verwendung der offensicht- licheren Methode anstelle von Lemma1 ist der Proof jedoch erfolgreich. Es scheint in der Lage zu sein, Lemma2 in beiden Richtungen zu verwenden, aber nicht das oben definierte Lemma1. Weiß jemand warum? Ich fühle mich wie ich offensichtlich irgendwo etwas mit Blick auf bin ..
Bemerkungen: Mir ist klar, nur die simplifier tatsächlich Definitionen gelten etc in eine Richtung, sondern nutzen Heuristiken, um zu versuchen und beiden Seiten der Gleichung auf den gleichen Begriff
Um es Ihnen zu erleichtern, Ihnen zu helfen, ohne Isabelle zu starten, können Sie auch den Proof-Status einfügen, an dem die Proofs fehlschlagen, z. wo du sagst "bleibt wegen eines fehlenden Lemmas hängen"? –