Coq 向量间相等的定义
我想定义向量之间的相等 我想到的定义是“两个向量相等,当且仅当它们的类型和所有元素相等” 所以,我想证明我的定义没有矛盾Coq 向量间相等的定义,coq,Coq,我想定义向量之间的相等 我想到的定义是“两个向量相等,当且仅当它们的类型和所有元素相等” 所以,我想证明我的定义没有矛盾 Require Import Psatz. Require Import Coq.Vectors.Vector. Definition kLess : forall (k P:nat), (P - k) < (S P). intros. lia. Defined. Lemma aaa {n A}(v1 v2:t A (S n)): (forall k:nat, nt
Require Import Psatz.
Require Import Coq.Vectors.Vector.
Definition kLess : forall (k P:nat), (P - k) < (S P).
intros. lia.
Defined.
Lemma aaa {n A}(v1 v2:t A (S n)): (forall k:nat, nth_order v1 (kLess k n) = nth_order v2 (kLess k n)) -> v1 = v2.
Proof.
intro IH.
induction n.
Abort.
需要导入Psatz。
需要导入Coq.Vectors.Vector。
定义kLess:forall(KP:nat),(P-k)<(SP)。
介绍。莉亚。
定义
引理aaa{na}(v1v2:ta(sn)):(对于所有k:nat,n阶v1(kLess kn)=n阶v2(kLess kn))->v1=v2。
证明。
介绍IH。
归纳法。
中止
我不知道还能做什么
请告诉我你的方法。显然,标准库中缺少一个关于减法的引理。这是:
Lemma sub_sub_involutive n m : m <= n -> n - (n - m) = m.
Proof.
induction 1 as [ | n lemn Ih].
now rewrite Nat.sub_diag, Nat.sub_0_r.
destruct m as [ | m].
now rewrite Nat.sub_0_r, Nat.sub_diag.
rewrite (Nat.sub_succ_l (S m) n);[ | lia].
now rewrite Nat.sub_succ, Ih.
Qed.
引理sub_sub_对合nm:mn-(n-m)=m。
证明。
诱导1为[n lemn Ih]。
现在重写Nat.sub\u diag,Nat.sub\u 0\r。
将m分解为[|m]。
现在重写Nat.sub\u 0\u r,Nat.sub\u diag。
重写(Nat.sub_succul(S m)n);[| lia]。
现在重写Nat.sub_such,Ih。
Qed。
有了这个引理,你可以在评论中遵循@larsr的建议。这是我的尝试
Lemma aaa {n A}(v1 v2: t A (S n)):
(forall k:nat, nth_order v1 (kLess k n) = nth_order v2 (kLess k n)) ->
v1 = v2.
Proof.
intros eqi; rewrite <- eq_nth_iff.
intros p1 p2 pp; rewrite <- pp; clear pp p2.
rewrite <- (Fin.of_nat_to_nat_inv p1).
destruct (Fin.to_nat p1) as [x lx]; cbn.
assert (xtosub : x = n - ( n - x)).
now rewrite sub_sub_involutive;[ | lia].
revert lx; rewrite xtosub; intros lx.
rewrite (Fin.of_nat_ext lx (kLess _ _)).
apply eqi.
Qed.
引理aaa{na}(v1v2:ta(sn)):
(对于所有k:nat,n阶v1(kLess k n)=n阶v2(kLess k n))->
v1=v2。
证明。
介绍eqi;重写这里有一个证明
Require Import Psatz.
Require Import Vectors.Vector.
Definition kLess : forall (k P:nat), (P - k) < (S P).
intros. lia.
Defined.
Lemma exists_kLess {n} (p: Fin.t (S n)):
exists k : nat, p = Fin.of_nat_lt (kLess k n).
Proof.
destruct (Fin.to_nat p) as [i Hi] eqn:Q.
exists (n-i).
apply Fin.to_nat_inj.
rewrite Q.
rewrite Fin.to_nat_of_nat.
simpl.
lia.
Qed.
Lemma aaa A: forall n (v1 v2:t A (S n)), (forall k:nat, nth_order v1 (kLess k n) = nth_order v2 (kLess k n)) -> v1 = v2.
Proof.
unfold nth_order.
intros.
apply Vector.eq_nth_iff.
intros p p' Hp; subst p'.
enough (exists k, p = Fin.of_nat_lt (kLess k n)) as [k Hk].
rewrite Hk. rewrite (H k). reflexivity.
apply exists_kLess.
Qed.
需要导入Psatz。
需要导入向量。向量。
定义kLess:forall(KP:nat),(P-k)<(SP)。
介绍。莉亚。
定义
引理存在_-kLess{n}(p:Fin.t(sn)):
存在k:nat,p=nat的Fin.of(kLess k n)。
证明。
分解(Fin.to_nat p)为[i Hi]eqn:Q。
存在(n-i)。
将Fin.to_nat_inj应用于。
重写Q。
将Fin.to\u nat\u改写为\u nat。
简单。
莉亚。
Qed。
引理aaa:forall n(v1v2:ta(sn)),(forall k:nat,n阶v1(kLess kn)=n阶v2(kLess kn))->v1=v2。
证明。
按N顺序展开。
介绍。
应用Vector.eq\n\u iff。
简介p'Hp;subst p'。
足够的(存在k,p=kLess k n)作为[k Hk]。
重写香港。重写(hk)。自反性。
应用程序不存在。
Qed。
你能包含运行该程序所需的所有定义吗?我修改了我的脚本。你基本上是在尝试证明引理Vector.eq\n\u iff
,但是使用了nat
和Fin.t
。首先应用eq\n\u iff
,按*
顺序展开n\u顺序,然后证明向量中的索引匹配…@larsr,你为什么不把你的评论变成一个答案?很好!我来看看这个。我发现与Fin
打交道相当困难。顺便说一句,你不能用lia
来证明sub_sub_对合
?@larsr,你是对的。这表明我的头脑中存在偏见。我更喜欢将关于运算符的有趣属性表示为引理(通过搜索找到,并以某种方式用作文档),而不是像lia
和ring
这样的自动策略(实际上,ring
不知道截断自然数中的减法)。我在教学时,学生们往往不喜欢我所依赖的lia
或ring
,因为他们很难记住每种策略的应用领域。无论如何,我仍然认为在数学成分中处理有界数和固定大小的数组更好(向量被命名为元组
).是的,这个证明比我给出的更尊重抽象层次。