下一个类型如何实现OCaml函数?
How to implement OCaml function with the next type?
我正在研究库里-霍华德对应关系。
给定命题逻辑语句:¬(p ∨ q) -> (¬p ∧ ¬q)
.
我需要在 OCaml 中定义一个类型(作为命题)和一个函数(作为证明)。
我定义了类型但不知道如何实现功能:
type empty = |
type ('a , 'b) coprod = Left of 'a | Right of 'b
let ex513: (('p, 'q) coprod -> empty) -> ('p -> empty) * ('q -> empty) = fun ?
我在发布问题之前做了什么:
- I have verified 这个陈述在直觉逻辑中是可证明的。
- 试图建设性地理解:如果有
function1
将p的证明或q的证明转换为⊥那么我们可以构造元组(function2
将p的证明转换为⊥,function3
将 q 的证明转换为 ⊥)。实施 (function1(p), function1(q))
- 执行了类似的任务以更好地理解问题:
p ∨ q -> ¬(¬p ∧ ¬q)
。
代码:
let func1: ('p, 'q) coprod -> ('p-> empty) * ('q-> empty) -> empty = fun x (f, g)->
match x with
| Left x -> f(x)
| Right x -> g(x)
正在定义
type 'a not = 'a -> empty
为了简洁起见,
写一个函数确实是个好主意
let left_branch: type p q. (p,q) coprod not -> p not = ...
和
let right_branch: type p q. (p,q) coprod not -> q not = ...
一旦你定义了两个函数(换句话说证明了相应的引理),解决方案可以通过应用两个引理得到:
let de_morgan_law: type p q. (p,q) coprod not -> p not * q not =
fun not_p_or_q -> left_branch not_p_or_q, right_branch not_p_or_q
如果您在编写 left_branch
(或正确的函数)时遇到困难,请记住
let left x = Left x
类型为 'a -> ('a,'any) coprod
.
我正在研究库里-霍华德对应关系。
给定命题逻辑语句:¬(p ∨ q) -> (¬p ∧ ¬q)
.
我需要在 OCaml 中定义一个类型(作为命题)和一个函数(作为证明)。
我定义了类型但不知道如何实现功能:
type empty = |
type ('a , 'b) coprod = Left of 'a | Right of 'b
let ex513: (('p, 'q) coprod -> empty) -> ('p -> empty) * ('q -> empty) = fun ?
我在发布问题之前做了什么:
- I have verified 这个陈述在直觉逻辑中是可证明的。
- 试图建设性地理解:如果有
function1
将p的证明或q的证明转换为⊥那么我们可以构造元组(function2
将p的证明转换为⊥,function3
将 q 的证明转换为 ⊥)。实施(function1(p), function1(q))
- 执行了类似的任务以更好地理解问题:
p ∨ q -> ¬(¬p ∧ ¬q)
。
代码:
let func1: ('p, 'q) coprod -> ('p-> empty) * ('q-> empty) -> empty = fun x (f, g)->
match x with
| Left x -> f(x)
| Right x -> g(x)
正在定义
type 'a not = 'a -> empty
为了简洁起见, 写一个函数确实是个好主意
let left_branch: type p q. (p,q) coprod not -> p not = ...
和
let right_branch: type p q. (p,q) coprod not -> q not = ...
一旦你定义了两个函数(换句话说证明了相应的引理),解决方案可以通过应用两个引理得到:
let de_morgan_law: type p q. (p,q) coprod not -> p not * q not =
fun not_p_or_q -> left_branch not_p_or_q, right_branch not_p_or_q
如果您在编写 left_branch
(或正确的函数)时遇到困难,请记住
let left x = Left x
类型为 'a -> ('a,'any) coprod
.