我有这个例子
o : Type
Hom : o -> o -> Type
Id : (a : o) -> Hom a a
Comp : Hom a b -> Hom b c -> Hom a c
IdRight : (f : Hom a b) -> Comp f (Id b) = f
IdLeft : (f : Hom a b) -> Comp (Id a) f = f
Assoc : (f : Hom a b) ->
(g : Hom b c) ->
(h : Hom c d) ->
Comp f (Comp g h) = Comp (Comp f g) h
EqId : (f : Hom a b) ->
(g : Hom b a) ->
(h : Hom b a) ->
Comp f g = Id a ->
Comp h f = Id b ->
g = h
EqId = ?EqIdProof
我尝试按此顺序使用策略来制作证据
1. intro a, b, f, g, h, fg, hf
2. rewrite IdLeft g
3. rewrite hf
4. rewrite Assoc h f g
所以四步实际上什么也没做。它也与sym
无关。我做错了什么? Idris本身有可能存在错误吗?
答案 0 :(得分:1)
您的文件仅包含类型声明。如果你想对此做任何事情,你需要填写一些身体定义。例如o : Type
,只是o
的类型声明,在您编写
o : Type
o = Bool
要使用重写,您需要提供a = b
形式的证明。更具体地说,您需要总函数,其返回类型是您想要的相等。 (例如类型:doc multCommutative
)。您在此文件中没有任何此类证明。你也没有任何可以证明的定理,因为你还没有完全定义任何东西。如果你在idris中加载它,它应该告诉你你有很多" metavariables"或者" hole",这意味着需要填写的部分代码。
看起来您打算定义数据类型,可能类似
data Hom : Type -> Type -> Type where
MkHom : (f : a -> b) -> Hom a b
Comp : Hom a b -> Hom b c -> Hom a c
如果您想通过引入新类型来扩展类型系统,那么您需要使用data
声明。