COQ定义咖喱霍华德(A - > B - > C) - > (B - > A - > C)使用集合

时间:2013-11-12 17:16:28

标签: coq curry-howard

我一直盯着这脸几个小时不理解:(

我需要使用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“。”

在阅读了我能找到的所有内容后,真的很难理解这一点。

请有人解释一下:(

1 个答案:

答案 0 :(得分:1)

嗯,我想你不知道如何正确阅读这些类型。

c01的类型为(A -> B -> C) -> (B -> A -> C)。这意味着它是一个函数,它将函数作为参数并返回一个函数。

它需要“带有两个参数的函数”(我的意思是 Haskell 意义上的“带有两个参数的函数”,而不是Scala或Java意义上的)类型为AB的类型,返回C类型的值。

它必须返回一个带有两个参数的函数,类型为AB但是以其他顺序),它返回类型{{1}的值}。

那么这个函数C必须做什么?

它必须接受一个函数,并将其转换为相同的函数,其参数的顺序相反。

所以:

c01

或等效(只需添加一些括号以使其更清晰):

fun f => fun b => fun a => f a b