首先,看一下“Curry-Howard对应”,它指出计算机程序中的类型对应于直觉主义逻辑中的公式。 直觉主义逻辑就像您在学校里学习的“常规”逻辑,但没有排中律或双重否定消除法:
逻辑定律
DeMorgan定律是正确的,但首先我们将使用它们来推导出一些新的定律。 DeMorgan定律的相关版本如下:
- ∀x. P(x) = ¬∃x. ¬P(x)
- ∃x. P(x) = ¬∀x. ¬P(x)
我们可以推导出 (∀x. P ⇒ Q(x)) = P ⇒ (∀x. Q(x)):
- (∀x. P ⇒ Q(x))的意思是对于任何x,如果P成立,则Q(x)也成立。
- (∀x. ¬P ∨ Q(x))的意思是对于任何x,如果P不成立,则Q(x)成立。
- ¬P ∨ (∀x. Q(x))的意思是如果P不成立,则对于任何x,Q(x)都成立;或者P成立。
- P ⇒ (∀x. Q(x))的意思是如果P成立,则对于任何x,Q(x)都成立。
而且(∀x. Q(x) ⇒ P) = (∃x. Q(x)) ⇒ P (下面会用到):
- (∀x. Q(x) ⇒ P)的意思是对于任何x,如果Q(x)成立,则P也成立。
- (∀x. ¬Q(x) ∨ P)的意思是对于任何x,如果Q(x)不成立,则P成立。
- (¬¬∀x. ¬Q(x)) ∨ P的意思是对于任何x,如果Q(x)不成立,则P成立。
- (¬∃x. Q(x)) ∨ P的意思是如果不存在x使得Q(x)成立,则P成立。
- (∃x. Q(x)) ⇒ P的意思是如果存在x使得Q(x)成立,则P成立。
请注意,这些定理也适用于直觉主义逻辑。我们推导出的两个定理在下面的论文中被引用。
简单类型
最简单的类型很容易处理。例如:
data T = Con Int | Nil
构造函数和访问器具有以下类型签名:
Con :: Int -> T
Nil :: T
unCon :: T -> Int
unCon (Con x) = x
类型构造器
现在让我们来探讨类型构造器。看下面的数据定义:
data T a = Con a | Nil
这创建了两个构造函数。
Con :: a -> T a
Nil :: T a
当然,在Haskell中,类型变量是隐式地普遍量化的,所以这些实际上是:
Con :: ∀a. a -> T a
Nil :: ∀a. T a
访问器同样容易:
unCon :: ∀a. T a -> a
unCon (Con x) = x
量化类型
让我们在原始类型(第一个,没有类型构造函数的)中添加存在量词∃。不要在类型定义中引入它,因为那看起来不像逻辑,在构造函数/访问器定义中引入它,因为那看起来像逻辑。稍后我们将修复数据定义以匹配。
现在我们将使用∃x.t
代替Int
。在这里,t
是某种类型表达式。
Con :: (∃x. t) -> T
unCon :: T -> (∃x. t)
根据逻辑规则(上述第二条规则),我们可以重写
Con
的类型为:
Con :: ∀x. t -> T
当我们将存在量词移到外面(前奈斯范式),它变成了普遍量词。
因此,以下理论上是等价的:
data T = Con (exists x. t) | Nil
data T = forall x. Con t | Nil
除了Haskell中没有exists的语法外,非直觉逻辑可以从unCon的类型推导出以下内容。
unCon :: ∃ T -> t -- invalid!
这个不合法的原因是因为在直觉主义逻辑中不允许这样的转换。因此,无法在不使用
exists
关键字的情况下编写
unCon
的类型,并且无法将类型签名放在前尼可斯范式中。在这种情况下,很难制作一个保证终止的类型检查器,这就是为什么Haskell不支持任意存在量词的原因。
来源
“First-class Polymorphism with Type Inference”,Mark P.Jones,第24届ACM SIGPLAN-SIGACT编程语言基本原理研讨会论文集(web)
call/cc
具有CH对应关系。 - VitusCon :: (∃x. t) -> T
到Con :: ∀x. t -> T
的转换只是柯里化。 - copumpkinΣ[ n ∶ ℕ ] (n + 1 ≡ 2)
,证明由证人和证明证人满足命题组成,例如(1 , refl)
(可以将refl
理解为“根据定义”)。与依赖函数相比,它们编码普遍量化。类型为(n : ℕ) → n ≡ 0 + n
的函数将任意自然数转换为一个证明,证明n = 0 + n
。 - Vitus∀x. (Q(x) ⇒ P)
⇔∃x. Q(x) ⇒ P
。我会这样翻译它:对于所有的x:如果x是一只红色的猫,那么汉斯就会害怕。
⇔如果至少存在一只红色的猫,那么汉斯就会害怕。
所以Q(x) = x 是一只红色的猫?
而P = 汉斯害怕。
这让我明白了。不确定是否能帮到其他人。 - hasufell