TL; DR: Я хотел бы привести один или два примера использования cong
в REPL Idris, чтобы помочь мне лучше понять его.
Общий тип равенства определен концептуальновот так:
data (=) : a -> b -> Type where
Refl : x = x
Когда я впервые столкнулся с этим, я был очень смущен синтаксисом.(Я продолжал думать о =
как о операторе, а не как о типе.) Но игра с ним в REPL помогла мне понять.Например, мы можем объявить типы для представления ложных равенств:
λ> 2 + 2 = 5
4 = 5 : Type
λ> 2 = "wombat"
2 = "wombat" : Type
Однако единственным конструктором для =
является Refl, и мы можем использовать его только тогда, когда два аргумента равны.
λΠ> the (4 = 4) Refl
Refl : 4 = 4
λΠ> the (4 = 5) Refl
... type mismatch
Так что теперь я пытаюсь понять cong
, экспериментируя с ним в REPL.Функция cong
доказывает, что, если два значения равны, применение функции к ним дает равный результат.Я нашел определение.
cong : {f : t -> u} -> (a = b) -> f a = f b
cong Refl = Refl
Так, например, если я определю ...
λ> :let twoEqTwo = the (2 = 2) Refl
defined
... тогда я ожидал, что смогу показать, что добавление 1 к обоимстороны приводят к другому равенству.
λΠ> :let ty = (S 2 = S 2)
defined
λΠ> the ty (cong twoEqTwo)
...type mismatch
Может кто-нибудь показать мне пример или два использования cong
в REPL?