定义谓词而不在Coq中指定其真实条件

时间:2014-10-25 22:21:03

标签: predicate coq

我试图将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.

显然,humanperfect的定义存在问题,因为它毫不含糊地接受任何being并断言其人性和完美。我们需要的是humanperfect的定义,它只指定了他们的类型,同时对于它们适用的being仍然含糊不清。

如果将perfect的真实条件纳入其定义中,例如,可以完全避免这个问题。构造函数只将非人being作为参数。但是,在哲学论证中,提供所有预先提供的信息并不总是可行的。通常,您必须将某种类型或谓词作为给定的内容,并使用更多前提慢慢构建其详细信息。

我有一种感觉,我尝试做的事情并不适合Coq的归纳基础。也许我最好学习像Prolog这样的逻辑编程语言,但希望我错了。

1 个答案:

答案 0 :(得分:3)

您可以使用高阶谓词逻辑在Coq中完美表达您想要做的事情,而无需归纳定义。您可以通过假设存在类型being,谓词humanperfect以及与之相关的推理规则来处理您的定理。

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.

关闭该部分后,您的所有定义将成为满足您的假设的beinghumanperfect选项的参数化。在您的原始方法中,您通过预先修正being 的内容来约束您的理论,因为您给出了它的定义。在这里,being可以做任何事情。