Math coq——功能功率定义

Math coq——功能功率定义,math,specifications,coq,Math,Specifications,Coq,我感兴趣的是如何将Coq中的f定义为n: 基本上,作为练习,我想写下这个定义,然后确认我的 算法实现了这个规范归纳的定义在这里似乎合适,但我不能像上面那样把它弄清楚。什么是上述的清洁Coq实现?归纳式用于定义在某些操作下关闭的类型;这不是你要找的。您想要构建的是一个迭代n的递归函数。这可以使用固定点关键字来完成: Fixpoint pow_func {A : Type} (f : A -> A) (n : nat) (a : A) : A := match n with | O

我感兴趣的是如何将Coq中的
f
定义为
n

基本上,作为练习,我想写下这个定义,然后确认我的
算法实现了这个规范<代码>归纳的定义在这里似乎合适,但我不能像上面那样把它弄清楚。什么是上述的清洁Coq实现?

归纳式
用于定义在某些操作下关闭的类型;这不是你要找的。您想要构建的是一个迭代
n
的递归函数。这可以使用
固定点
关键字来完成:

Fixpoint pow_func {A : Type} (f : A -> A) (n : nat) (a : A) : A :=
 match n with
  | O   => f a
  | S n => f (pow_func f n a)
end.
如果希望此函数的语法更好,可以引入
表示法

Notation "f ^ n" := (pow_func f n).
然而,请注意,这并不是一个对权力概念的良好定义:如果你撰写
f^m
f^n
,你不会得到
f^(m+n)
,而是
f^(1+m+n)
。要解决这个问题,您应该选择基本大小写
f^0
作为合成
id
的中性元素,而不是
f
本身。这将给你:

Fixpoint pow_func' {A : Type} (f : A -> A) (n : nat) (a : A) : A :=
 match n with
  | O   => a
  | S n => f (pow_func' f n a)
end.

使用gallais定义的
pow_func
函数,您可以将您的规范声明为引理,例如:

Lemma pow_func0: forall (A:Type) (f: A -> A) (x: A), pow_fun f O x = f x.


通过展开定义,证明应该是微不足道的

这是
power
函数的一个实现,这很好。然而,作为练习,我想对照我上面给出的规范检查该实现。问题是我不知道如何在Coq中形式化该规范。
Lemma pow_funcS: forall (n:nat) (A: Type) (f: A->A) (x:A), pow_fun f (S n) x = f (pow_fun f n x).