我在这个证据中使用了functional induction
,我一直在尝试。据我所知,它基本上允许人们对递归函数的所有参数执行归纳"同时"。
策略功能归纳根据函数的定义执行案例分析和归纳。它利用了Function
生成的原理
我认为原则是技术性的,我不知道它的定义。这是什么意思?
将来,我如何找到这个策略正在做什么? (有没有办法访问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.
答案 0 :(得分:1)
“原则”仅仅意味着“归纳原则” - 必须证明的一整套案例,以便“归纳地”证明某种动机。
Coq中Function
和Fixpoint
之间的区别在于前者根据给定的定义创建归纳原则和递归原则,然后传入每个返回值(作为lambda,如果存在由案例分析约束的变量或者涉及递归调用的值)。这通常计算得更慢。生成的原理是关于生成的归纳类型,其每个变体是函数的调用方案的情况。后者Fixpoint
使用Coq的有限终止分析来证明函数递归的良好基础*。 Fixpoint
更快,因为它在计算中使用OCaml自己的模式匹配和直接递归。
感应方案是如何创建的?首先,将所有函数参数抽象为forall
。然后,匹配表达式的每个分支创建一个新案例来证明该方案(每个嵌套匹配的案例数乘以)。函数中的所有“返回”位置都在某些匹配表达式的绑定范围内;每个约束都是一个归纳案例的论证,它必须产生重构论证的动机(例如,如果是list A
的{{1}},我们有一个cons
和一个a : A
绑定,因此我们必须生成list_a : list A
结果。如果存在带有Motive (cons a list_a)
参数的递归调用,那么我们将进一步绑定类型list_a
的归纳假设。
实际的Coq实施者可能会根据上述细节纠正我,但它或多或少是如何从有根据的递归函数推断出诱导方案。
这一切都相当粗略,在Function和Functional Scheme的文档中有更好的解释。