在Idris REPL中进行cong实验

时间:2019-05-05 20:57:21

标签: proof idris

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的一个或两个示例吗?

1 个答案:

答案 0 :(得分:2)

2的类型错误。他们在Integer中默认使用twoEqTwo类型,因为它们没有其他约束。请参见不受约束的2

idris> 2
2 : Integer

但是,在ty中,您说的是S 2S迫使整个事情在Nat中起作用:

idris> S 2
3 : Nat

也使twoEqTwoNat中工作:

idris> :let twoEqTwo = the (the Nat 2 = 2) Refl
idris> the (S 2 = S 2) twoEqTwo
Refl : 3 = 3

请注意,如果让类型推断看到整个表达式,它可以对其进行分类:

idris> the (S 2 = S 2) (cong (the (2 = 2) Refl))
Refl : 3 = 3