私はここにコードされて、私は質問のタイトルに適切な言葉を使っていますかどうかわからない:、右側に存在する関数を扱うにはどうすればよいですか?
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
は基本的には、この証明で上に行くために多くはありません私は実際にinduction
をl
に使って、x
の代わりに上記の形式を得ています。 IHl
がexists
の代わりに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時間を費やしていたので、私はこの時点で遺伝的プログラミングを考慮すべきかもしれないと考え始めています。
これはかなりいいですね。 Coqが行った正確なステップを印刷する方法はありますか?このように理解するのは難しいですが、それは2番目のケースではフィニッシュラインを過ぎてズームするだけです。私が立ち往生した以前の問題の経験に基づいて、私は正しく構造化と一般化の命令をしないか、いくつかの明白な書き直しが足りないので、手作業で書くことが少なくなります。できるだけ自動化する方が望ましいスタイルになるはずです。しかし、私は何かを学ぶためにはボンネットの下で見る必要があります。 –
私は[Info](https://coq.inria.fr/refman/Reference-Manual011.html#hevea_command210)コマンドがあることを知っていますが、使用方法がわかりません。それに関するいくつかの指針は歓迎されるでしょう。 –
(1)私の頭の上から、Qedの後に 'Print In_map_iff.'だけで来ることができます。それは証明用語を印刷し、経験によっては、「直感」で使用される論理的な法律/補題を読むことができます。警告:かなり難しいかもしれません。 (2)私は、何ができるのかを明確にするために、いくつかの手動の証明をコメントとして追加しました。 –