2016-11-16 5 views
1

私はここにコードされて、私は質問のタイトルに適切な言葉を使っていますかどうかわからない:、右側に存在する関数を扱うにはどうすればよいですか?

Lemma In_map_iff : 
    forall (A B : Type) (f : A -> B) (l : list A) (y : B), 
    In y (map f l) <-> 
    exists x, f x = y /\ In x l. 
Proof. 
    intros A B f l y. 
    split. 
    - intros. 
    induction l. 
    + intros. inversion H. 
    + exists x. 
     simpl. 
     simpl in H. 
     destruct H. 
     * split. 
     { apply H. } 
     { left. reflexivity. } 
     * split. 

A : Type 
    B : Type 
    f : A -> B 
    x : A 
    l : list A 
    y : B 
    H : In y (map f l) 
    IHl : In y (map f l) -> exists x : A, f x = y /\ In x l 
    ============================ 
    f x = y 

は基本的には、この証明で上に行くために多くはありません私は実際にinductionlに使って、xの代わりに上記の形式を得ています。 IHlexistsの代わりにforallを持っていたとしたら、私はそこに何かを置き換えることができたかもしれませんが、ここで何をすべきか全くわかりません。

私はしばらくこの問題に悩まされていましたが、それが起こった他の問題とは異なり、私はこの解決策をオンラインで見つけることができませんでした。これは私が本を読んでいくうちに問題になるので、SOのような場所を除いては誰にも聞かせてはいけません。

私はいくつかのヒントをいただきたいと思います。ありがとうございました。


A : Type 
    B : Type 
    f : A -> B 
    x0 : A 
    l : list A 
    y : B 
    H : exists x : A, f x = y /\ In x (x0 :: l) 
    x : A 
    H0 : f x = y /\ In x (x0 :: l) 
    IHl : (exists x : A, f x = y /\ In x l) -> 
     f x = y /\ In x l -> In y (map f l) 
    x1 : A 
    H1 : f x1 = y /\ In x1 (x0 :: l) 
    H2 : f x = y 
    H3 : x0 = x 
    H4 : f x = y 
    ============================ 
    In x l 

Lemma In_map_iff : 
    forall (A B : Type) (f : A -> B) (l : list A) (y : B), 
    In y (map f l) <-> 
    exists x, f x = y /\ In x l. 
Proof. 
    intros A B f l y. 
    split. 
    - intros. 
    induction l. 
    + intros. inversion H. 
    + simpl. 
     simpl in H. 
     destruct H. 
     * exists x. 
     split. 
     { apply H. } 
     { left. reflexivity. } 
     * destruct IHl. 
     -- apply H. 
     -- exists x0. 
      destruct H0. 
      ++ split. 
       ** apply H0. 
       ** right. apply H1. 
    - intros. 
    inversion H. 
    induction l. 
    + intros. 
     inversion H. 
     inversion H1. 
     inversion H3. 
    + simpl. 
     right. 
     apply IHl. 
     * inversion H. 
     inversion H0. 
     inversion H2. 
     exists x. 
     split. 
     -- reflexivity. 
     -- destruct H3. 


は、私は1つのケースを行うことに成功し、今他で立ち往生しています。正直言って、私はすでに15分のような問題に5時間を費やしていたので、私はこの時点で遺伝的プログラミングを考慮すべきかもしれないと考え始めています。

答えて

1

ここには、ペンとペーパーのプルーフ(少なくとも最初の->部分)と同じ構造の証明があります。 <tactic>...が表示されている場合は; intuitionProof with intuition.宣言のため)を意味します。すなわち<tactic>によって生成されたすべてのサブゴールにintuitionの戦術を適用します。 intuitionは、面倒な論理的な控除をしないようにし、いくつかの論理的な補題を利用して、applyrewriteの手順で置き換えることができます。

@ejgallegoが指摘しているように、あなたはdestructという仮説を立てて、そこからいくつかのタイプの住民を得ることができると証明しています。存在する目標を証明しようとするときに重要なことです。

Require Import Coq.Lists.List. 

Lemma some_SF_lemma : 
    forall (A B : Type) (f : A -> B) (l : list A) (y : B), 
    In y (map f l) <-> 
    exists x, f x = y /\ In x l. 
Proof with intuition. 
    intros A B f l y. split; intro H. 
    - (* -> *) 
    induction l as [ | h l']. 
    + (* l = [] *) 
     contradiction. 
    + (* l = h :: l' *) 
     destruct H. 
     * exists h... 
     * destruct (IHl' H) as [x H']. 
     exists x... 
    - (* <- *) 
    admit. 
Admitted. 
+0

これはかなりいいですね。 Coqが行った正確なステップを印刷する方法はありますか?このように理解するのは難しいですが、それは2番目のケースではフィニッシュラインを過ぎてズームするだけです。私が立ち往生した以前の問題の経験に基づいて、私は正しく構造化と一般化の命令をしないか、いくつかの明白な書き直しが足りないので、手作業で書くことが少なくなります。できるだけ自動化する方が望ましいスタイルになるはずです。しかし、私は何かを学ぶためにはボンネットの下で見る必要があります。 –

+0

私は[Info](https://coq.inria.fr/refman/Reference-Manual011.html#hevea_command210)コマンドがあることを知っていますが、使用方法がわかりません。それに関するいくつかの指針は歓迎されるでしょう。 –

+0

(1)私の頭の上から、Qedの後に 'Print In_map_iff.'だけで来ることができます。それは証明用語を印刷し、経験によっては、「直感」で使用される論理的な法律/補題を読むことができます。警告:かなり難しいかもしれません。 (2)私は、何ができるのかを明確にするために、いくつかの手動の証明をコメントとして追加しました。 –

1

Hは、2つの異なる方法で真である場合があります。destruct Hを試してください。それで、証拠は簡単に続くと思いますが、あなたが破棄した順番に注意して、Hを実在させてください。

+0

私はこの時間になるまで更新しました。私は本当に 'IHl'の存在が何をしているのか、本当に分かりません。 –

+2

実在の証人の起源について「論理的に」考えるようにしてください。確かに、あなたがペンとペーパーの証拠の理由に従うならば、あなたの仮説に他の存在を破壊することから、証人とあなたの存在を具体化する必要があるかもしれない。 – ejgallego

+0

私は何とか最初のケースを乗り越えることができましたが、今はもう一方のケースに詰まっています。正直言って、私はこれに対してより良いアプローチが必要です。私はそれほど多くを証明している定理には気を付けませんし、この問題を非公式に証明する方法も考えていません。Idrisのような言語の依存型プログラミングがどのように機能するか、とFstarは学習教材に欠けています。私はCoqがオートメーション機能を持っていることを知っているが、プリントアウトするのは非常に醜い。誰かがこれに遺伝的アルゴリズムのような何かをスローしましたか? –

関連する問題