在我的其他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
请解释。
答案 0 :(得分:1)
如果您有两个值u : c
和v : c
以及一个函数f : c -> d
,那么如果您知道u = v
,则必须遵循f u = f v
仅仅依据参考透明度。
cong
是上述陈述的证明。
在此特定用例中,您设置(通过统一)c
和d
至List a
,u
至xs
,{{1} } v
和ys
f
,因为您要证明(:) x
。