COQ定义咖喱霍华德(A->;B->;C)>;(B->;A->;C)使用集合
我盯着这张脸看了好几个小时不明白:( 我需要用coq解一些定义,我应该通过Curry-Howard同构来解。我已经读过了,但仍然不知道我在做什么。我看过其他的例子,并尝试用这些方法来解,但我总是会出错 例如,这里我需要定义: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
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)