@@ -42,39 +42,17 @@ type prevector = (int -> R) * int.
4242op vclamp (pv: prevector): prevector =
4343 ((fun i => if 0 <= i < pv.`2 then pv.`1 i else zeror), max 0 pv.`2).
4444
45- lemma vclamp_idemp pv: vclamp (vclamp pv) = vclamp pv.
46- proof. rewrite /vclamp /#. qed.
47-
48- op eqv (pv1 pv2: prevector) =
49- vclamp pv1 = vclamp pv2.
50-
51- lemma eqv_vclamp pv: eqv pv (vclamp pv).
52- proof. by rewrite /eqv vclamp_idemp. qed.
53-
54- clone import Quotient.EquivQuotient as QuotientVec with
55- type T <- prevector,
56- op eqv <- eqv
57- rename [type] "qT" as "vector"
58- proof * by smt().
59-
60- type vector = QuotientVec.vector.
61-
62- op tofunv v = vclamp (repr v).
63-
64- op offunv pv = pi (vclamp pv).
65-
66- lemma tofunvK: cancel tofunv offunv.
67- proof.
68- rewrite /tofunv /offunv /cancel => v; rewrite vclamp_idemp.
69- by rewrite -{2}[v]reprK -eqv_pi /eqv vclamp_idemp.
70- qed.
71-
72- lemma offunvK pv: tofunv (offunv pv) = vclamp pv.
73- proof. by rewrite /tofunv /offunv eqv_repr vclamp_idemp. qed.
74-
75- lemma vectorW (P : vector -> bool):
76- (forall pv, P (offunv pv)) => forall v, P v.
77- proof. by move=> P_pv v; rewrite -tofunvK; apply: P_pv. qed.
45+ clone include Quotient.CanonQuotient with
46+ type T <- prevector,
47+ op canon <- vclamp
48+ rename "canon" as "vclamp"
49+ rename "repr" as "tofunv"
50+ rename "pi" as "offunv"
51+ rename "qT" as "vector"
52+ rename "quot" as "vector"
53+ proof * by smt().
54+
55+ hint simplify vclampK, offunvK.
7856
7957(* Dimension of the vector *)
8058op size v = (tofunv v).`2.
@@ -86,7 +64,7 @@ lemma max0size v: max 0 (size v) = size v by smt().
8664hint simplify max0size.
8765
8866lemma offunv_max f n: offunv (f, max 0 n) = offunv (f, n).
89- proof. rewrite /offunv -eqv_pi /eqv /vclamp /#. qed.
67+ proof. by rewrite /offunv /vclamp /#. qed.
9068
9169lemma size_offunv f n: size (offunv (f, n)) = max 0 n.
9270proof. by rewrite /size offunvK /#. qed.
@@ -100,7 +78,7 @@ abbrev "_.[_]" (v: vector) (i : int) = get v i.
10078
10179lemma get_offunv f n (i : int) : 0 <= i < n =>
10280 (offunv (f, n)).[i] = f i.
103- proof. by rewrite /get /= offunvK /vclamp /= => ->. qed.
81+ proof. by rewrite /get /= /vclamp /= => ->. qed.
10482
10583lemma getv0E v i: !(0 <= i < size v) => v.[i] = zeror by smt().
10684
@@ -665,40 +643,17 @@ op mclamp (pm: prematrix): prematrix =
665643 ((fun i j => if 0 <= i < pm.`2 /\ 0 <= j < pm.`3 then pm.`1 i j else zeror),
666644 max 0 pm.`2, max 0 pm.`3).
667645
668- lemma mclamp_idemp pm: mclamp (mclamp pm) = mclamp pm.
669- proof. by rewrite /mclamp /#. qed.
670-
671- hint simplify mclamp_idemp.
672-
673- op eqv (pm1 pm2: prematrix) = mclamp pm1 = mclamp pm2.
674-
675- clone import Quotient.EquivQuotient as QuotientMat with
676- type T <- prematrix,
677- op eqv <- eqv
678- rename [type] "qT" as "matrix"
679- proof * by smt().
680-
681- type matrix = QuotientMat.matrix.
682-
683- op tofunm m = mclamp (repr m).
684-
685- op offunm pm = pi (mclamp pm).
686-
687- lemma tofunmK : cancel tofunm offunm.
688- proof.
689- rewrite /tofunm /offunm /cancel => m /=.
690- have ->: pi (mclamp (repr m)) = pi (repr m) by rewrite -eqv_pi /eqv.
691- apply reprK.
692- qed.
693-
694- lemma offunmK pm: tofunm (offunm pm) = mclamp pm.
695- proof. by rewrite /tofunm /offunm eqv_repr. qed.
696-
697- hint simplify offunmK.
646+ clone include Quotient.CanonQuotient with
647+ type T <- prematrix,
648+ op canon <- mclamp
649+ rename "canon" as "mclamp"
650+ rename "repr" as "tofunm"
651+ rename "pi" as "offunm"
652+ rename "qT" as "matrix"
653+ rename "quot" as "matrix"
654+ proof * by smt().
698655
699- lemma matrixW (P : matrix -> bool) : (forall pm, P (offunm pm)) =>
700- forall m, P m.
701- proof. by move=> P_pm m; rewrite -tofunmK; exact: P_pm. qed.
656+ hint simplify mclampK, offunmK.
702657
703658(* Number of rows and columns of matrices *)
704659op rows m = (tofunm m).`2.
@@ -873,7 +828,7 @@ lemma cols_addm (m1 m2: matrix): cols (m1 + m2) = max (cols m1) (cols m2).
873828proof. rewrite /(+) cols_offunm /#. qed.
874829
875830lemma size_addm (m1 m2: matrix): size m1 = size m2 => size (m1 + m2) = size m1.
876- proof. move => size_eq ; rewrite rows_addm cols_addm /#. qed.
831+ proof. move => [rows_eq cols_eq] ; rewrite rows_addm cols_addm /#. qed.
877832
878833lemma get_addm (m1 m2 : matrix) i j: (m1 + m2).[i, j] = m1.[i, j] + m2.[i, j].
879834proof.
@@ -1756,7 +1711,7 @@ qed.
17561711lemma scalarNm (m: matrix) (s: t): (- s) *** m = - (s *** m).
17571712proof.
17581713rewrite eq_matrixP.
1759- split => [| i j bound]; 1: rewrite !size_scalarm /=; 1: smt(size_scalarm).
1714+ split => [| i j bound]; 1: rewrite !size_scalarm /= rows_scalarm cols_scalarm //.
17601715by rewrite /= !get_scalarm /= mulrN.
17611716qed.
17621717
0 commit comments