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

COQ定义咖喱霍华德(A->;B->;C)>;(B->;A->;C)使用集合,coq,curry-howard,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

我盯着这张脸看了好几个小时不明白:(

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

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


请有人解释一下:(

好吧,我想你不知道如何正确阅读字体

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

它采用了
a
B
类型的“具有两个参数的函数”(我的意思是在“具有两个参数的函数”的Haskell意义上,而不是在Scala或Java意义上),它返回的值类型为
C

它必须返回一个带有两个参数的函数,类型分别为
a
B
(但顺序不同),返回类型为
C
的值

那么这个函数,
c01
必须做什么呢

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

因此:

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


嗯,我猜你不知道如何正确地阅读字体

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

它采用了
a
B
类型的“具有两个参数的函数”(我的意思是在“具有两个参数的函数”的Haskell意义上,而不是在Scala或Java意义上),它返回的值类型为
C

它必须返回一个带有两个参数的函数,类型分别为
a
B
(但顺序不同),返回类型为
C
的值

那么这个函数,
c01
必须做什么呢

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

因此:

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

非常感谢:),我终于明白了。^^非常感谢:),我终于明白了^^
fun f => fun b => fun a => f a b
fun f => (fun b => fun a => f a b)