【发布时间】:2023-10-27 21:44:01
【问题描述】:
TL;DR:我想要一两个在 Idris REPL 中使用 cong 的示例,以帮助我更好地理解它。
泛型相等类型的概念定义如下:
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
所以现在我试图通过在 REPL 中进行实验来理解 cong。
函数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
谁能给我看一两个在 REPL 中使用 cong 的例子吗?
【问题讨论】: