sumbool和直觉析取之间的区别

时间:2018-07-11 14:33:33

标签: coq

根据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演算。

1 个答案:

答案 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};但是,如果使用此公理来编写程序,则将无法执行它们。

相关问题