n-ary的组成对Coq中的自然数起作用

时间:2015-01-14 09:51:31

标签: coq function-composition

我想定义一个函数compose,它将f : nat ^^ n --> natg1 ... gn : nat ^^ m --> nat组合在一起,以便

compose n m f g1 ... gn x1 ... xm 

等于

f (g1 x1 ... xm) ... (gn x1 ... xm) 

使用standard library for n-ary functions,为特殊情况n = 1定义它并不太难:

Fixpoint compose_unary (m : nat) (g : nat -> nat) :
(nat ^^ m --> nat) -> (nat ^^ m --> nat) := 
match m return ( (nat ^^ m --> nat) -> 
(nat ^^ m --> nat) ) with  
| O    => fun x => (g x)
| S m' => fun f => fun x 
       => compose_unary m' g (f x)
end.

至于一般情况,我非常确定类型声明应该是

Fixpoint compose (n m : nat) 
(g : nat ^^ n --> nat) : 
(nat ^^ m --> nat) ^^ n 
--> (nat ^^ m --> nat) 

但我不知道如何从这里开始。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这是我设法做的,但不确定这是最简单的方法,因为我使用依赖类型和依赖模式匹配来编码族g1, ... , gn

Require Import NaryFunctions Vector.

Open Scope type.

首先,我需要一个函数将函数f: A^^n --> B应用于n-uplet x: A^^n

Definition napply {A B:Type} (n :nat) (f: A ^^ n --> B) (x: A ^ n) : B :=
  nuncurry A B n f x.

然后这是你的撰写函数:

Fixpoint compose {A B C: Type} (n m: nat) (f: B ^^ m --> C) (gs: Vector.t (A ^^ n --> B) m) (xs: A ^ n) {struct gs } :  C :=
  match gs in Vector.t _ m' return (B ^^ m' --> C) -> A ^ n -> C with
    | nil _ => fun f0 _ => f0
    | cons _ hd p tl => fun fs ys => compose n p (fs (napply n hd ys)) tl ys
  end f xs
.

此函数使用函数f : B^^m --> C和类型为m的{​​{1}}函数集合,并构建从A^^n --> BA ^ n的实数函数。如有必要,您可以对其进行澄清:

C

使用Fixpoint compose_n {A B C: Type} (n m: nat) (f: B ^^ m --> C) (gs: Vector.t (A ^^ n --> B) m) : A ^^ n --> C := ncurry _ _ n (compose n m f gs). 实例化A B C,您应该拥有自己想要的内容。

干杯,