列出平等w /`cong`

时间:2016-05-07 00:54:17

标签: equality idris referential-transparency

在我的其他question之后,我尝试在Type-Driven Development with Idris中为same_cons实施实际练习来证明,给定两个相同的列表,在每个列表前面添加相同的元素会导致两个平等名单。

示例:

prove that 1 :: [1,2,3] == 1 :: [1,2,3]

所以我提出了以下编译代码:

sameS : {xs : List a} -> {ys : List a} -> (x: a) -> xs = ys -> x :: xs = x :: ys
sameS {xs} {ys} x prf = cong prf

same_cons : {xs : List a} -> {ys : List a} -> xs = ys -> x :: xs = x :: ys
same_cons prf = sameS _ prf

我可以通过以下方式致电:

> same_cons {x=5} {xs = [1,2,3]} {ys = [1,2,3]} Refl
Refl : [5, 1, 2, 3] = [5, 1, 2, 3]

关于cong函数,我的理解是它需要一个证明,即a = b,但我不理解它的第二个参数:f a

> :t cong
cong : (a = b) -> f a = f b

请解释。

1 个答案:

答案 0 :(得分:1)

如果您有两个值u : cv : c以及一个函数f : c -> d,那么如果您知道u = v,则必须遵循f u = f v仅仅依据参考透明度。

cong是上述陈述的证明。

在此特定用例中,您设置(通过统一)cdList auxs,{{1} } vys f,因为您要证明(:) x