Idris重写策略不能按预期工作

时间:2015-07-02 06:35:28

标签: proof idris

我有这个例子

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本身有可能存在错误吗?

1 个答案:

答案 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声明。