【发布时间】:2018-01-02 11:10:55
【问题描述】:
我正在尝试学习在 Coq 中使用 ListMap 模块。当ListMap 是由递归函数创建时,我真的不确定是否要证明ListMap 中的键或值的属性。我觉得我不知道该使用什么策略。
(* Me proving statements about maps to understand how to use maps in Coq *)
Require Import FunInd.
Require Import Coq.Lists.List.
Require Import Coq.FSets.FMapInterface.
Require Import
Coq.FSets.FMapList
Coq.Structures.OrderedTypeEx.
Module Import MNat := FMapList.Make(Nat_as_OT).
Require Import
Coq.FSets.FMapFacts.
Definition NatToNat := MNat.t nat.
Definition NatToNatEmpty : NatToNat := MNat.empty nat.
(* We wish to show that map will have only positive values *)
Function insertNats (n: nat) (mm: NatToNat) {struct n}: NatToNat :=
match n with
| O => mm
| S (next) => insertNats next (MNat.add n n mm)
end.
Definition keys (mm: NatToNat) : list nat :=
List.map fst (elements mm).
(* vvvvv How do I prove this? Intuitively it is true *)
Example keys_nonnegative: forall (n: nat),
forall (k: nat),
List.In k (keys (insertNats n NatToNatEmpty)) -> k >= 0.
Proof.
intros n k in_proof.
induction n.
simpl in in_proof. tauto.
(* ??? NOW WHAT *)
Admitted.
非正式地,我将用于以下程序的参数是因为n >= 0 因为它是nat,所以idMapsGo 插入到映射中的键也将始终为非负数。
我需要在n 上为keys_nonnegative 进行感应。在nth 步骤中,我们添加一个键n,它是非负的(因为是nat)。基本情况是微不足道的。
但是,我无法将这种直觉转化为 Coq 证明 :)
【问题讨论】:
-
因为 'k' 是 'nat',所以它是非负数。为什么在这种情况下需要查看地图的内容?使用“intros.auto with *.”可以简单地证明您的引理。作为证明的主体(不需要归纳)。
-
确实如此。但这不是重点:实际示例更复杂 - 我选择创建这个人工示例。如果有帮助,请将其视为 Z,而不是 nat。
-
啊,很抱歉造成混乱。
标签: coq coq-tactic