Ich habe etwas ähnlich einem Strom geschrieben. Ich bin in der Lage jedes Funktors Gesetz zu beweisen, aber ich kann nicht einen Weg finden, um zu beweisen, dass es total:Beweis der Funktorgesetze des Stromes
module Stream
import Classes.Verified
%default total
codata MyStream a = MkStream a (MyStream a)
mapStream : (a -> b) -> MyStream a -> MyStream b
mapStream f (MkStream a s) = MkStream (f a) (mapStream f s)
streamFunctorComposition : (s : MyStream a) -> (f : a -> b) -> (g : b -> c) -> mapStream (\x => g (f x)) s = mapStream g (mapStream f s)
streamFunctorComposition (MkStream x y) f g =
let inductiveHypothesis = streamFunctorComposition y f g
in ?streamFunctorCompositionStepCase
---------- Proofs ----------
streamFunctorCompositionStepCase = proof
intros
rewrite inductiveHypothesis
trivial
Gibt:
*Stream> :total streamFunctorComposition
Stream.streamFunctorComposition is possibly not total due to recursive path:
Stream.streamFunctorComposition, Stream.streamFunctorComposition
Gibt es einen Trick, um die Funktors Gesetze über CODATA zu beweisen, die übergibt auch die Totalitätsprüfung?
In gewissem Sinne ist es etwas seltsam, nach Codata zu fragen. Funktionen, die mit Codata arbeiten, sind bei der Totalitätsprüfung erforderlich, um ihren Verbrauch auf gewisse Weise zu begrenzen. Dadurch wird verhindert, dass Sie jemals den Gleichheitszeugen tatsächlich berechnen können - er befindet sich am Ende einer potenziell unendlichen Schleife. Ihre Äquivalenzbeziehung umgeht das Problem sauber, indem sie Ströme äquivalent deklariert, wenn alle ihre Anfangssegmente äquivalent sind. – dfeuer