【发布时间】:2018-01-03 11:11:30
【问题描述】:
我在我一直在尝试的这个证明中使用了functional induction。据我了解,它本质上允许人们“同时”对递归函数的所有参数进行归纳。
The tactics page 声明:
战术功能归纳遵循函数的定义进行案例分析和归纳。它利用了函数生成的原理
我认为 原理 是一些我不知道其定义的技术。什么意思?
在未来,我如何发现这个策略在做什么? (有什么方法可以访问LTac吗?)
有没有更规范的方法来解决我在下面提出的定理?
Require Import FunInd.
Require Import Coq.Lists.List.
Require Import Coq.FSets.FMapInterface.
Require Import FMapFacts.
Require Import FunInd FMapInterface.
Require Import
Coq.FSets.FMapList
Coq.Structures.OrderedTypeEx.
Module Import MNat := FMapList.Make(Nat_as_OT).
Module Import MNatFacts := WFacts(MNat).
Module Import OTF_Nat := OrderedTypeFacts Nat_as_OT.
Module Import KOT_Nat := KeyOrderedType Nat_as_OT.
(* Consider using https://coq.inria.fr/library/Coq.FSets.FMapFacts.html *)
(* Consider using https://coq.inria.fr/library/Coq.FSets.FMapFacts.html *)
(* Consider using https://coq.inria.fr/library/Coq.FSets.FMapFacts.html *)
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.
Theorem insertNatsDoesNotDeleteKeys:
forall (n: nat) (k: nat) (mm: NatToNat),
MNat.In k mm -> MNat.In k (insertNats n mm).
intros n.
intros k mm.
intros kinmm.
functional induction insertNats n mm.
exact kinmm.
rewrite add_in_iff in IHn0.
assert(S next = k \/ MNat.In k mm).
auto.
apply IHn0.
exact H.
Qed.
【问题讨论】:
-
几个 cmets:归纳原理只是特殊的引理,Coq 会为每种数据类型自动生成。例如,通常对数字的归纳是引理
nat_ind。Function生成这样的引理;根据Function的文档,此处使用的引理应称为insertNats_ind,而Check insertNats_ind或Print insertNats_ind应显示它。在 Ltac 上,文档还说functional induction (f x1 x2 x3) is actually a wrapper for induction x1, x2, x3, (f x1 x2 x3) using qualid;它的定义应该在FunInd。 -
您的示例代码缺少一些
Require以使其正常工作。当战术没有在 Ltac 中编程时,就无法访问“Ltac”,这是大多数 Coq 战术的情况。但是,您可以在使用策略之前和之后使用Show Proof来查看它的确切作用。 -
有一个死链接,你说“战术页面说...”
-
谢谢,我修复了链接!
标签: coq coq-tactic