我有以下相等的定义:
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
?
答案 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