在 Coq 上使用 Coqelicot 进行偏微分

Partial differentiation using Coqelicot on Coq

我想部分微分需要 n 个参数的任意自然数 n 的函数。我希望只区分一次任意参数而不是其他参数。

Require Import Reals.
Open Scope R_scope.

Definition myFunc (x y z:R) :R:=
 x^2 + y^3 + z^4.

当我用 y 区分 myFunc 时,我期望函数 3*(y^2)

我知道partial_derive in Coquelicot

Definition partial_derive (m k : nat) (f : R → R → R) : R → R → R :=
  fun x y ⇒ Derive_n (fun t ⇒ Derive_n (fun z ⇒ f t z) k y) m x.

partial_derive 可以部分微分 f:R → R → R,但不能对任意数量的参数进行微分。

我想过使用依赖类型listR。

Inductive listR :nat -> Type:=
|RO : Euc 0
|Rn : forall {n}, R -> listR n -> listR (S n).

Notation "[ ]" := RO.
Notation "[ r1 , .. , r2 ]" := (Rn r1 .. ( Rn r2 RO ) .. ).
Infix ":::" := Rn (at level 60, right associativity).

Fixpoint partial_derive_nth {n} (k:nat) (f : listR n -> R) (e:listR n): listR n -> R:=

k 指定要区分的参数编号。 我们不能像partial_derive那样定义partial_derive_nth,因为我们不能在递归中指定fun的参数名称。

请告诉我如何部分微分具有任意数量参数的函数。

对于你的函数myFunc,你可以这样写偏导数:

Definition pdiv2_myFunc (x y z : R) :=
 Derive (fun y => myFunc x y z) y.

然后您可以证明它具有您对 xyz 的任何选择所期望的值。由于 Coquelicot.

中提供的策略,大部分证明都可以自动完成
Lemma pdiv2_myFunc_value (x y z : R) :
   pdiv2_myFunc x y z = 3 * y ^ 2.
Proof.
unfold pdiv2_myFunc, myFunc.  
apply is_derive_unique.
auto_derive; auto; ring.
Qed.

我有点惊讶自动策略auto_derive不能处理Derive _ _ = _形式的目标,所以我必须自己应用定理is_derive_unique