2017-09-22 11 views
0

私は、次の補題のためにパッと消えるコックを記述しようとしています:Coqで次の補題をどのように証明できますか?

Require Export Coq.Structures.OrderedTypeEx. 
Require Import FMapAVL. 
Module M := FMapAVL.Make(Nat_as_OT). 

Fixpoint cc (n: nat) (c: M.t nat):bool := 
match M.find n c with 
| None => false 
| _ => true 
end. 

Lemma l: forall (n: nat) (k:nat) (m: M.t nat), cc n m = true -> cc n (M.add k k m) = true. 

私は(M.add k k m)一部を簡素化することができませんでしだ。

+0

「M」とは何ですか?必要な輸入品を追加できますか?また、何をやって何をしようとしたのですか?あなたは '(M.add k k m)'を単純化できません。あなたが立ち往生した時点までに使用されたすべての戦術を挙げることができれば役に立ちます。 – Matt

+0

あなたはモジュール内のものの内容を調べるべきではありません。モジュールで定義されている補題を使って、抽象データ型Mについて推論する必要があります。この場合、補題 'Mを使うだけで十分です。 「add_1」、「M.add_2」、「M.find_1」、「M.find_2」。 – larsr

+0

補題を証明する1つの方法については、[here](https://gist.github.com/anonymous/b8173a55317b5cfc4450a1a1e172f01b)を参照してください。 – larsr

答えて

1

最初にccに再帰呼び出しがないので、この定義を平文で定義する必要があります(FixpointではなくDefinitionを使用)。

第二には、あなたがM.findM.addの行動について推論したい場合、あなたは これらの関数についての事を述べる定理をご覧ください: M.find_2M.add_2M.E.eq_decを定理、そしてM.add_1は有用であろう(私はこれらの補題を見つけましたSearchコマンドを使用して)。したがって、ccを展開してから、(M.find n m)の値で理由を推論してから、これらの 定理を使用して、ステートメントで発生する関数について論理的に進んでください。この問題では、機能M.MapsToが重要な役割を果たすことに注意してください。

テーブルについての推論では初歩的な演習のように見えるので、私はむしろあなたに解答を与えません。

+0

検索コマンドで 'Search M.add'または' Search M.find'の出力が表示されません。これは、オンラインドキュメントに基づいて使用されるべきだと私は考えています。私はそれを間違っているのですか?私は必要な輸入品をすべて使用しましたが、それはコンパイルされますが、何も表示されません。 – abhishek

+0

私はプルーフ・ゼネラルを使用していて、タイプ M.find を入力していました。それは私にM.find_1 M.find_2と3番目の定理を与えました。私はまた、 "Search M.find"というコマンドを入力しようとしました。それは正しい定理を返した。私が使用しているCoqのバージョンは8.6です。時間があり、ここで結果を報告したら、私はcoqideで試してみるでしょう。 – Yves

+0

coqide(8.6.1)を使用すると、クエリウィンドウを開くことができます([表示]メニューのオプションを使用して)、M.findと入力します。私も3つの定理を得る。 – Yves

関連する問題