リストの一意性とその決定性機能の述語を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.
が、私はちょうどP x
が成り立つxs
ように、リスト内の一つだけ値x
があるかどう述語Unique xs
が保持することを指定しています。今、問題が起こります。私は、次の厄介なエラーメッセージを持っている
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]].
...
:私はこのメッセージをGoogleで検索し、別のコンテキスト内のいくつかの同様の問題を見てきました
Error: Case analysis on sort Set is not allowed for inductive definition ex.
私はそのUnique
決定可能性を定義しようとしたとき。少なくとも私には、このような問題はCoqパターンマッチングに関するいくつかの制限に関連しているようです。
さて、問題は解決していることを、私の質問は:
1)私が欲しいのは、決定可能述語に基づいて一意性テストのための決定可能性を定義することです。標準ライブラリでは、存在量と普遍的な量指定子についても同様のテストが行われます。両方とも帰納的述語として定義できます。リストに帰納的述語として "一意に存在する"を定義する方法はありますか?
2)このような述語を定義することは、存在する固有の標準論理の意味に一致するように可能ですか?ありがとうございます! x、P x =存在するx、P x /¥for y、P y - > x = y?
私はあなたにも平等性の崩壊性を要求する必要があると思います!あなたの述語のビット。実際には、私は 'In'を避け、math-compの' seq'ライブラリを使います。ここで、 'Fixpoint uniq s:= sがx :: sならば(x \ notin s ')&& uniq s' else真である。 – ejgallego
リストに一意性述部の2つの有意義な定義があることに注意してください。あなたが与えたもののほかに、 'x'がリスト' xs'のちょうど1つの位置に存在することを要求するより強い変形があります。 –
アーサーのコメントから誘導的に強いバージョンを定義することができます: '誘導ユニーク:リストA→プロット:= | Unique_base_case:forall x xs、P x - > Forall(fun y =>〜P y)xs - >ユニーク(x :: xs)| –