如果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₂
)形成monad。通常你不能从中提取值,但你可以从中获取某些值,如(a → ⊥) → ⊥
(如果你在经典逻辑monad中得到一个矛盾,你就会有矛盾)。我想知道平等是否可以被提取出来。
答案 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
(换句话说,双重否定它们),我们得到相应的建设性证明,证明了对它的双重否定。原始命题。这意味着建构性逻辑可以证明经典逻辑可以模仿经典逻辑等价,因为命题及其双重否定在经典上是等价的。