我一直盯着这脸几个小时不理解:(
我需要使用coq解决一些定义,我应该通过Curry Howard同构来做到这一点。我已经阅读了,但仍然不知道我在做什么。我已经看过其他的例子,并尝试用这些方法做,我总是得到错误。
例如,我需要在此定义:
Variables A B C : Set.
Definition c01 : (A -> B -> C) -> (B -> A -> C) :=
这是我的尝试:
fun g => fun p => g (snd p) (fst p).
end.
我也试过
fun f => fun b => fun a => f (b , a)
end.
最终它只是说它期待的类型与我给出的类型不同,有时它会说:“预计会有类型”?9 *?10“。”
在阅读了我能找到的所有内容后,真的很难理解这一点。
请有人解释一下:(
答案 0 :(得分:1)
嗯,我想你不知道如何正确阅读这些类型。
c01
的类型为(A -> B -> C) -> (B -> A -> C)
。这意味着它是一个函数,它将函数作为参数并返回一个函数。
它需要“带有两个参数的函数”(我的意思是 Haskell 意义上的“带有两个参数的函数”,而不是Scala或Java意义上的)类型为A
和B
的类型,返回C
类型的值。
它必须返回一个带有两个参数的函数,类型为A
和B
(但是以其他顺序),它返回类型{{1}的值}。
那么这个函数C
必须做什么?
它必须接受一个函数,并将其转换为相同的函数,其参数的顺序相反。
所以:
c01
或等效(只需添加一些括号以使其更清晰):
fun f => fun b => fun a => f a b