Mit einiger Erfahrung in Haskell, habe ich gerade angefangen, Idris für Theoremprüfung zu verwenden. Dies ist ein minimales Beispiel, das ein Problem veranschaulicht, das ich beim Versuch, ziemlich einfache Aussagen zu beweisen, festgestellt habe.Beweise über Funktionen, die von der Reihenfolge ihrer Alternativen abhängen
Betrachten wir eine Gesamtfunktion test
haben: es
total test : Integer -> Integer
test 1 = 1
test n = n
Natürlich sehen wir, dass die Funktion test n = n
vereinfacht werden könnten, aber wir beweisen. Ich werde einfach über alle Fälle:
total lemma_test : (n : Integer) -> test n = n
lemma_test 1 = Refl
lemma_test n = Refl
Aber diese typüberprüft nicht:
Type mismatch between
n = n (Type of Refl) and
test n = n (Expected type)
Specifically:
Type mismatch between
n
and
test n
Also, das Problem zu sein scheint, dass Idris nicht für den zweiten Fall von lemma_test
ableiten kann dass n
ungleich 1
ist und dass auch der zweite Fall von test
angewendet werden muss.
Wir können natürlich versuchen, ausdrücklich die Fälle ALL, aufzuzählen, die mühsam sein kann, oder unmöglich machen, wie im Fall für Integer
s:
total lemma_test : (n : Integer) -> test n = n
lemma_test 1 = Refl
lemma_test 2 = Refl
lemma_test 3 = Refl
...
Gibt es eine Möglichkeit Aussagen wie dies zu beweisen für Funktionen, die nicht über eine endliche Menge von Datenkonstruktoren definiert sind, sondern stattdessen davon abhängen, dass die Mustererkennung von oben nach unten funktioniert, wie in diesem Beispiel test
?
Vielleicht gibt es eine ziemlich einfache Lösung, die ich einfach nicht sehe, wenn man bedenkt, dass Funktionen wie diese recht häufig auftreten.
Die Information, dass es nicht möglich oder zumindest schwierig ist, etwas über "Standard" -Muster-Übereinstimmungen zu beweisen, ist sehr hilfreich für mich, danke. Ich denke/hoffe, dass ich meine spezifischen Probleme anpassen kann, um entscheidbare Gleichheit zu verwenden, wie Sie vorgeschlagen haben. –