伊德里斯的等式证明和界面解决问题

时间:2017-01-15 19:18:50

标签: dependent-type idris equational-reasoning

我正在尝试为Setoids建模Agda风格的等式推理证明(具有等价关系的类型)。我的设置如下:

infix 1 :=:

interface Equality a where
  (:=:)  : a -> a -> Type

interface Equality a => VerifiedEquality a where  
  eqRefl : {x : a} -> x :=: x
  eqSym  : {x, y : a} -> x :=: y -> y :=: x
  eqTran : {x, y, z : a} -> x :=: y -> y :=: z -> x :=: z

使用这样的接口我可以模拟一些等式推理组合器 来自伊德里斯图书馆的Syntax.PreorderReasoning

syntax [expr] "QED" = qed expr 
syntax [from] "={" [prf] "}=" [to] = step from prf to

namespace EqReasoning
  using (a : Type, x : a, y : a, z : a)
    qed : VerifiedEquality a => (x : a) -> x :=: x
    qed x = eqRefl {x = x}

    step : VerifiedEquality a => (x : a) -> x :=: y -> (y :=: z) -> x :=: z
    step x prf prf1 = eqTran {x = x} prf prf1

与Idris库的主要区别仅在于使用VerifiedEquality接口中的那些替换命题相等及其相关函数。

到目前为止,这么好。但是当我尝试使用这样的组合器时,我遇到了一些问题,我认为这些问题与接口解析有关。由于代码是我正在处理的矩阵库的一部分,因此我在以下gist中发布了相关部分。

以下证明中出现错误

zeroMatAddRight : ( VerifiedSemiring s
                  , VerifiedEquality s ) =>
                  {r, c : Shape} ->
                  (m : M s r c)  -> 
                  (m :+: (zeroMat r c)) :=: m
zeroMatAddRight {r = r}{c = c} m 
    = m :+: (zeroMat r c)
         ={ addMatComm {r = r}{c = c} m (zeroMat r c) }=
      (zeroMat r c) :+: m
         ={ zeroMatAddLeft {r = r}{c = c} m }=
      m
      QED  

返回以下错误消息:

 When checking right hand side of zeroMatAddRight with expected type
         m :+: (zeroMat r c) :=: m

 Can't find implementation for Semiring a

 Possible cause:
         ./Data/Matrix/Operations/Addition.idr:112:11-118:1:When checking an application of function Algebra.Equality.EqReasoning.step:
                 Type mismatch between
                         m :=: m (Type of qed m)
                 and
                         y :=: z (Expected type)

至少对我来说,这个错误似乎与界面解析无关,而且与语法扩展无法很好地交互。

我的经验是,可以通过显式传递隐式参数来解决这些奇怪的错误。问题是这种解决方案会破坏等式推理组合证明的“可读性”。

有没有办法解决这个问题?重现此错误的相关部分可在先前链接的gist中找到。

0 个答案:

没有答案