如果两件事不相等,他们是否相等?

时间:2016-02-20 20:01:30

标签: types proof agda dependent-type

如果Agda中的两个值或某些其他依赖类型的语言,您可以证明db.collection.aggregate([ { $group: { _id: { id: "$id" }, uniqueIds: { $addToSet: "$_id" }, count: { $sum: 1 } } }, { $match: { count: { $gte: 2 } } }, { $sort : { count : -1} }, { $limit : 10 } ], { allowDiskUse : true }); 不等于v₁,您是否可以证明v₂等于v₁

喜欢,是否有v₂类型的函数?

如果无法证明,这似乎可以安全地添加为公理,因为最多只能有((v₁ ≡ v₂ → ⊥) → ⊥) → v₁ ≡ v₂的一个值。

这个有趣的原因是双重否定(v₁ ≡ v₂)形成。通常你不能从中提取值,但你可以从中获取某些值,如(a → ⊥) → ⊥(如果你在经典逻辑monad中得到一个矛盾,你就会有矛盾)。我想知道平等是否可以被提取出来。

2 个答案:

答案 0 :(得分:6)

我认为法律在Agda或Coq中无法证明。

粗略地说,我们只有一个假设

(v1 = v2 -> False) -> False

我们需要证明论文v1 = v2

在基于后续的证明系统中考虑一个无切口的证明。最后一条规则是什么?

它不能是v1 = v2的介绍,因为Refl没有那种类型(v1,v2是不同的变量)。

所以,它必须是对假设的消除,即

H1: (v1 = v2 -> False) -> False |- v1 = v2 -> False
H2: (v1 = v2 -> False) -> False , False |- v1 = v2
---------------------------------------------------  (->E)
(v1 = v2 -> False) -> False |- v1 = v2

但是,如果H1确实可以证明,我们也必须

(v1 = v2 -> False) -> False |- False

我们从中得出

|- ((v1 = v2 -> False) -> False) -> False

相当于

|- v1 = v2 -> False

如果没有v1,v2的任何其他假设,这显然是不可证明的。实际上,否则我们可以将其概括为

|- forall v1 v2, v1 = v2 -> False

这显然是错误的。

另一方面,我认为Agda / Coq / ...符合排除中的法则,这意味着拟议的法律。因此,法律不能违反一致性。

答案 1 :(得分:6)

双重否定消除在直觉主义类型理论中是无法证明的,正如chi所示,但它的否定也是无法证明的,所以它可以被认为是一致的。

然而,虽然经典公理不适用于所有类型,但它们可以证明是可判定的类型。可判定类型是可证明有人居住或无人居住的类型:

Decidable : Type -> Type
Decidable A = Either A (A -> False)

鉴于Decidable A,可以在A上实现双重否定消除:只需Either A (A -> False)上的模式匹配,如果我们得到A,那么我们就完成了,如果我们得到A -> False,那么我们应用(A -> False) -> False并使用ex falso。

如果是((a = b -> False) -> False) -> a = b,我可以证明(a b : A) -> Decidable (a = b)是一个特殊情况。即A具有可判定的平等性。

对于(A -> False) -> False延续monad,当我们在这个monad中工作时,我们得到某种形式的经典推理,因为monadic join在这里对应于“quadruple”否定消除,所以not (not (not (not A))) -> not (not A))。我们还可以使用callCC,它对应于另一个经典陈述Peirce's law

有一个有趣的观察:我们可以采取任何经典证明,将所有命题提升到Cont False(换句话说,双重否定它们),我们得到相应的建设性证明,证明了对它的双重否定。原始命题。这意味着建构性逻辑可以证明经典逻辑可以模仿经典逻辑等价,因为命题及其双重否定在经典上是等价的。