流的仿函数定律的证明

Bri*_*nna 6 verification idris coinduction

我一直在写类似Stream的东西.我能够证明每个算子法,但我无法找到证明它总数的方法:

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
Run Code Online (Sandbox Code Playgroud)

得到:

*Stream> :total streamFunctorComposition
Stream.streamFunctorComposition is possibly not total due to recursive path:
    Stream.streamFunctorComposition, Stream.streamFunctorComposition
Run Code Online (Sandbox Code Playgroud)

是否有一个技巧来证明有关codata的仿函数法则也通过整体检查器?

Bri*_*nna 7

我能够从Daniel Peebles(copumpkin)那里得到一些关于IRC的帮助,他解释说,能够使用命题平等而不是通常允许的东西.他指出可以定义自定义等价关系,就像Agda如何为Data.Stream定义一样:

data _?_ {A} : Stream A ? Stream A ? Set where
  _?_ : ? {x y xs ys}
        (x? : x ? y) (xs? : ? (? xs ? ? ys)) ? x ? xs ? y ? ys
Run Code Online (Sandbox Code Playgroud)

我能够直接将这个定义翻译成伊德里斯:

module MyStream

%default total

codata MyStream a = MkStream a (MyStream a)

infixl 9 =#=

data (=#=) : MyStream a -> MyStream a -> Type where
  (::) : a = b -> Inf (as =#= bs) -> MkStream a as =#= MkStream b bs

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 =
  Refl :: streamFunctorComposition y f g
Run Code Online (Sandbox Code Playgroud)

这很容易通过整体检查,因为我们现在正在进行简单的共同诱导.

这个事实有点令人失望,因为它似乎意味着我们无法VerifiedFunctor为我们的流类型定义一个.

丹尼尔还指出,观察类型理论确实允许命题平等超过密码,这是值得研究的东西.

  • 他们所处的"已验证"课程对于很多事情都太挑剔了.例如,最有趣的半群(尝试,可融合的堆,指树等)不能成为`VerifiedSemigroup`的实例,对于最有趣的`Applicative`和`Monad`实例也是如此.确实,人们会期望从"Functor"获得更好的结果,但即便如此,事情并没有真正发挥得那么好,因为没有扩展的平等. (2认同)