什么是"功能性诱导" Coq的策略是什么?

时间:2018-01-03 11:11:31

标签: coq coq-tactic

我在这个证据中使用了functional induction,我一直在尝试。据我所知,它基本上允许人们对递归函数的所有参数执行归纳"同时"。

The tactics page声明:

  

策略功能归纳根据函数的定义执行案例分析和归纳。它利用了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.

1 个答案:

答案 0 :(得分:1)

“原则”仅仅意味着“归纳原则” - 必须证明的一整套案例,以便“归纳地”证明某种动机。

Coq中FunctionFixpoint之间的区别在于前者根据给定的定义创建归纳原则和递归原则,然后传入每个返回值(作为lambda,如果存在由案例分析约束的变量或者涉及递归调用的值)。这通常计算得更慢。生成的原理是关于生成的归纳类型,其每个变体是函数的调用方案的情况。后者Fixpoint使用Coq的有限终止分析来证明函数递归的良好基础*。 Fixpoint更快,因为它在计算中使用OCaml自己的模式匹配和直接递归。

感应方案是如何创建的?首先,将所有函数参数抽象为forall。然后,匹配表达式的每个分支创建一个新案例来证明该方案(每个嵌套匹配的案例数乘以)。函数中的所有“返回”位置都在某些匹配表达式的绑定范围内;每个约束都是一个归纳案例的论证,它必须产生重构论证的动机(例如,如果是list A的{​​{1}},我们有一个cons和一个a : A绑定,因此我们必须生成list_a : list A结果。如果存在带有Motive (cons a list_a)参数的递归调用,那么我们将进一步绑定类型list_a的归纳假设。

实际的Coq实施者可能会根据上述细节纠正我,但它或多或少是如何从有根据的递归函数推断出诱导方案。

这一切都相当粗略,在FunctionFunctional Scheme的文档中有更好的解释。

  • 终止分析可能太聪明了。在proof of False给出(由此产生)一致性公理之后,需要对其进行修订(由IIRCMaximeDénès做好)。