Coq为Inductive类型生成消除组合器需要什么?

时间:2016-09-29 11:39:55

标签: coq

Coq的Finite_sets库有一个归纳类型,指定某些集合是有限的:

Inductive Finite : Ensemble U -> Prop :=
| Empty_is_finite : Finite (Empty_set U)
| Union_is_finite :
  forall A:Ensemble U,
    Finite A -> forall x:U, ~ In U A x -> Finite (Add U A x).

我试图证明有限集中的成员资格是可判定的如下:

Lemma Finite_dec (A:Type) : forall f:Ensemble A, Finite A f ->
  forall x:A, {In A f x} + {~In A f x}.
Proof.
intros.
induction H.

但是,Coq会产生以下错误消息:

Cannot find the elimination combinator Finite_rec, the
elimination of the inductive definition Finite on sort Set is
probably not allowed.

我的问题是,为什么Coq无法为有限生成消除组合子?为此可以采用什么样的感应式?

注意:我需要一个不同类型的消除组合子,它与有限类似,但不知道如何构造它。

2 个答案:

答案 0 :(得分:2)

正如@ejgallego指出的那样,一个问题是,你不能对命题的某些东西进行归纳,例如Finite,以获得诸如{P} + {~ P}之类的计算。然而,还有一个更深层次的问题:如果不假设某种形式的被排除的中间词,你的结果是不可证明的,因为它暗示所有类型都具有可判定的平等。

Goal (forall (A : Type) (f : Ensemble A),
        Finite A f -> forall x, In A f x \/ ~ In A f x) ->
     forall (A : Type) (x y : A), x = y \/ x <> y.
Proof.
intros fin_dec A x y.
assert (fin : Finite A (Add A (Empty_set A) x)).
{ apply Union_is_finite.
  - apply Empty_is_finite.
  - intros []. }
specialize (fin_dec _ _ fin y).
destruct fin_dec as [H | H].
- destruct H.
  + destruct H.
  + destruct H. now left.
- right.
  contradict H. rewrite H. right. constructor.
Qed.

如果你不想使用额外的公理,我建议你使用列表而不是整体库,并使用具有可判定的相等性的类型。

答案 1 :(得分:0)

在尝试了一些事情之后,我从其中一条错误消息中获得了一些灵感

Elimination of an inductive object of sort Prop
is not allowed on a predicate in sort Type
because proofs can be eliminated only to build proofs

这给了我尝试将返回类型从Prop更改为Type的灵感。在这种情况下,我能够进行归纳,并且以下证明是直截了当的。

Inductive Finite (U:Type) : Ensemble U -> Type :=
| Empty_is_finite : Finite U (Empty_set U)
| Union_is_finite :
  forall A:Ensemble U,
    Finite U A -> forall x:U, ~ In U A x -> Finite U (Add U A x).

Definition eq_dec (U:Type) : forall x y:U, {x=y} + {x<>y}.

Lemma Finite_dec (A:Type) : forall f:Ensemble A, Finite A f ->
  forall x:A, {In A f x} + {~In A f x}.
Proof.
intros.
induction X.

虽然我不完全理解其原因。