我试图将Coq用于一些简单的哲学谓词逻辑。例如,假设我想表达声明"如果存在是人类,那么它就不是完美的"在Coq。我首先要确定术语“正在”,“人类”和“完美”这些术语的含义。是。看来,自然的方法是将第一个定义为类型,将其他方法定义为该类型的一元谓词。
Inductive being : Type :=
| b : nat -> being.
Inductive human : being -> Prop :=
| h : forall ( b : being ), human b.
Inductive perfect : being -> Prop :=
| p : forall ( b : being ), perfect b.
(being
用数字编制索引以确保存在多个不同的存在。)
使用此定义,语句可以表示为
Lemma humans_are_imperfect :
forall ( b : being ), human b -> ~ perfect b.
Admitted.
这种方法的问题在于它允许无意义的证明,例如
Lemma humans_are_perfect :
forall ( b : being ), human b -> perfect b.
intros b H. apply ( p b ). Qed.
显然,human
和perfect
的定义存在问题,因为它毫不含糊地接受任何being
并断言其人性和完美。我们需要的是human
和perfect
的定义,它只指定了他们的类型,同时对于它们适用的being
仍然含糊不清。
如果将perfect
的真实条件纳入其定义中,例如,可以完全避免这个问题。构造函数只将非人being
作为参数。但是,在哲学论证中,提供所有预先提供的信息并不总是可行的。通常,您必须将某种类型或谓词作为给定的内容,并使用更多前提慢慢构建其详细信息。
我有一种感觉,我尝试做的事情并不适合Coq的归纳基础。也许我最好学习像Prolog这样的逻辑编程语言,但希望我错了。
答案 0 :(得分:3)
您可以使用高阶谓词逻辑在Coq中完美表达您想要做的事情,而无需归纳定义。您可以通过假设存在类型being
,谓词human
和perfect
以及与之相关的推理规则来处理您的定理。
Section SomePhilosophy.
Variable being : Type.
Variable human perfect : being -> Prop.
Hypothesis human_not_perfect : forall b, human b -> ~ perfect b.
(* ... some theorems about the above notions ... *)
End SomePhilosophy.
关闭该部分后,您的所有定义将成为满足您的假设的being
,human
和perfect
选项的参数化。在您的原始方法中,您通过预先修正being
的内容来约束您的理论,因为您给出了它的定义。在这里,being
可以做任何事情。