归纳Coq定义中存在性和通用量词之间的关系

时间:2016-11-08 09:00:20

标签: coq theorem-proving

假设我想要一个子串的归纳定义(字符串只是列表的同义词)。

Inductive substring {A : Set} (w : string A) :
                    (string A) -> Prop :=
  | SS_substr : forall x y z : string A,
                  x ++ y ++ z = w ->
                  substring w y.

我可以在这里证明以下内容:

Theorem test : substring [3;4;1] [4].
Proof.
  eapply SS_substr.
  cbn.
  instantiate (1:=[1]).
  instantiate (1:=[3]).
  reflexivity.
Qed.

然而,证据是"存在的"尽管归纳定义表明forall x y z并且仅限制它们的形状,而不是"通用"这对我来说似乎有点不直观。是什么给了什么?

此外,是否可以使用exists x : string A, exists y : string A, exists z : string, x ++ y ++ z = w -> substring w y生成归纳定义?

1 个答案:

答案 0 :(得分:2)

需要注意的一件重要事情是exists不是Coq的内置功能(与forall相反)。实际上,exists本身就是一种符号,但后面有一个名为ex的归纳类型。符号和归纳类型在Coq standard library中定义。以下是ex

的定义
Inductive ex (A:Type) (P:A -> Prop) : Prop :=
    ex_intro : forall x:A, P x -> ex (A:=A) P.

它是使用一个构造函数和通用量化定义的,就像你的substring类型一样,所以你的susbtring类型似乎是"存在的"并不奇怪。在某些时候。

当然,您可以使用exists定义类型,甚至不需要Inductive

Definition substring' {A : Set} (w y : string A) : Prop :=
    exists x z, x ++ y ++ z = w.