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无法为有限生成消除组合子?为此可以采用什么样的感应式?
注意:我需要一个不同类型的消除组合子,它与有限类似,但不知道如何构造它。
答案 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.
虽然我不完全理解其原因。