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
,因为他们很难记住每种策略的应用领域。无论如何,我仍然认为在数学成分中处理有界数和固定大小的数组更好(向量被命名为
元组
).是的,这个证明比我给出的更尊重抽象层次。