Проблемы с эквивалентными доказательствами и разрешением интерфейса в Idris

Я пытаюсь смоделировать доказательства эквациональных рассуждений в стиле Агды для сетоидов (типов с отношением эквивалентности). Моя установка выглядит следующим образом:

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 интерфейс.

Все идет нормально. Но когда я пытаюсь использовать такие комбинаторы, я сталкиваюсь с проблемами, которые, я считаю, связаны с разрешением интерфейса. Поскольку код является частью библиотеки матриц, над которой я работаю, я опубликовал соответствующую часть в следующем разделе.

Ошибка возникает в следующем доказательстве

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)

По крайней мере, мне кажется, что эта ошибка связана с разрешением интерфейса, которое плохо взаимодействует с расширениями синтаксиса.

Мой опыт показывает, что такие странные ошибки могут быть решены путем явной передачи неявных параметров. Проблема в том, что такое решение убьет "читабельность" доказательств комбинатора эквационального мышления.

Есть ли способ решить это? Соответствующая часть для воспроизведения этой ошибки доступна в ранее связанной суть.

0 ответов

Другие вопросы по тегам