以下Idris证明没有进行类型检查。
hts : (s : Stream a) -> (head s :: tail s = s)
hts (x::xs) = Refl
我得到的错误是:
Type mismatch between
x :: Delay xs = x :: Delay xs
and
x :: Delay (tail (x :: Delay xs)) = x :: Delay xs
非空Vect
类型的类似证明就好了:
import Data.Vect
htv : (s : Vect (S k) a) -> (head s :: tail s = s)
htv (x::xs) = Refl
所以我猜这个问题出现在Stream
的懒惰中。
我的工作理论是,Idris不喜欢简化Delay
内部的任何内容,因为它可能会以这种方式进入无限循环。但是,我想强迫伊德里斯无论如何都倾向于脚趾,因为Prelude.Stream.tail
的定义保证LHS会减少到x :: Delay xs
,从而完成我的证明。
我的怀疑是否正确?我能以某种方式修复证据吗?
答案 0 :(得分:2)
是的,可以做到。我使用了辅助同余引理:
%default total
consCong : {xs, ys : Stream a} -> (x : a) -> xs = ys -> x :: xs = x :: ys
consCong _ Refl = Refl
证明主要引理:
hts : (s : Stream a) -> (head s :: tail s = s)
hts (x :: xs) = consCong _ $ Refl