根据Coq的文档
sumbool是一种布尔类型,具有其值的合理性
在Coq实现的直觉(或建设性)逻辑中,我认为那已经是析取的性质。
例如,要证明Coq中排除的中间p \/ ~p
,您必须做实际的工作,这不是逻辑公理。因此,p \/ q
的证明必须是p
的证明或q
的证明。
那我们为什么需要sumbool p q
?
编辑
通过用精确的证据替换策略,我得到了更具体的错误消息。这个很好:
Lemma sumbool_or : forall p q : Prop, sumbool p q -> p \/ q.
Proof.
exact (fun (p q : Prop) (H : sumbool p q) =>
match H with
| left p0 => or_introl p0
| right q0 => or_intror q0
end).
Qed.
但是这个
Lemma or_sumbool : forall p q : Prop, p \/ q -> sumbool p q.
Proof.
exact (fun (p q : Prop) (H : p \/ q) =>
match H with
| or_introl p0 => left p0
| or_intror q0 => right q0
end).
Qed.
告诉我
Error:
Incorrect elimination of "H" in the inductive type "or":
the return type has sort "Set" while it should be "Prop".
Elimination of an inductive object of sort Prop
is not allowed on a predicate in sort Set
because proofs can be eliminated only to build proofs.
我有点惊讶。因此,像match
这样的图元取决于我们要证明的事物吗?它看起来像是低级的lambda演算。
答案 0 :(得分:4)
sumbool
类型存在于Coq的计算相关的宇宙Type
(或Set
)中。特别是,我们可以使用返回{P} + {Q}
元素的函数编写程序(例如,标准库的Nat.eq_dec : forall n m : nat, {n = m} + {n <> m}
,该函数测试两个数字是否相等)。
另一方面,逻辑析取属于与计算无关的宇宙Prop
。我们无法对类型为P \/ Q
的证明进行案例分析,因为Coq旨在在提取程序时擦除证明,并且这种案例分析可能会改变计算结果。例如,这对我们来说很安全,可以添加排除的中间公理forall P : Prop, P \/ ~ P
,而不会影响提取程序的执行。
还可以添加一种强大的形式,以排除形式存在于Type
中的被排除的中间对象:forall P : Prop, {P} + {~P}
;但是,如果使用此公理来编写程序,则将无法执行它们。