2016-11-08 2 views
2

部分文字列の帰納的定義を望むとします(文字列はリストと同義語にすぎません)。ここで帰納的Coq定義における存在量と普遍的な量量子の関係

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を使用して帰納的な定義を行うことはできますか?

答えて

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タイプのように、1つのコンストラクタとユニバーサル定量化を使用して定義されたので、あなたのsusbtringタイプがいくつかの点で「実存」のようだということは驚くべきことではありません。

もちろん、existsを使用してタイプを定義でき、Inductiveは必要ありません。

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

よろしくお願いいたします。 (Jibadiba podajiba brm brm brm - より多くの文字が必要です) – AntlerM

+0

@AntlerMあなたの最初の質問に答えても、私の記事を解決策として選択する前に待つべきです。 – eponier

+0

私の考えでは、普遍的から確かに存在が確かに続くことは確かに意味があります(もし確かにAの中のxがあれば、xは存在します:A、P x 'はAが空ではないと仮定します)約;それは、他の人がこれについてある時点で偶然に遭遇する可能性があるため、題材に対するより多くの「関心」のための余地を残して、妥当なものであると言いました。悲しいことに、私は13人の議員であなたを夢中にすることはできません:)。 – AntlerM

関連する問題