Coq 有证据

Coq 有证据,coq,Coq,我是Coq的新手,为了好玩和学习,我做了一些关于代码战的Kata 我被其中一个卡住了,想听听你的想法 因此,我: Record iso (A B : Set) : Set := bijection { A_to_B : A -> B; B_to_A : B -> A; A_B_A : forall a : A, B_to_A (A_to_B a) = a; B_A_B : forall b : B, A_to_B (B_to_A b) = b }. (* nat_pl

我是Coq的新手,为了好玩和学习,我做了一些关于代码战的Kata

我被其中一个卡住了,想听听你的想法

因此,我:

Record iso (A B : Set) : Set :=

bijection {

A_to_B : A -> B;

B_to_A : B -> A;

A_B_A : forall a : A, B_to_A (A_to_B a) = a;

B_A_B : forall b : B, A_to_B (B_to_A b) = b

}.


(* nat_plus_nat : a set having size(nat) more elements than nat. (provided in preloaded) *)
Inductive nat_plus_nat : Set := left (n : nat) | right (n : nat).


Theorem nat_iso_natpnat : iso nat nat_plus_nat.
我有自己的想法,但我无法实施,我不知道这是否可行。基本上,我希望将每个奇数nat映射到一个构造函数(例如,左侧),将每个偶数nat映射到另一个构造函数(例如,右侧)。这样行吗?如果没有,怎么做


现在我只能接受这个事实,定义为
A_to_B
A_to_B
定义为
A_to_B
如果奇数n,则左n,否则右n,定义为
fun=>将n与|左n'=>n'端匹配
不会给我足够的事实来消除某些情况。

你首先需要正确地做数学:找到两个函数,每个函数都是相反的其他的

你最初的意图是正确的:一边是奇数,另一边是偶数,但你存储在每一边的内容应该涵盖所有自然数,所以你可能需要在某个地方除以2

对于Coq用法,您应该从以下行开始加载
Arith
包:

Require Import Arith.
通过这种方式,您可以从现有函数中获益,如
Nat.div2
Nat.even
以及所有关于它们的现有定理。为了找到相关的定理,我建议使用如下命令:

Search Nat.even 2.
Search Nat.div2.

最后提示:对于初学者来说,通过归纳法证明
Nat.div2
的属性是相当困难的。尽量使用现有的定理。如果您选择通过归纳法对第2部分进行证明,查看文件
theory/Arith/Div2.v
中的源代码:该文件的作者为此设计了一个名为
ndìu 0_1_SS
的特定归纳定理。

你首先需要正确地进行数学运算:找到两个彼此相反的函数

你最初的意图是正确的:一边是奇数,另一边是偶数,但你存储在每一边的内容应该涵盖所有自然数,所以你可能需要在某个地方除以2

对于Coq用法,您应该从以下行开始加载
Arith
包:

Require Import Arith.
通过这种方式,您可以从现有函数中获益,如
Nat.div2
Nat.even
以及所有关于它们的现有定理。为了找到相关的定理,我建议使用如下命令:

Search Nat.even 2.
Search Nat.div2.

最后提示:对于初学者来说,通过归纳法证明
Nat.div2
的属性是相当困难的。尽量使用现有的定理。如果你选择用归纳法来证明第2部分的内容,去查阅文件《理论》/Arith/div2.v中的资料来源:该文件的作者设计了一个特殊的归纳定理,名为《代码》\nd\u 0\u 1\u SS,就是为了这个目的。

a到B(B到a(左2))是的,你猜对了,这不是一个
左2
,而是
右2
,或者换句话说,这两个函数没有形成双射。一个可能更容易思考问题的提示/提醒是,双射函数必须同时是内射函数(它们不会将两个元素映射到同一个图像)和满射函数(每个函数的密码域中的所有元素都必须有一个先行项。
A_到B(B_到A(左2))
?是的,你猜对了,它不是一个
左2
,而是
右2
,或者,换句话说,这两个函数没有形成一个双射。一个可以让我们更容易思考这个问题的提示/提醒是,双射函数必须是内射函数(它们不会将两个元素映射到同一个图像)和满射函数(每个函数的密码域中的所有元素都必须有一个先行项)。谢谢你,你用2除的提示对我帮助很大!谢谢你,你用2除的提示对我帮助很大!