列出唯一性谓词可判定性

时间:2017-12-12 20:09:11

标签: coq

我想在Coq中为列表唯一性及其可判定性函数定义谓词。我的第一次尝试是:

Section UNIQUE.
  Variable A : Type.
  Variable P : A -> Prop.
  Variable PDec : forall (x : A), {P x} + {~ P x}.


  Definition Unique (xs : list A) := exists! x, In x xs /\ P x.

我刚刚指定谓词Unique xs将保留,如果列表x中只有一个值xsP x成立。现在,问题来了。当我试图定义其Unique可判定性时:

  Definition Unique_dec : forall xs, {Unique xs} + {~ Unique xs}.
    induction xs ; unfold Unique in *.
    +
      right ; intro ; unfold unique in * ; simpl in * ; crush.
    +
      destruct IHxs ; destruct (PDec a).
      destruct e as [y [Hiy HPy]].
  ...

我收到以下令人讨厌的错误消息:

Error: Case analysis on sort Set is not allowed for inductive definition ex.

我搜索了这条消息,并在不同的背景下看到了几个类似的问题。至少在我看来,这样的问题似乎与Coq模式匹配的一些限制有关,对吧?

现在问题已经解决了,我的问题是:

1)我想要的是根据可判定的谓词定义唯一性测试的可判定性。在标准库中,存在类似于存在和通用量词的测试。两者都可以定义为归纳谓词。有没有办法定义"存在独特的"作为列表中的归纳谓词?

2)有可能定义这样的谓词以使其与存在唯一的标准逻辑含义相匹配吗?喜欢存在! x,P x =存在x,P x / \ forall y,P y - > x = y?

2 个答案:

答案 0 :(得分:3)

您遇到的问题是,您无法对exexistsexists!的基础归纳)进行模式匹配,以便生成sumbool类型的值({_} + {_}表示法的类型),它是一个Type而不是Prop。“讨厌的错误消息”对于解决这个问题并不十分有用;有关建议的修复,请参阅this bug report

为了避免这个问题,我认为你应该证明一个更强大的Unique版本可以在Type(a sig)而不是Prop中产生一些东西:

Definition Unique (xs : list A) := exists! x, In x xs /\ P x.
Definition UniqueT (xs : list A) := {x | unique (fun x => In x xs /\ P x) x}.

Theorem UniqueT_to_Unique : forall xs,
    UniqueT xs -> Unique xs.
Proof.
  unfold UniqueT, Unique; intros.
  destruct X as [x H].
  exists x; eauto.
Qed.

然后,您可以在类型中证明此定义的可判定性,并从那里证明您的原始陈述,如果您愿意:

Definition UniqueT_dec : forall xs, UniqueT xs + (UniqueT xs -> False).

正如安东的回答所提到的,这个证明需要A的可判定的相等,同样在类型中,即forall (x y:A), {x=y} + {x<>y}

答案 1 :(得分:1)

我只提供部分答案(评论太大了)。

如果我们采用允许多个副本的唯一性定义(如Arthur所述),那么Unique_dec意味着类型A的相等性可判定性(如@ejgallego所述)。

假设我们有

Unique_dec
     : forall (A : Type) (P : A -> Prop),
       (forall x : A, {P x} + {~ P x}) ->
       forall xs : list A, {Unique P xs} + {~ Unique P xs}

我们可以显示以下内容:

Lemma dec_eq A (a b : A) : a = b \/ a <> b.
Proof.
  pose proof (Unique_dec (fun (_ : A) => True) (fun _ => left I) [a;b]) as U.
  unfold Unique in U; destruct U as [u | nu].
  - destruct u as (x & [I _] & U).
    destruct I as [<- | [<- | contra]];
      [specialize (U b) | specialize (U a) |]; firstorder.
  - right; intros ->; apply nu; firstorder.
Qed.