我想定义一个函数compose
,它将f : nat ^^ n --> nat
与g1 ... 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)
但我不知道如何从这里开始。有什么建议吗?
答案 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 --> B
到A ^ 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
,您应该拥有自己想要的内容。
干杯,
诉P>