coq ---功能定义

时间:2014-05-04 20:51:40

标签: math specifications coq

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

enter image description here

基本上,作为练习,我想写这个定义,然后确认我的 算法实现了这个规范。 Inductive这里的{{1}}定义似乎很合适,但我无法像上面那样干净。什么是上面的干净的Coq实现?

2 个答案:

答案 0 :(得分:1)

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

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

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).

通过展开定义

,证明应该是微不足道的

答案 1 :(得分:0)

Inductive用于定义在某些操作下关闭的类型;这不是你在这里寻找的。你想要构建的是一个遍历n的递归函数。这可以使用Fixpoint关键字完成:

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

Notation "f ^ n" := (pow_func f n).

但是,请注意,这不是对权力概念的良好定义:如果您撰写f ^ mf ^ n,则不会获得f ^ (m + n),而是f ^ (1 + m + n) 1}}。要解决此问题,您应该选择基本案例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.