如何在Coq中做逆函数

用户名

我有以下代码。我没有编写完整的代码,但这应该可行。

Definition in_domain {X Y : Set} (f : X -> option Y) x := match (f x) with | Some y => True | None => False end.

Definition injective {X Y : Set} (f : X -> option Y) := forall x y z, f x = Some z -> f y = Some z -> x = y.
Definition surjective {X Y : Set} (f : X -> option Y) := forall y, exists x, f x = Some y.
Definition bijective {X Y : Set} (f : X -> option Y) := injective f /\ surjective f.

Definition compose {X Y Z : Set} (f : X -> option Y) (g : Y -> option Z) (H : forall x, in_domain f x -> in_domain g (f x)) := fun x => match (f x) with | Some y => g y | None => None end.

现在我想写Definition inverse {X Y : Set} (f : X -> option Y) (H : bijective f) : Y -> option X我不能让该函数gf x = Some y <-> g y = Some x

如果可以生成这样的功能,请说明如何做?

亚瑟·阿兹维多·德·阿莫林

您需要公理来执行此操作,因为默认情况下,Coq不允许您从存在证据中提取证人。在这种情况下,您只需要功能可扩展性和唯一选择原则,即选择公理的较弱变体。这是您的问题的简化变体的一种可能性:

Require Import Coq.Logic.Description.
Require Import Coq.Logic.FunctionalExtensionality.

Definition injective {X Y : Set} (f : X -> Y) := forall x y, f x = f y -> x = y.
Definition surjective {X Y : Set} (f : X -> Y) := forall y, exists x, f x = y.
Definition bijective {X Y : Set} (f : X -> Y) := injective f /\ surjective f.

Lemma inverse {X Y : Set} (f : X -> Y) :
  bijective f -> {g : Y -> X | (forall x, g (f x) = x) /\
                               (forall y, f (g y) = y) }.
Proof.
intros [inj sur].
apply constructive_definite_description.
assert (H : forall y, exists! x, f x = y).
{ intros y.
  destruct (sur y) as [x xP].
  exists x; split; trivial.
  intros x' x'P.
  now apply inj; rewrite xP, x'P. }
exists (fun y => proj1_sig (constructive_definite_description _ (H y))).
split.
- split.
  + intros x.
    destruct (constructive_definite_description _ _).
    simpl.
    now apply inj.
  + intros y.
    now destruct (constructive_definite_description _ _).
- intros g' [H1 H2].
  apply functional_extensionality.
  intros y.
  destruct (constructive_definite_description _ _) as [x e].
  simpl.
  now rewrite <- e, H1.
Qed.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用GenericRelation的逆函数

来自分类Dev

Haskell中的逆函数合成

来自分类Dev

如何在Entity Framework Core中做count等聚合函数

来自分类Dev

SAS Proc SQL ---如何在SAS中做Listagg函数

来自分类Dev

wxMaxima:如何定义函数的逆函数?

来自分类Dev

如何获得嵌套函数中存储的模型的链接函数(使用$ family $ linkinv)的逆函数?

来自分类Dev

如何获得TypeScript映射类型的逆函数?

来自分类Dev

如何绘制时间序列的逆函数

来自分类Dev

在Flask中寻找url_for的逆函数

来自分类Dev

如何在when里面做窗口函数?

来自分类Dev

我如何在基类中为派生类函数做朋友?

来自分类Dev

如何实现集成的Chi ^ 2函数的逆函数?

来自分类Dev

如何在Coq中只展开一次递归函数

来自分类Dev

C ++中对数正态分布的累积函数的逆函数

来自分类Dev

C ++中对数正态分布的累积函数的逆函数

来自分类Dev

如何使用“ base”中的函数实现“ intercalate”(将字符串拆分成字符上的片段)的逆函数?

来自分类常见问题

如何在PyTorch中做矩阵乘积

来自分类Dev

如何在R中做匿名向量?

来自分类Dev

如何在Clojure中做参考/指针?

来自分类Dev

如何在R中做ANCOVA?

来自分类Dev

如何在python中做退格键

来自分类Dev

如何在excel中做条件图表?

来自分类Dev

如何在linux shell中做求和

来自分类Dev

如何在 SAS 中做“DO 循环”

来自分类Dev

如何在 JavaScript 中做同样的事情?

来自分类Dev

如何在美味测试中做IO?

来自分类Dev

如何在Coq中完成此证明

来自分类Dev

如何在Coq中“翻转”平等主张?

来自分类Dev

如何在Coq中重复假设?