使用重写来实现我自己的平等?

时间:2016-03-24 14:17:08

标签: idris

我有以下相等的定义:

data Equal : x -> y -> Type where
    Reflexive : Equal a a

每当我想使用rewrite语法时,我需要(a = b)类型的东西,所以我创建了:

makeEquitable : Equal x y -> x = y
makeEquitable Reflexive = Refl

现在我可以makeEquitable (_ : Equal a b)然后我可以使用rewrite件事。我想简化这一点,然后我调查了replace,我并不理解replace : (x = y) -> P x -> P y。这个P的东西是我假设的内置Idris属性 - 我将如何为我自己的定义Equality创建这样的函数 - 是否也可以" bake-in"一些特别的东西,以便rewrite神奇地适用于Equal a b

1 个答案:

答案 0 :(得分:3)

如果在repl中设置:set showimplicits,则会看到:t replace的隐式参数:

replace : {a : Type} -> {x : a} -> {y : a} -> {P : a -> Type} ->
          ((=) {A = a} {B = a} x y) -> P x -> P y

P没有什么特别之处,它只是一个隐含的参数:一个谓词P,它保留了a类型的值。可以推断出大多数类型的隐式参数,因此您的函数可能如下所示:

replaceEqual : {P : a -> Type} -> Equal x y -> P x -> P y
replaceEqual Reflexive prf = prf

但就我所知,你不能轻易制作自己的rewrite。但是,您可以使用语法规则来美化您的方法:

syntax eqrewrite [a] "in" [b] = rewrite makeEquitable a in b;

plus_commutes_Z' : Equal m (plus m 0)
plus_commutes_Z' {m = Z} = Reflexive
plus_commutes_Z' {m = (S k)} =
  let rec = plus_commutes_Z' {m=k}
  in eqrewrite rec in Reflexive