Tôi đã viết một nội dung tương tự như Luồng. Tôi có thể chứng minh mỗi luật functor nhưng tôi không thể tìm ra một cách để chứng minh rằng nó là tổng số:Bằng chứng về luật functor của luồng
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
Cung cấp:
*Stream> :total streamFunctorComposition
Stream.streamFunctorComposition is possibly not total due to recursive path:
Stream.streamFunctorComposition, Stream.streamFunctorComposition
Có một thủ thuật để chứng minh các định luật functor qua codata mà cũng vượt qua kiểm tra tổng thể?
Trong một nghĩa nào đó, đó là một điều kỳ lạ để hỏi về codata. Các chức năng hoạt động trên codata được yêu cầu, bằng cách kiểm tra toàn bộ, để hạn chế việc tiêu thụ chúng theo một cách nào đó. Điều này ngăn cản bạn không bao giờ có thể thực sự * tính toán * sự chứng kiến bình đẳng - nó ở phần cuối của vòng lặp vô hạn tiềm ẩn. Mối quan hệ tương đương của bạn gọn gàng ngăn cản vấn đề bằng cách xác định luồng tương đương nếu tất cả các phân đoạn ban đầu của chúng tương đương nhau. – dfeuer