Date: Fri, 26 Apr 2024 03:13:04 +0200
Subject: [PATCH 22/43] load and save button
---
www/grid.html | 5 +++
www/grid.js | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 94 insertions(+)
diff --git a/www/grid.html b/www/grid.html
index 118df43..8452fd9 100755
--- a/www/grid.html
+++ b/www/grid.html
@@ -28,6 +28,11 @@
+
+
+
+
+
To add an obstacle, click to a first end-point (blue square)
then click to the second end-point
diff --git a/www/grid.js b/www/grid.js
index 7281805..27a200f 100644
--- a/www/grid.js
+++ b/www/grid.js
@@ -444,3 +444,92 @@ function onDocumentMouseDown( event ) {
renderer.render( scene, camera );
}
}
+
+
+document.getElementById('loadButton').addEventListener('click', function() {
+ let input = document.createElement('input');
+ input.type = 'file';
+ input.accept = 'text/*'
+ input.onchange = _ => {
+ // you can use this method to get file and perform respective operations
+ let files = Array.from(input.files);
+ if (files.length < 1) {
+ return;
+ }
+ let file = files[0];
+ var reader = new FileReader();
+ reader.onload = function(progressEvent) {
+ fromValid = false;
+ toValid = false;
+ fromCube.position.y = -0.2;
+ toCube.position.y = -0.2;
+ for (const obstacle of obstacles) {
+ scene.remove(obstacle.line);
+ }
+ obstacles = [];
+ renderer.render( scene, camera );
+ // Entire file
+ const text = this.result;
+ // By lines
+ var lines = text.split('\n');
+ var i = 0;
+ if (lines[i].indexOf('Obstacles') != -1) {
+ i++;
+ while ((i < lines.length) && (lines[i].length != 0) &&
+ (lines[i].indexOf("Positions") == -1)) {
+ var fX = parseFloat(lines[i]);
+ var fZ = parseFloat(lines[i+1]);
+ var tX = parseFloat(lines[i+2]);
+ var tZ = parseFloat(lines[i+3]);
+ addObstacle(fX, fZ, tX, tZ);
+ i += 4;
+ }
+ }
+ if (lines[i].indexOf("Positions") != -1) {
+ document.getElementById('positions').checked = true;
+ var fX = parseFloat(lines[i+1]);
+ var fZ = parseFloat(lines[i+2]);
+ var tX = parseFloat(lines[i+3]);
+ var tZ = parseFloat(lines[i+4]);
+ i += 5;
+ fromValid = true;
+ toValid = true;
+ fromCube.position.z = fZ;
+ fromCube.position.y = fromY;
+ fromCube.position.x = fX;
+ toCube.position.z = tZ;
+ toCube.position.y = toY;
+ toCube.position.x = tX;
+ renderer.render( scene, camera );
+ positions = {fX : fX, fZ : fZ, tX : tX, tZ : tZ }
+ cleanCurve();
+ getCurve();
+ renderer.render( scene, camera );
+ }
+ };
+ reader.readAsText(file);
+ };
+ input.click();
+});
+
+document.getElementById('saveButton').addEventListener('click', function() {
+ const link = document.createElement("a");
+ let val = "";
+ if (obstacles.length != 0) {
+ val += "Obstacles\n";
+ for (const obstacle of obstacles) {
+ val += obstacle.fX + "\n" + obstacle.fZ + "\n"
+ + obstacle.tX + "\n" + obstacle.tZ + "\n";
+ }
+ if (positions != null) {
+ val += "Positions\n";
+ val += positions.fX + "\n" + positions.fZ + "\n";
+ val += positions.tX + "\n" + positions.tZ + "\n";
+ }
+ }
+ const file = new Blob([val], { type: 'text/plain' });
+ link.href = URL.createObjectURL(file);
+ link.download = "sample.txt";
+ link.click();
+ URL.revokeObjectURL(link.href);
+});
From 651a4c81e1cea3d8b487bbe2c90c0e0771034d4f Mon Sep 17 00:00:00 2001
From: thery
Date: Fri, 26 Apr 2024 03:34:42 +0200
Subject: [PATCH 23/43] fix modality in graph display
---
www/grid.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/www/grid.js b/www/grid.js
index 27a200f..0b353fe 100644
--- a/www/grid.js
+++ b/www/grid.js
@@ -487,6 +487,7 @@ document.getElementById('loadButton').addEventListener('click', function() {
}
if (lines[i].indexOf("Positions") != -1) {
document.getElementById('positions').checked = true;
+ setModality();
var fX = parseFloat(lines[i+1]);
var fZ = parseFloat(lines[i+2]);
var tX = parseFloat(lines[i+3]);
From cd210d151a21b9f5dee65408475a31aade6ed65e Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Fri, 26 Apr 2024 04:02:54 +0200
Subject: [PATCH 24/43] changes of notations, and underE and strictE work on
the concept definied in points_and_edge instead of generic_trajectories
---
theories/points_and_edges.v | 523 ++++++++++++++++++------------------
1 file changed, 263 insertions(+), 260 deletions(-)
diff --git a/theories/points_and_edges.v b/theories/points_and_edges.v
index a685524..86f3e1b 100644
--- a/theories/points_and_edges.v
+++ b/theories/points_and_edges.v
@@ -18,9 +18,11 @@ Section working_context.
Variable (R : realFieldType).
Definition pt := pt R.
-Notation Bpt := (Bpt R).
-Notation p_x := (generic_trajectories.p_x R).
-Notation p_y := (generic_trajectories.p_y R).
+Notation Bpt := (Bpt _).
+Notation "p .x" := (generic_trajectories.p_x _ p)
+ (at level 2, left associativity, format "p .x").
+Notation "p .y" := (generic_trajectories.p_y _ p)
+ (at level 2, left associativity, format "p .y").
Lemma pt_eqP : Equality.axiom (pt_eqb R eq_op).
Proof.
@@ -36,18 +38,18 @@ Qed.
HB.instance Definition _ := hasDecEq.Build _ pt_eqP.
Lemma pt_eqE (p1 p2 : pt) :
- (p1 == p2) = (p_x p1 == p_x p2) && (p_y p1 == p_y p2).
+ (p1 == p2) = (p1.x == p2.x) && (p1.y == p2.y).
Proof. by move: p1 p2 => [? ?][? ?]. Qed.
Record edge := Bedge {left_pt : pt; right_pt : pt;
- _ : p_x left_pt < p_x right_pt}.
+ _ : left_pt.x < right_pt.x}.
Definition edge_eqb (e1 e2 : edge) : bool :=
let: Bedge a1 b1 p1 := e1 in
let: Bedge a2 b2 p2 := e2 in
(a1 == a2) && (b1 == b2).
-Lemma edge_cond (e : edge) : p_x (left_pt e) < p_x (right_pt e).
+Lemma edge_cond (e : edge) : (left_pt e).x < (right_pt e).x.
Proof. by move: e => [l r c]. Qed.
Lemma edge_eqP : Equality.axiom edge_eqb.
@@ -64,8 +66,8 @@ Qed.
HB.instance Definition _ := hasDecEq.Build _ edge_eqP.
-Definition area3 :=
- area3 R +%R (fun x y => x - y) *%R.
+Notation area3 :=
+ (area3 R +%R (fun x y => x - y) *%R).
(* returns true if p is under e *)
Definition point_under_edge :=
@@ -80,18 +82,20 @@ Lemma R_ltb_lt x y : R_ltb R eq_op le x y = (x < y).
Proof. by rewrite /R_ltb -lt_neqAle. Qed.
Lemma strictE p e :
- generic_trajectories.point_strictly_under_edge R eq_op le +%R
- (fun x y => x - y) *%R 1 edge left_pt right_pt p e =
+ point_strictly_under_edge (*R eq_op le +%R
+ (fun x y => x - y) *%R 1 edge left_pt right_pt *) p e =
(area3 p (left_pt e) (right_pt e) < 0).
Proof.
-by rewrite /generic_trajectories.point_strictly_under_edge R_ltb_lt subrr.
+by rewrite /point_strictly_under_edge/generic_trajectories.point_strictly_under_edge R_ltb_lt subrr.
Qed.
Lemma underE p e :
- generic_trajectories.point_under_edge R le +%R
- (fun x y => x - y) *%R 1 edge left_pt right_pt p e =
+ point_under_edge (* R le +%R
+ (fun x y => x - y) *%R 1 edge left_pt right_pt *) p e =
(area3 p (left_pt e) (right_pt e) <= 0).
-Proof. by rewrite /generic_trajectories.point_under_edge subrr. Qed.
+Proof.
+by rewrite /point_under_edge/generic_trajectories.point_under_edge subrr.
+Qed.
Notation "p '<<=' e" := (point_under_edge p e)( at level 70, no associativity).
Notation "p '<<<' e" := (point_strictly_under_edge p e)(at level 70, no associativity).
@@ -438,7 +442,7 @@ Qed.
End ring_sandbox.
Lemma area3E a b c : area3 a b c =
- pue_f (p_x a) (p_y a) (p_x b) (p_y b) (p_x c) (p_y c).
+ pue_f a.x (a.y) b.x (b.y) c.x (c.y).
Proof. by case: a b c=> [a_x a_y] [b_x b_y] [c_x c_y]. Qed.
Lemma area3_opposite a b d: area3 d a b = - area3 b a d.
@@ -453,8 +457,8 @@ Proof.
apply :pue_f_c.
Qed.
-Lemma area3_vert a b c : (p_x b = p_x c) ->
-area3 a b c == (p_x b - p_x a) * (p_y c - p_y b).
+Lemma area3_vert a b c : (b.x = c.x) ->
+area3 a b c == (b.x - a.x) * (c.y - b.y).
Proof.
move: a b c => [ax ay] [b_x b_y] [cx cy]/= <-.
apply : pue_f_vert.
@@ -479,8 +483,8 @@ Qed.
Lemma area3_on_edge a b c d m :
area3 m a b == 0 ->
-(p_x b - p_x a) * area3 m c d ==
-(p_x m - p_x a) * area3 b c d + (p_x b - p_x m) * area3 a c d.
+(b.x - a.x) * area3 m c d ==
+(m.x - a.x) * area3 b c d + (b.x - m.x) * area3 a c d.
Proof.
move : a b c d m => [ax ay] [b_x b_y] [cx cy] [dx dy] [mx my]/=.
apply pue_f_on_edge.
@@ -488,7 +492,7 @@ Qed.
Lemma area3_on_edge_y a b m :
area3 m a b == 0 ->
-(p_x b - p_x a) * p_y m = p_x m * (p_y b - p_y a) - (p_x a * p_y b - p_x b * p_y a).
+(b.x - a.x) * m.y = m.x * (b.y - a.y) - (a.x * b.y - b.x * a.y).
Proof.
move : a b m => [ax ay] [b_x b_y] [mx my]/=.
apply pue_f_on_edge_y.
@@ -496,50 +500,50 @@ Qed.
Lemma area3_triangle_on_edge a b p p' :
area3 p' a b == 0 ->
-(p_x b - p_x a) * area3 p' a p ==
-(p_x p' - p_x a) * area3 b a p.
+(b.x - a.x) * area3 p' a p ==
+(p'.x - a.x) * area3 b a p.
Proof.
move : a b p p' => [ax ay] [b_x b_y] [px py] [p'x p'y] /=.
apply pue_f_triangle_on_edge.
Qed.
Definition subpoint (p : pt) :=
- Bpt (p_x p) (p_y p - 1).
+ Bpt (p.x) (p.y - 1).
Lemma edge_and_left_vertical (p q a : pt) :
- p_x p < p_x a -> p_x p = p_x q ->
- (0 < area3 p q a) = (p_y q < p_y p).
+ p.x < a.x -> p.x = q.x ->
+ (0 < area3 p q a) = (q.y < p.y).
Proof.
case: p=> [px py]; case: a=> [ax ay]; case: q=> [qx qy] /=.
by move=> c1 c2; apply edge_and_left_vertical_f.
Qed.
Lemma edge_and_left_vertical_eq (p q a : pt) :
- p_x p < p_x a -> p_x p = p_x q ->
+ p.x < a.x -> p.x = q.x ->
(area3 p q a == 0) = (p == q).
Proof.
move=> edge_cond vert_cond.
apply/idP/idP; last first.
by move/eqP ->; rewrite (area3_two_points q a).1.
-move=> abs; suff : p_y p = p_y q.
+move=> abs; suff : p.y = q.y.
by move: vert_cond {edge_cond abs}; case: p=> [? ?]; case q=> [? ?]/= <- <-.
-apply: le_anti. rewrite (leNgt (p_y p) (p_y q)).
+apply: le_anti. rewrite (leNgt (p.y) (q.y)).
rewrite -(edge_and_left_vertical edge_cond vert_cond) (eqP abs).
-have ec' : p_x q < p_x a by rewrite -vert_cond.
+have ec' : q.x < a.x by rewrite -vert_cond.
rewrite leNgt -(edge_and_left_vertical ec' (esym vert_cond)).
by rewrite area3_opposite -area3_cycle (eqP abs) oppr0 ltxx.
Qed.
Lemma edge_and_right_vertical (p q a : pt) :
- p_x a < p_x p -> p_x p = p_x q ->
- (0 < area3 p q a) = (p_y p < p_y q).
+ a.x < p.x -> p.x = q.x ->
+ (0 < area3 p q a) = (p.y < q.y).
Proof.
case: p=> [px py]; case: a=> [ax ay]; case: q=> [qx qy] /=.
by move=> c1 c2; apply: edge_and_right_vertical_f.
Qed.
Lemma point_sub_right (p a : pt) :
- (p_x p < p_x a) -> 0 < area3 p (subpoint p) a.
+ (p.x < a.x) -> 0 < area3 p (subpoint p) a.
Proof.
move=> edge_cond.
rewrite edge_and_left_vertical //; rewrite /subpoint /= lterBDr cprD.
@@ -596,7 +600,7 @@ Definition below_alt (e1 : edge) (e2 : edge) :=
Lemma edge_below_refl e : e <| e.
Proof.
apply/orP; left.
-rewrite /point_under_edge 2!underE.
+rewrite 2!underE.
rewrite (eqP (proj1 (area3_two_points _ _))).
by rewrite (eqP (proj1 (proj2 (area3_two_points _ _)))) lexx.
Qed.
@@ -672,11 +676,11 @@ have pf := area3_on_edge (left_pt low_e) (right_pt low_e) poea.
rewrite /point_strictly_under_edge.
rewrite /generic_trajectories.point_strictly_under_edge subrr.
rewrite !R_ltb_lt -!leNgt => llrllh llrllrh.
-have diffa : (p_x lr - p_x a) <= 0.
+have diffa : (lr.x - a.x) <= 0.
by rewrite subr_cp0.
-have diffb : (p_x hr - p_x a) >= 0.
+have diffb : (hr.x - a.x) >= 0.
by rewrite subr_cp0.
-have difflh : (p_x lr - p_x hr) < 0.
+have difflh : (lr.x - hr.x) < 0.
by rewrite subr_cp0.
rewrite -(ler_nM2l difflh _ 0) mulr0 -opprB mulNr oppr_le0 (eqP pf).
by rewrite addr_ge0 // mulr_ge0 // subr_ge0.
@@ -692,11 +696,11 @@ move : high_e => [lr hr inH] /=.
rewrite /point_on_edge /valid_edge => /andP [] /= poea /andP [] linfa ainfr.
have pf := area3_on_edge (left_pt low_e) (right_pt low_e) poea.
rewrite /point_under_edge -!ltNge !subrr => llrllh llrllrh.
-have diffa : (p_x lr - p_x a) <= 0.
+have diffa : (lr.x - a.x) <= 0.
by rewrite subr_cp0.
-have diffb : (p_x hr - p_x a) >= 0.
+have diffb : (hr.x - a.x) >= 0.
by rewrite subr_cp0.
-have difflh : (p_x lr - p_x hr) < 0.
+have difflh : (lr.x - hr.x) < 0.
by rewrite subr_cp0.
rewrite -(ltr_nM2l difflh _ 0) mulr0 -opprB mulNr oppr_lt0 (eqP pf).
have addr_le_gt0 (x y : R) : 0 <= x -> 0 < y -> 0 < x + y.
@@ -720,11 +724,11 @@ move : low_e => [lr hr inH] /=.
rewrite /point_on_edge /valid_edge => /andP [] /= poea /andP [] linfa ainfr.
have pf := area3_on_edge (left_pt high_e) (right_pt high_e) poea.
rewrite /point_under_edge /generic_trajectories.point_under_edge !subrr=> llrllh llrllrh.
-have diffa : (p_x lr - p_x a) <= 0.
+have diffa : (lr.x - a.x) <= 0.
by rewrite subr_cp0.
-have diffb : (p_x hr - p_x a) >= 0.
+have diffb : (hr.x - a.x) >= 0.
by rewrite subr_cp0.
-have difflh : (p_x lr - p_x hr) < 0.
+have difflh : (lr.x - hr.x) < 0.
by rewrite subr_cp0.
rewrite -(ler_nM2r difflh 0 _) mul0r mulrC -opprB mulNr (eqP pf) opprD.
by rewrite addr_ge0 // -mulNr mulr_le0 // oppr_le0 subr_cp0.
@@ -742,11 +746,11 @@ have pf := area3_on_edge (left_pt high_e) (right_pt high_e) poea.
rewrite /point_strictly_under_edge.
rewrite/generic_trajectories.point_strictly_under_edge.
rewrite !R_ltb_lt !subrr=> llrllh llrllrh.
-have diffa : (p_x lr - p_x a) <= 0.
+have diffa : (lr.x - a.x) <= 0.
by rewrite subr_cp0.
-have diffb : (p_x hr - p_x a) >= 0.
+have diffb : (hr.x - a.x) >= 0.
by rewrite subr_cp0.
-have difflh : (p_x lr - p_x hr) < 0.
+have difflh : (lr.x - hr.x) < 0.
by rewrite subr_cp0.
rewrite -(ltr_nM2l difflh 0) mulr0 -opprB mulNr oppr_gt0 (eqP pf).
have addr_le_lt0 (x y : R) : x <= 0 -> y < 0 -> x + y < 0.
@@ -763,16 +767,16 @@ Qed.
Lemma not_strictly_above' low_e high_e p':
~~ (left_pt (high_e) <<< low_e) ->
~~ (right_pt (high_e) <<< low_e) ->
-p' === high_e -> p_x (right_pt (low_e)) = p_x p' ->
+p' === high_e -> (right_pt (low_e)).x = p'.x ->
right_pt (low_e) <<= high_e .
Proof.
move : low_e => [ll lr inL] /=.
move => pablh pabrh poep' eqxp'p.
have /= /eqP puefcpp' := area3_vert (left_pt (Bedge inL)) eqxp'p .
have := (point_on_edge_above poep' pablh pabrh ).
-rewrite /point_strictly_under_edge strictE.
-rewrite -area3_cycle -leNgt puefcpp' /point_under_edge underE.
-have inle: (p_x lr - p_x ll) >0.
+rewrite strictE.
+rewrite -area3_cycle -leNgt puefcpp' underE.
+have inle: (lr.x - ll.x) >0.
by rewrite subr_cp0.
rewrite (pmulr_rge0 _ inle) => inp'lr.
have := (ax4_three_triangles lr (left_pt high_e) (right_pt high_e) p') => /eqP <-.
@@ -783,14 +787,14 @@ have := (area3_vert (right_pt high_e) eqxp'p ).
rewrite -area3_cycle eqxp'p => /eqP ->.
move : valp'.
rewrite /valid_edge => /andP [] xlhp' xrhp'.
-have xrhp'0: p_x p' - p_x (right_pt high_e) <=0.
+have xrhp'0: p'.x - (right_pt high_e).x <=0.
by rewrite subr_cp0.
rewrite add0r.
rewrite -oppr_ge0 opprD /= addr_ge0//.
by rewrite -mulNr mulr_ge0 // oppr_ge0.
have := (area3_vert (left_pt high_e) eqxp'p ).
rewrite -area3_opposite area3_cycle eqxp'p => /eqP ->.
-have xlhp'0: p_x p' - p_x (left_pt high_e) >= 0.
+have xlhp'0: p'.x - (left_pt high_e).x >= 0.
by rewrite subr_cp0.
by rewrite mulr_ge0.
Qed.
@@ -864,7 +868,7 @@ Qed.
Lemma intersection_on_edge e p p' :
vertical_intersection_point p e = Some (p') ->
-p'=== e /\ p_x p = p_x p'.
+p'=== e /\ p.x = p'.x.
Proof.
have := vertical_correct p e.
case vert : (vertical_intersection_point p e)=> [vp |//=].
@@ -882,17 +886,17 @@ Lemma not_strictly_under' low_e high_e p' :
(right_pt (low_e))<<= (high_e) ->
(* This is an alternative way to say
valid_edge low_e (right_pt high_e) *)
-p' === low_e -> p_x (right_pt (high_e)) = p_x p' ->
+p' === low_e -> (right_pt (high_e)).x = p'.x ->
~~ (right_pt (high_e) <<< low_e).
Proof.
move : high_e => [hl hr inH] /=.
move => pablh pabrh poep' eqxp'p.
have /= /eqP puefcpp' := area3_vert (left_pt (Bedge inH)) eqxp'p .
have := (point_on_edge_under poep' pablh pabrh ).
-rewrite /point_under_edge/point_strictly_under_edge underE strictE.
+rewrite underE strictE.
rewrite -area3_cycle.
rewrite -leNgt puefcpp'.
-have inle: (p_x hr - p_x hl) >0.
+have inle: (hr.x - hl.x) >0.
by rewrite subr_cp0.
rewrite (pmulr_rle0 _ inle ) => inp'hr.
have := (ax4_three_triangles hr (left_pt low_e) (right_pt low_e) p') => /eqP <-.
@@ -903,7 +907,7 @@ have := (area3_vert (right_pt low_e) eqxp'p ).
rewrite -area3_cycle eqxp'p => /eqP ->.
move : valp'.
rewrite /valid_edge => /andP [] xlhp' xrhp'.
-have xrhp'0: p_x p' - p_x (right_pt low_e) <=0.
+have xrhp'0: p'.x - (right_pt low_e).x <=0.
by rewrite subr_cp0.
rewrite add0r addr_ge0//.
by rewrite mulr_le0.
@@ -913,8 +917,8 @@ by rewrite -mulNr mulr_le0 // oppr_le0 subr_cp0.
Qed.
Lemma pue_right_edge e p :
-p_x (right_pt e) == p_x p ->
-(p <<= e) = ((p_y p - p_y (right_pt e)) <= 0).
+(right_pt e).x == p.x ->
+(p <<= e) = ((p.y - (right_pt e).y) <= 0).
Proof.
move : e p => [[ax ay][bx b_y] /= inE] [px py] /=.
rewrite /point_under_edge/generic_trajectories.point_under_edge /=.
@@ -927,8 +931,8 @@ by rewrite subrr (pmulr_rle0 _ inE) .
Qed.
Lemma psue_right_edge e p :
-p_x (right_pt e) == p_x p ->
-(p <<< e) = ((p_y p - p_y (right_pt e)) < 0).
+(right_pt e).x == p.x ->
+(p <<< e) = ((p.y - (right_pt e).y) < 0).
Proof.
move : e p => [[ax ay][bx b_y] /= cnd] [px py] /=.
rewrite /point_strictly_under_edge/generic_trajectories.point_strictly_under_edge /=.
@@ -942,8 +946,8 @@ by rewrite subrr (pmulr_rlt0 _ cnd) .
Qed.
Lemma pue_left_edge e p :
-p_x (left_pt e) == p_x p ->
-(p <<= e) = (0 <= (p_y (left_pt e) - p_y p )).
+(left_pt e).x == p.x ->
+(p <<= e) = (0 <= ((left_pt e).y - p.y )).
Proof.
move : e p => [[ax ay][bx b_y] /= inE] [px py] /=.
rewrite /point_under_edge.
@@ -957,8 +961,8 @@ by rewrite subrr (nmulr_rle0 _ inE).
Qed.
Lemma psue_left_edge e p :
-p_x (left_pt e) == p_x p ->
-(p <<< e) = (0 < p_y (left_pt e) - p_y p).
+(left_pt e).x == p.x ->
+(p <<< e) = (0 < (left_pt e).y - p.y).
Proof.
move: e p => [[ax ay][bx b_y] /= cnd] [px py] /=.
move=> /eqP <- /=.
@@ -999,11 +1003,11 @@ Qed.
Lemma on_edge_same_point e p p':
p === e -> p' === e ->
-(p_x p == p_x p') -> (p_y p == p_y p').
+(p.x == p'.x) -> (p.y == p'.y).
Proof.
move : e => [l r ec].
rewrite /point_on_edge /= => /andP [] p0 _ /andP[] p'0 _.
-have dif : p_x l != p_x r.
+have dif : l.x != r.x.
by apply/eqP=> abs; move: ec; rewrite abs ltxx.
move: l r p0 p'0 dif {ec}=> [a_x a_y][b_x b_y] p0 p'0 dif.
move: p p' p0 p'0 => [x y] [x' y'] puep0 puep'0.
@@ -1011,14 +1015,14 @@ rewrite /=; apply: (pue_f_on_edge_same_point dif puep0 puep'0).
Qed.
Lemma strict_under_edge_lower_y r r' e :
- p_x r = p_x r' -> r' === e -> (r <<< e) = (p_y r < p_y r').
+ r.x = r'.x -> r' === e -> (r <<< e) = (r.y < r'.y).
Proof.
move=> rr' rone.
have valre : valid_edge e r.
by case/andP: rone; rewrite /valid_edge/generic_trajectories.valid_edge rr'.
move: (valre)=> /andP[] + _; rewrite le_eqVlt=> /orP[/eqP atl| inr].
have req : r' = left_pt e.
- have rltr : p_x r' < p_x (right_pt e) by rewrite -rr' -atl edge_cond.
+ have rltr : r'.x < (right_pt e).x by rewrite -rr' -atl edge_cond.
have /esym := edge_and_left_vertical_eq rltr (esym (etrans atl rr')).
by move/andP: rone => [] -> _ /eqP.
by move/eqP/psue_left_edge: atl; rewrite subr_gt0 -req.
@@ -1033,8 +1037,8 @@ have rue' : (r <<< e) = (area3 r (left_pt e) r' < 0).
rewrite signcond pmulr_rlt0; last by rewrite subr_gt0 -rr'.
rewrite /point_strictly_under_edge.
by rewrite /generic_trajectories.point_strictly_under_edge subrr R_ltb_lt.
-have inr' : p_x (left_pt e) < p_x r' by rewrite -rr'.
-have /psue_right_edge : p_x (right_pt (Bedge inr')) == p_x r.
+have inr' : (left_pt e).x < r'.x by rewrite -rr'.
+have /psue_right_edge : (right_pt (Bedge inr')).x == r.x.
by rewrite /= rr' eqxx.
rewrite rue' subr_lt0.
rewrite /point_strictly_under_edge.
@@ -1072,7 +1076,7 @@ by rewrite valep andbT lt_neqAle.
Qed.
Lemma under_edge_strict_lower_y (r r' : pt) e :
- p_x r = p_x r' -> r != r' -> r <<= e -> r' === e -> p_y r < p_y r'.
+ r.x = r'.x -> r != r' -> r <<= e -> r' === e -> r.y < r'.y.
Proof.
move=> xs nq under on'.
have vr : valid_edge e r.
@@ -1083,7 +1087,7 @@ by rewrite (strict_under_edge_lower_y xs).
Qed.
Lemma above_edge_strict_higher_y (r r' : pt) e :
- p_x r = p_x r' -> r != r' -> r >>= e -> r' === e -> p_y r' < p_y r.
+ r.x = r'.x -> r != r' -> r >>= e -> r' === e -> r'.y < r.y.
Proof.
move=> xs nq above on'.
have vr : valid_edge e r.
@@ -1094,14 +1098,14 @@ by case/negP: nq; rewrite pt_eqE xs ys !eqxx.
Qed.
Lemma under_edge_lower_y r r' e :
- p_x r = p_x r' -> r' === e -> (r <<= e) = (p_y r <= p_y r').
+ r.x = r'.x -> r' === e -> (r <<= e) = (r.y <= r'.y).
Proof.
move=> rr' rone.
have valre : valid_edge e r.
by case/andP: rone; rewrite /valid_edge/generic_trajectories.valid_edge rr'.
move: (valre)=> /andP[] + _; rewrite le_eqVlt=> /orP[/eqP atl| inr].
have req : r' = left_pt e.
- have rltr : p_x r' < p_x (right_pt e) by rewrite -rr' -atl edge_cond.
+ have rltr : r'.x < (right_pt e).x by rewrite -rr' -atl edge_cond.
have /esym := edge_and_left_vertical_eq rltr (esym (etrans atl rr')).
by move/andP: rone => [] -> _ /eqP.
by move/eqP/pue_left_edge: atl; rewrite subr_ge0 -req.
@@ -1115,28 +1119,28 @@ have rue' : (r <<= e) = (area3 r (left_pt e) r' <= 0).
move: (edge_cond e); rewrite -subr_gt0 => /pmulr_rle0 <-.
rewrite /point_under_edge/generic_trajectories.point_under_edge subrr.
by rewrite signcond pmulr_rle0; last rewrite subr_gt0 -rr'.
-have inr' : p_x (left_pt e) < p_x r' by rewrite -rr'.
+have inr' : (left_pt e).x < r'.x by rewrite -rr'.
rewrite /point_under_edge/generic_trajectories.point_under_edge subrr.
-have /pue_right_edge : p_x (right_pt (Bedge inr')) == p_x r.
+have /pue_right_edge : (right_pt (Bedge inr')).x == r.x.
by rewrite /= rr' eqxx.
move: rue'.
rewrite /point_under_edge/generic_trajectories.point_under_edge subrr=> rue'.
by rewrite rue' subr_le0.
Qed.
-Lemma aligned_trans a a' b p : p_x a != p_x b ->
+Lemma aligned_trans a a' b p : a.x != b.x ->
area3 a' a b == 0 ->
area3 p a b == 0 -> area3 p a' b == 0.
Proof.
rewrite -area3_cycle.
move=> bna /[dup]/area3_triangle_on_edge proc a'ab pab.
-have/mulfI/inj_eq <- : p_x a - p_x b != 0 by rewrite subr_eq0.
+have/mulfI/inj_eq <- : a.x - b.x != 0 by rewrite subr_eq0.
rewrite -area3_cycle -(eqP (proc _)).
by rewrite area3_cycle (eqP pab) !mulr0.
Qed.
Lemma area3_change_ext a b a' b' p :
- p_x a < p_x b -> p_x a' < p_x b' ->
+ a.x < b.x -> a'.x < b'.x ->
area3 a' a b == 0 -> area3 b' a b == 0 ->
sg (area3 p a b) = sg (area3 p a' b').
Proof.
@@ -1144,13 +1148,13 @@ move=> altb altb' ona onb.
have/area3_triangle_on_edge:= ona => /(_ p)/eqP ona'.
have/area3_triangle_on_edge:= onb => /(_ p)/eqP onb0.
have/area3_triangle_on_edge: area3 b' a' a == 0.
- have bna : p_x b != p_x a by case: ltrgtP altb.
+ have bna : b.x != a.x by case: ltrgtP altb.
by rewrite (aligned_trans bna) //
area3_opposite oppr_eq0 area3_cycle.
move=>/(_ p)/eqP onb'.
-have difab : 0 < p_x b - p_x a by rewrite subr_gt0.
-have difab' : 0 < p_x b' - p_x a' by rewrite subr_gt0.
-have [ | | aa' ] := ltrgtP (p_x a) (p_x a'); last first.
+have difab : 0 < b.x - a.x by rewrite subr_gt0.
+have difab' : 0 < b'.x - a'.x by rewrite subr_gt0.
+have [ | | aa' ] := ltrgtP (a.x) (a'.x); last first.
- set w := Bedge altb.
have/on_edge_same_point tmp : a === Bedge altb by exact: left_on_edge.
have/(tmp _) : a' === Bedge altb.
@@ -1201,14 +1205,14 @@ rewrite -eqx' in linfp' p'infr.
rewrite -eqx'' in linfp'' p''infr.
move => puep.
-have ydiff : p_y p <= p_y p'.
+have ydiff : p.y <= p'.y.
by rewrite -(under_edge_lower_y eqx' poep').
rewrite eqx' in eqx''.
have puep' := (point_on_edge_under poep' pulh purh).
-have y'diff : p_y p' <= p_y p''.
+have y'diff : p'.y <= p''.y.
by rewrite -(under_edge_lower_y eqx'' poep'').
-have y''diff: (p_y p <= p_y p'').
+have y''diff: (p.y <= p''.y).
by rewrite (le_trans ydiff y'diff).
rewrite -eqx' in eqx''.
have := ax4_three_triangles p hl hr p''.
@@ -1218,14 +1222,14 @@ rewrite -area3_cycle in pHreq.
rewrite area3_opposite -area3_cycle in pHleq.
move : poepf'' pHreq => /eqP -> -> .
-have : area3 p hl p'' = - ((p_x p - p_x hl) * (p_y p'' - p_y p)).
+have : area3 p hl p'' = - ((p.x - hl.x) * (p''.y - p.y)).
by rewrite -pHleq opprK.
move => ->.
rewrite add0r -mulrBl.
rewrite [x in (x - _) * _ == _] addrC.
rewrite addrKA opprK.
-rewrite /point_under_edge /= {pulh purh vallow valhigh poep' poep'' poepf' puep puep'}.
+rewrite /= {pulh purh vallow valhigh poep' poep'' poepf' puep puep'}.
rewrite underE.
rewrite addrC.
have inH' := inH.
@@ -1261,14 +1265,14 @@ rewrite -eqx' in linfp' p'infr.
rewrite -eqx'' in linfp'' p''infr.
move => puep.
-have ydiff : p_y p < p_y p'.
+have ydiff : p.y < p'.y.
by rewrite -(strict_under_edge_lower_y eqx' poep').
rewrite eqx' in eqx''.
have puep' := (point_on_edge_under poep' pulh purh).
-have y'diff : p_y p' <= p_y p''.
+have y'diff : p'.y <= p''.y.
by rewrite -(under_edge_lower_y eqx'' poep'').
-have y''diff: (p_y p < p_y p'').
+have y''diff: (p.y < p''.y).
by rewrite (lt_le_trans ydiff y'diff).
rewrite -eqx' in eqx''.
have := ax4_three_triangles p hl hr p''.
@@ -1278,14 +1282,14 @@ rewrite -area3_cycle in pHreq.
rewrite area3_opposite -area3_cycle in pHleq.
move : poepf'' pHreq => /eqP -> -> .
-have : area3 p hl p'' = - ((p_x p - p_x hl) * (p_y p'' - p_y p)).
+have : area3 p hl p'' = - ((p.x - hl.x) * (p''.y - p.y)).
by rewrite -pHleq opprK.
move => ->.
rewrite add0r -mulrBl.
rewrite [x in (x - _) * _ == _] addrC.
rewrite addrKA opprK.
-rewrite /point_strictly_under_edge /= {pulh purh vallow valhigh poep' poep'' poepf' puep puep'}.
+rewrite /= {pulh purh vallow valhigh poep' poep'' poepf' puep puep'}.
rewrite addrC.
have inH' := inH.
rewrite -subr_cp0 in inH'.
@@ -1321,14 +1325,14 @@ rewrite -eqx' in linfp' p'infr.
rewrite -eqx'' in linfp'' p''infr.
move => /= puep.
-have ydiff : p_y p <= p_y p'.
+have ydiff : p.y <= p'.y.
by rewrite -(under_edge_lower_y eqx' poep').
rewrite eqx' in eqx''.
symmetry in eqx''.
have pabp' := (point_on_edge_above poep'' pabhl pabhr).
-have y'diff : p_y p' <= p_y p''.
+have y'diff : p'.y <= p''.y.
by rewrite leNgt -(strict_under_edge_lower_y eqx'' poep').
-have y''diff: (p_y p <= p_y p'').
+have y''diff: (p.y <= p''.y).
by rewrite (le_trans ydiff y'diff).
rewrite -eqx' in eqx''.
have := ax4_three_triangles p hl hr p''.
@@ -1339,14 +1343,14 @@ rewrite area3_opposite in pHreq.
rewrite area3_cycle in pHleq.
move : poepf'' pHleq => /eqP -> -> .
-have : area3 p p'' hr = - ((p_x p'' - p_x hr) * (p_y p - p_y p'')).
+have : area3 p p'' hr = - ((p''.x - hr.x) * (p.y - p''.y)).
by rewrite -pHreq opprK.
move => ->.
rewrite add0r addrC -mulrBl.
rewrite [x in (x - _) * _ == _] addrC.
rewrite addrKA opprK.
-rewrite /point_under_edge /= {pabhl pabhr vallow valhigh poep' poep'' poepf' puep pabp'}.
+rewrite /= {pabhl pabhr vallow valhigh poep' poep'' poepf' puep pabp'}.
rewrite addrC.
have inH' := inH.
rewrite -subr_gte0 in inH'.
@@ -1382,15 +1386,15 @@ rewrite -eqx' in linfp' p'infr.
rewrite -eqx'' in linfp'' p''infr.
move => /= puep.
-have ydiff : p_y p < p_y p'.
+have ydiff : p.y < p'.y.
by rewrite -(strict_under_edge_lower_y eqx' poep').
rewrite eqx' in eqx''.
symmetry in eqx''.
have pabp' := (point_on_edge_above poep'' pabhl pabhr).
-have y'diff : p_y p' <= p_y p''
+have y'diff : p'.y <= p''.y
by rewrite leNgt -(strict_under_edge_lower_y eqx'' poep').
-have y''diff: (p_y p < p_y p'').
+have y''diff: (p.y < p''.y).
by rewrite (lt_le_trans ydiff y'diff).
rewrite -eqx' in eqx''.
have := ax4_three_triangles p hl hr p''.
@@ -1401,14 +1405,14 @@ rewrite area3_opposite in pHreq.
rewrite area3_cycle in pHleq.
move : poepf'' pHleq => /eqP -> -> .
-have : area3 p p'' hr = - ((p_x p'' - p_x hr) * (p_y p - p_y p'')).
+have : area3 p p'' hr = - ((p''.x - hr.x) * (p.y - p''.y)).
by rewrite -pHreq opprK.
move => ->.
rewrite add0r addrC -mulrBl.
rewrite [x in (x - _) * _ == _] addrC.
rewrite addrKA opprK.
-rewrite /point_strictly_under_edge /= {pabhl pabhr vallow valhigh poep' poep'' poepf' puep pabp'}.
+rewrite /= {pabhl pabhr vallow valhigh poep' poep'' poepf' puep pabp'}.
rewrite addrC.
have inH' := inH.
rewrite -subr_gte0 in inH'.
@@ -1450,18 +1454,17 @@ rewrite /edge_below => /orP [] /andP [].
set B := right_pt low_e.
move => pueplow puephigh.
move => inf0.
- have:= inf0; rewrite /point_strictly_under_edge.
- rewrite strictE.
+ have:= inf0; rewrite strictE.
move=> /ltW; rewrite -/A -/B => infeq0.
have := (under_low_imp_strict_under_high pueplow puephigh vallow valhigh inf0).
- by rewrite /point_strictly_under_edge strictE.
+ by rewrite strictE.
move=> pueplow puephigh.
move=> inf0.
by have := (under_low_imp_strict_under_high_bis pueplow puephigh vallow valhigh inf0).
Qed.
Lemma edge_dir_intersect p1 p2 e1 :
- p_x p1 != p_x p2 ->
+ p1.x != p2.x ->
~~(p1 <<= e1) -> p2 <<< e1 ->
exists p, area3 p (left_pt e1) (right_pt e1) = 0 /\
area3 p p1 p2 = 0 /\
@@ -1469,13 +1472,13 @@ Lemma edge_dir_intersect p1 p2 e1 :
area3 q p1 p2 = 0 -> p = q).
Proof.
move=> dif12.
-rewrite /point_under_edge underE.
+rewrite underE.
rewrite area3E -ltNge => ca.
-rewrite /point_strictly_under_edge strictE.
+rewrite strictE.
rewrite area3E => cu.
have [px [py []]] := line_intersection dif12 ca cu.
-rewrite -/(p_y (Bpt px py)); set py' := (p_y (Bpt px py)).
-rewrite -/(p_x (Bpt px py)) /py' {py'}.
+rewrite -/((Bpt px py).y); set py' := ((Bpt px py).y).
+rewrite -/((Bpt px py).x) /py' {py'}.
move: ca cu; rewrite -4!area3E=> ca cu on_line1 [] on_line2 uniq.
exists (Bpt px py); rewrite on_line1 on_line2;split;[ | split]=> //.
by move=> [qx qy]; rewrite !area3E=> /uniq => U; move=> {}/U[] /= -> ->.
@@ -1486,8 +1489,8 @@ Lemma intersection_middle_au e1 e2 :
exists p, area3 p (left_pt e1) (right_pt e1) = 0 /\ p === e2.
Proof.
move=> /[dup] ca; rewrite -ltNge subrr=> ca' /[dup] cu cu'.
-rewrite /point_strictly_under_edge strictE in cu'.
-have le2xnre2x : p_x (left_pt e2) != p_x (right_pt e2).
+rewrite strictE in cu'.
+have le2xnre2x : (left_pt e2).x != (right_pt e2).x.
by have := edge_cond e2; rewrite lt_neqAle=> /andP[].
have [p [p1 [p2 pu]]] := edge_dir_intersect le2xnre2x ca cu.
exists p; rewrite p1; split=> //.
@@ -1496,7 +1499,7 @@ rewrite /generic_trajectories.valid_edge.
have/eqP ol2 := p2.
have := area3_on_edge (left_pt e1) (right_pt e1) ol2 => /=.
rewrite p1 mulr0 eq_sym addrC addr_eq0 -mulNr opprB=> /eqP signcond.
-case : (ltP (p_x p) (p_x (right_pt e2))).
+case : (ltP (p.x) ((right_pt e2).x)).
move=>/[dup]/ltW ->; rewrite andbT -subr_gt0 -subr_le0.
rewrite -(pmulr_lgt0 _ ca') signcond.
by rewrite nmulr_lgt0 // => /ltW.
@@ -1510,8 +1513,8 @@ Lemma intersection_middle_ua e1 e2 :
exists p, area3 p (left_pt e1) (right_pt e1) = 0 /\ p === e2.
Proof.
move=> /[dup] cu cu' /[dup] ca; rewrite -ltNge subrr=> ca'.
-rewrite /point_strictly_under_edge strictE in cu'.
-have re2xnle2x : p_x (right_pt e2) != p_x (left_pt e2).
+rewrite strictE in cu'.
+have re2xnle2x : (right_pt e2).x != (left_pt e2).x.
by have := edge_cond e2; rewrite lt_neqAle eq_sym=> /andP[].
have [p [p1 [p2 pu]]] := edge_dir_intersect re2xnle2x ca cu.
move: p2; rewrite area3_opposite area3_cycle => /eqP.
@@ -1521,7 +1524,7 @@ rewrite /point_on_edge p2 eqxx /= /valid_edge.
rewrite /generic_trajectories.valid_edge.
have := area3_on_edge (left_pt e1) (right_pt e1) ol2 => /=.
rewrite p1 mulr0 eq_sym addrC addr_eq0 -mulNr opprB=> /eqP signcond.
-case : (ltP (p_x p) (p_x (right_pt e2))).
+case : (ltP (p.x) ((right_pt e2).x)).
move=>/[dup]/ltW ->; rewrite andbT -subr_gt0 -subr_le0.
rewrite -(nmulr_llt0 _ cu') signcond.
by rewrite pmulr_llt0 // => /ltW.
@@ -1531,10 +1534,10 @@ by rewrite pmulr_lge0 // subr_ge0=> /(le_trans re2lp); rewrite leNgt edge_cond.
Qed.
Definition lexPt (p1 p2 : pt) : bool :=
- (p_x p1 < p_x p2) || ((p_x p1 == p_x p2) && (p_y p1 < p_y p2)).
+ (p1.x < p2.x) || ((p1.x == p2.x) && (p1.y < p2.y)).
Definition lexePt (p1 p2 : pt) : bool :=
- (p_x p1 < p_x p2) || ((p_x p1 == p_x p2) && (p_y p1 <= p_y p2)).
+ (p1.x < p2.x) || ((p1.x == p2.x) && (p1.y <= p2.y)).
Lemma lexPtW p1 p2 :
lexPt p1 p2 -> lexePt p1 p2.
@@ -1547,23 +1550,23 @@ Qed.
Lemma lexePtNgt (p1 p2 : pt) : lexePt p1 p2 = ~~lexPt p2 p1.
Proof.
rewrite /lexePt /lexPt negb_or negb_and.
-rewrite andb_orr -leNgt (andbC (_ <= _)) (eq_sym (p_x p2)) -lt_neqAle.
-rewrite -leNgt (le_eqVlt (p_x p1)).
-by case: (p_x p1 < p_x p2) => //; rewrite ?orbF //=.
+rewrite andb_orr -leNgt (andbC (_ <= _)) (eq_sym (p2.x)) -lt_neqAle.
+rewrite -leNgt (le_eqVlt (p1.x)).
+by case: (p1.x < p2.x) => //; rewrite ?orbF //=.
Qed.
Lemma lexPtNge (p1 p2 : pt) : lexPt p1 p2 = ~~lexePt p2 p1.
Proof.
rewrite /lexePt /lexPt.
-rewrite negb_or -leNgt negb_and (eq_sym (p_x p2)) andb_orr (andbC (_ <= _)).
+rewrite negb_or -leNgt negb_and (eq_sym (p2.x)) andb_orr (andbC (_ <= _)).
rewrite -lt_neqAle le_eqVlt -ltNge.
-by case: (p_x p1 < p_x p2); rewrite // ?orbF.
+by case: (p1.x < p2.x); rewrite // ?orbF.
Qed.
Lemma lexePt_eqVlt (p1 p2 :pt) : lexePt p1 p2 = (p1 == p2) || lexPt p1 p2.
Proof.
rewrite /lexePt /lexPt.
-case: (ltrgtP (p_x p1) (p_x p2))=> cnd; rewrite ?orbT //= ?orbF.
+case: (ltrgtP (p1.x) (p2.x))=> cnd; rewrite ?orbT //= ?orbF.
by apply/esym/negP=> /eqP p1p2; move: cnd; rewrite p1p2 ltxx.
apply/idP/idP.
rewrite orbC le_eqVlt=> /orP[/eqP | ->// ].
@@ -1618,7 +1621,7 @@ move => p2 p1 p3; rewrite lexePt_eqVlt => /orP[/eqP-> // | p1p2] p2p3.
by apply/lexPtW/(lexPt_lexePt_trans p1p2).
Qed.
-Lemma lexePt_xW p1 p2 : lexePt p1 p2 -> p_x p1 <= p_x p2.
+Lemma lexePt_xW p1 p2 : lexePt p1 p2 -> p1.x <= p2.x.
Proof.
by rewrite /lexePt=> /orP[/ltW | /andP [/eqP -> _]].
Qed.
@@ -1627,7 +1630,7 @@ Lemma on_edge_lexePt_left_pt (p : pt) g :
p === g -> lexePt (left_pt g) p.
Proof.
move=> on.
-have : p_x (left_pt g) <= p_x p by move: on=> /andP[] _ /andP[].
+have : (left_pt g).x <= p.x by move: on=> /andP[] _ /andP[].
rewrite le_eqVlt=> /orP[/eqP/esym /[dup] samex' /eqP samex | xlt ].
have/eqP samey := on_edge_same_point on (left_on_edge _) samex.
have -> : p = left_pt g.
@@ -1643,8 +1646,7 @@ Proof.
case: e1 => [d [a_x a_y] /= cpa].
case: e2 => [d' [b_x b_y] /= cpb].
case: e3 => [d'' [c_x c_y] /= cpc] dp d'p d''p.
-rewrite /edge_below /point_under_edge /point_strictly_under_edge.
-rewrite !underE !strictE.
+rewrite /edge_below !underE !strictE.
rewrite !area3E; simpl left_pt; simpl right_pt.
move: cpa cpb cpc; rewrite dp d'p d''p {dp d'p d''p}.
case: p=> [px py]; simpl p_x; simpl p_y=> cpa cpb cpc.
@@ -1680,36 +1682,36 @@ move=> nc ve.
case: (exists_point_valid ve) => [p pP].
move: (intersection_on_edge pP)=> [pone2 px].
move: (pone2); rewrite /point_on_edge=> /andP[] pone2' vp.
-have xbnd1 : p_x (left_pt e2) <= p_x (left_pt e1) by case/andP: ve.
-have xbnd2 : p_x (left_pt e1) <= p_x (right_pt e2) by case/andP: ve.
-have dify : ((left_pt e1 <<< e2) \/ (~~(left_pt e1 <<= e2))) -> p_y (left_pt e1) != p_y p.
+have xbnd1 : (left_pt e2).x <= (left_pt e1).x by case/andP: ve.
+have xbnd2 : (left_pt e1).x <= (right_pt e2).x by case/andP: ve.
+have dify : ((left_pt e1 <<< e2) \/ (~~(left_pt e1 <<= e2))) -> (left_pt e1).y != p.y.
move=> disj; apply/negP=> /eqP A.
have {A}-A : p = left_pt e1 by case: (p) (left_pt e1) px A=> [? ?][? ?]/= -> ->.
by move: disj; rewrite under_onVstrict // strict_nonAunder // -A pone2; case.
-have pone2'': pue_f (p_x (left_pt e2)) (p_y (left_pt e2))
- (p_x (right_pt e2)) (p_y (right_pt e2))
- (p_x p) (p_y p) == 0.
+have pone2'': pue_f ((left_pt e2).x) ((left_pt e2).y)
+ ((right_pt e2).x) ((right_pt e2).y)
+ (p.x) (p.y) == 0.
by rewrite -pue_f_c; move: pone2'; rewrite area3E pue_f_c.
-move: (edge_cond e2); rewrite -(subr_gt0 (p_x _))=> ce2.
-have dife2 : 0 < p_x (right_pt e2) - p_x (left_pt e2).
- by move: (edge_cond e2); rewrite -(subr_gt0 (p_x _)).
-have dife2' : p_x (right_pt e2) - p_x (left_pt e2) != 0.
+move: (edge_cond e2); rewrite -(subr_gt0 (_.x))=> ce2.
+have dife2 : 0 < (right_pt e2).x - (left_pt e2).x.
+ by move: (edge_cond e2); rewrite -(subr_gt0 (_.x)).
+have dife2' : (right_pt e2).x - (left_pt e2).x != 0.
by move: dife2; rewrite lt_neqAle eq_sym=> /andP[].
-have plp2 : p_x (left_pt e2) = p_x (left_pt e1) -> p = left_pt e2.
+have plp2 : (left_pt e2).x = (left_pt e1).x -> p = left_pt e2.
move=> c; have:= on_edge_same_point pone2 (left_on_edge _).
rewrite c px eqxx=> /(_ isT)=> /eqP; move: px c.
by case: (p) (left_pt e2)=> [? ?][? ?]/= <- <- ->.
-have prp2 : p_x (right_pt e2) = p_x (left_pt e1) -> p = right_pt e2.
+have prp2 : (right_pt e2).x = (left_pt e1).x -> p = right_pt e2.
move=> c; have:= on_edge_same_point pone2 (right_on_edge _).
rewrite c px eqxx=> /(_ isT)=> /eqP; move: px c.
by case: (p) (right_pt e2)=> [? ?][? ?]/= <- <- ->.
have main : (0 < area3 (left_pt e1) (left_pt e2) (right_pt e2)) =
- (p_y p < p_y (left_pt e1)).
+ (p.y < (left_pt e1).y).
move: xbnd1; rewrite le_eqVlt=> /orP[/eqP atleft | notleft ].
have pisl : p = left_pt e2 by apply: plp2.
move: atleft; rewrite -pisl=> atleft; rewrite edge_and_left_vertical //.
by rewrite -atleft pisl (edge_cond e2).
- have fact1 : (0 < p_x p - p_x (left_pt e2)) by rewrite subr_gt0 -px.
+ have fact1 : (0 < p.x - (left_pt e2).x) by rewrite subr_gt0 -px.
rewrite -(pmulr_rgt0 _ fact1) area3_opposite mulrN.
rewrite -(eqP (area3_triangle_on_edge (left_pt e1) pone2')) -mulrN.
rewrite -area3_opposite area3_cycle pmulr_rgt0 //.
@@ -1720,24 +1722,25 @@ have arith : forall (a b : R), a <= 0 -> b <= 0 -> a + b <= 0.
have case1 : left_pt e1 <<< e2 -> e1 <| e2.
move=> below; case:(nc) => // /orP[]; last by rewrite below.
move/andP=> []le2b re2b.
- have pyne1 : p_y (left_pt e1) != p_y p by apply: dify; left.
- have ys : p_y (left_pt e1) < p_y p.
+ have pyne1 : (left_pt e1).y != p.y by apply: dify; left.
+ have ys : (left_pt e1).y < p.y.
rewrite ltNge le_eqVlt -main negb_or eq_sym pyne1 /= -leNgt le_eqVlt.
- by move: (below); rewrite /point_strictly_under_edge strictE orbC => ->.
+ by move: (below); rewrite strictE orbC => ->.
have : 0 < area3 p (left_pt e1) (right_pt e1).
by rewrite edge_and_left_vertical // -px (edge_cond e1).
rewrite -(pmulr_rgt0 _ ce2).
rewrite (eqP (area3_on_edge (left_pt e1) (right_pt e1) pone2')).
rewrite ltNge arith //.
apply: mulr_ge0_le0; first by rewrite -px subr_ge0.
- by move: re2b; rewrite /point_under_edge underE -area3_cycle.
+ by move: re2b; rewrite underE -area3_cycle.
apply: mulr_ge0_le0; first by rewrite -px subr_ge0.
- by move: le2b; rewrite /point_under_edge underE -area3_cycle.
+ by move: le2b;
+ rewrite /point_under_edge/generic_trajectories.point_under_edge subrr.
suff case2 : ~~(left_pt e1 <<= e2) -> e2 <| e1 by [].
move=> above; case: (nc) => // /orP[]; first by rewrite (negbTE above).
-rewrite /point_strictly_under_edge !strictE -!leNgt => /andP[] le2a re2a.
-have pyne1 : p_y (left_pt e1) != p_y p by apply: dify; right.
-have ys : p_y p < p_y (left_pt e1).
+rewrite !strictE -!leNgt => /andP[] le2a re2a.
+have pyne1 : (left_pt e1).y != p.y by apply: dify; right.
+have ys : p.y < (left_pt e1).y.
by rewrite -main;move: (above); rewrite /point_under_edge -ltNge subrr.
have : 0 < area3 (left_pt e1) p (right_pt e1).
by rewrite edge_and_left_vertical // (edge_cond e1).
@@ -1755,7 +1758,7 @@ Proof.
move=> nc e1 e2 e1in e2in.
have nc' := inter_at_ext_sym nc.
have ceq : e1 = e2 -> below_alt e1 e2.
- move=> <-; left; apply/orP; left; rewrite /point_under_edge !underE.
+ move=> <-; left; apply/orP; left; rewrite !underE.
rewrite (fun a b => eqP (proj1 (area3_two_points a b))).
rewrite (fun a b => eqP (proj1 (proj2 (area3_two_points a b)))).
by rewrite lexx.
@@ -1766,8 +1769,8 @@ have [ | ] := boolP(e1 <| e2); first by left.
have [ | ] := boolP(e2 <| e1); first by right.
rewrite /edge_below.
rewrite !negb_or. rewrite 4!negb_and !negbK.
-rewrite /edge_below/point_under_edge !underE.
-rewrite /point_strictly_under_edge !strictE => noc.
+rewrite /edge_below !underE.
+rewrite !strictE => noc.
suff [it | [p [pone1 pone2]]] :
below_alt e1 e2 \/ exists p, p === e1 /\ p === e2; first by [].
have : p \in [:: left_pt e1; right_pt e1] by apply: nc.
@@ -1790,15 +1793,15 @@ move: noc {nc nc'} => /andP[] /orP[le2a | re2a].
by rewrite /point_under_edge/generic_trajectories.point_under_edge subrr.
have [ re2u | re2a _] := boolP(right_pt e2 <<< e1); last first.
by left; left; apply/orP; right; rewrite re2a underWC.
- have dif2 : p_x (left_pt e2) != p_x (right_pt e2).
+ have dif2 : (left_pt e2).x != (right_pt e2).x.
by have := edge_cond e2; rewrite lt_neqAle => /andP[].
have [r [_ [ _ uniq]]] := edge_dir_intersect dif2 le2a' re2u.
move=> /orP[le1u | re1u].
have [re1u | re1a] := boolP(right_pt e1 <<= e2).
left; left; apply/orP; left; rewrite re1u underW //.
- by rewrite /point_strictly_under_edge strictE.
+ by rewrite strictE.
have le1u' : left_pt e1 <<< e2.
- by rewrite /point_strictly_under_edge strictE.
+ by rewrite strictE.
have [p [pe2 pe1]] := intersection_middle_ua le1u' re1a.
have [q [qe1 qe2]] := intersection_middle_au le2a' re2u.
move: (pe1) (qe2)=> /andP[] /eqP pe1' _ /andP[] /eqP qe2' _.
@@ -1806,10 +1809,10 @@ move: noc {nc nc'} => /andP[] /orP[le2a | re2a].
by right; exists r; rewrite [X in X === e2]rq rp.
have [le1u | le1a] := boolP(left_pt e1 <<= e2).
left; left; apply/orP; left; rewrite le1u underW //.
- by rewrite /point_strictly_under_edge strictE.
+ by rewrite strictE.
have [q [qe1 qe2]] := intersection_middle_au le2a' re2u.
have re1u' : right_pt e1 <<< e2.
- by rewrite /point_strictly_under_edge strictE.
+ by rewrite strictE.
have [p [pe2 pe1]] := intersection_middle_au le1a re1u'.
move: (pe1) (qe2)=> /andP[] /eqP pe1' _ /andP[] /eqP qe2' _.
have rq := uniq _ qe1 qe2'; have rp := uniq _ pe1' pe2.
@@ -1818,7 +1821,7 @@ have re2a' : right_pt e2 >>> e1.
by rewrite /point_under_edge/generic_trajectories.point_under_edge subrr.
have [ le2u | le2a _] := boolP(left_pt e2 <<< e1); last first.
by left; left; apply/orP; right; rewrite le2a underWC.
-have dif2 : p_x (right_pt e2) != p_x (left_pt e2).
+have dif2 : (right_pt e2).x != (left_pt e2).x.
by have := edge_cond e2; rewrite lt_neqAle eq_sym => /andP[].
have [r [_ [ _ uniq]]] := edge_dir_intersect dif2 re2a' le2u.
have transfer a b c : area3 a b c = 0 -> area3 a c b = 0.
@@ -1826,9 +1829,9 @@ have transfer a b c : area3 a b c = 0 -> area3 a c b = 0.
move=> /orP[le1u | re1u].
have [re1u | re1a] := boolP(right_pt e1 <<= e2).
left; left; apply/orP; left; rewrite re1u underW //.
- by rewrite /point_strictly_under_edge strictE.
+ by rewrite strictE.
have le1u' : left_pt e1 <<< e2.
- by rewrite /point_strictly_under_edge strictE.
+ by rewrite strictE.
have [p [/transfer pe2 pe1]] := intersection_middle_ua le1u' re1a.
have [q [qe1 qe2]] := intersection_middle_ua le2u re2a'.
move: (pe1) (qe2)=> /andP[] /eqP pe1' _ /andP[] /eqP /transfer qe2' _.
@@ -1836,10 +1839,10 @@ move=> /orP[le1u | re1u].
by right; exists r; rewrite [X in X === e2]rq rp.
have [le1u | le1a] := boolP(left_pt e1 <<= e2).
left; left; apply/orP; left; rewrite le1u underW //.
- by rewrite /point_strictly_under_edge strictE.
+ by rewrite strictE.
have [q [qe1 qe2]] := intersection_middle_ua le2u re2a'.
have re1u' : right_pt e1 <<< e2.
- by rewrite /point_strictly_under_edge strictE.
+ by rewrite strictE.
have [p [/transfer pe2 pe1]] := intersection_middle_au le1a re1u'.
move: (pe1) (qe2)=> /andP[] /eqP pe1' _ /andP[] /eqP /transfer qe2' _.
have rq := uniq _ qe1 qe2'; have rp := uniq _ pe1' pe2.
@@ -1866,33 +1869,33 @@ exact: (sub_in2 oesub).
Qed.
Lemma common_point_edges_y_left r r1 r2 e1 e2 :
- valid_edge e1 r -> p_x r <= p_x (left_pt e1) ->
- p_x r = p_x r1 -> p_x r = p_x r2 -> left_pt e1 === e2 ->
+ valid_edge e1 r -> r.x <= (left_pt e1).x ->
+ r.x = r1.x -> r.x = r2.x -> left_pt e1 === e2 ->
r1 === e1 -> r2 === e2 ->
- p_y r1 = p_y r2.
+ r1.y = r2.y.
Proof.
move=> v xl rr1 rr2 e1e2 re1 re2.
-have xl': p_x r = p_x (left_pt e1) by apply: le_anti; rewrite xl; case/andP:v.
+have xl': r.x = (left_pt e1).x by apply: le_anti; rewrite xl; case/andP:v.
have:= on_edge_same_point e1e2 re2; rewrite -xl' rr2 eqxx=> /(_ isT)/eqP <-.
have:= on_edge_same_point (left_on_edge _) re1.
by rewrite -xl' rr1 eqxx=>/(_ isT)/eqP<-.
Qed.
Lemma common_point_edges_y_right r r1 r2 e1 e2 :
- valid_edge e1 r -> p_x (right_pt e1) <= p_x r ->
- p_x r = p_x r1 -> p_x r = p_x r2 -> right_pt e1 === e2 ->
+ valid_edge e1 r -> (right_pt e1).x <= r.x ->
+ r.x = r1.x -> r.x = r2.x -> right_pt e1 === e2 ->
r1 === e1 -> r2 === e2 ->
- p_y r1 = p_y r2.
+ r1.y = r2.y.
Proof.
move=> v xl rr1 rr2 e1e2 re1 re2.
-have xl': p_x r = p_x (right_pt e1).
+have xl': r.x = (right_pt e1).x.
by apply: le_anti; rewrite xl andbC; case/andP:v.
have:= on_edge_same_point e1e2 re2; rewrite -xl' rr2 eqxx=> /(_ isT)/eqP <-.
have:= on_edge_same_point (right_on_edge _) re1.
by rewrite -xl' rr1 eqxx=>/(_ isT)/eqP<-.
Qed.
-Lemma expand_valid p q (pq : p_x p < p_x q) e r :
+Lemma expand_valid p q (pq : p.x < q.x) e r :
valid_edge (Bedge pq) r ->
valid_edge e p -> valid_edge e q -> valid_edge e r.
Proof.
@@ -1912,7 +1915,7 @@ move=> noc val pue1 pae2 qae1; apply/negP=> que2; set v := valid_edge.
have : [/\ v e1 p, v e2 p, v e1 q & v e2 q].
by split; apply: val; rewrite !inE eqxx ?orbT.
have pr e r: valid_edge e r ->
- exists r', [/\ valid_edge e r, r' === e & p_x r = p_x r'].
+ exists r', [/\ valid_edge e r, r' === e & r.x = r'.x].
move=>/[dup]vr/exists_point_valid[r' /intersection_on_edge [one xx]].
by exists r'; constructor.
move=>[]/pr[p1 [vp1 pone1 p1p]] /pr[p2 [vp2 pone2 p2p]].
@@ -1920,20 +1923,20 @@ move=> /pr[q1 [vq1 qone1 q1q]] /pr[q2 [vq2 qone2 q2q]].
move: vp1 vp2 vq1 vq2 p1p p2p q1q q2q=>vp1 vp2 vq1 vq2 p1p p2p q1q q2q.
move: pone1 pone2 qone1 qone2=>pone1 pone2 qone1 qone2 {pr v val}.
set abbrev := strict_under_edge_lower_y.
-have pylt : p_y p < p_y p1 by rewrite -(abbrev _ _ _ _ pone1).
-have pyge : p_y p2 <= p_y p by rewrite leNgt -(abbrev _ _ _ _ pone2).
-have qyge : p_y q1 <= p_y q by rewrite leNgt -(abbrev _ _ _ _ qone1).
-have qylt : p_y q < p_y q2 by rewrite -(abbrev _ _ _ _ qone2).
-have yp : p_y p2 < p_y p1 by rewrite (le_lt_trans pyge).
-have yq : p_y q1 < p_y q2 by rewrite (le_lt_trans qyge).
+have pylt : p.y < p1.y by rewrite -(abbrev _ _ _ _ pone1).
+have pyge : p2.y <= p.y by rewrite leNgt -(abbrev _ _ _ _ pone2).
+have qyge : q1.y <= q.y by rewrite leNgt -(abbrev _ _ _ _ qone1).
+have qylt : q.y < q2.y by rewrite -(abbrev _ _ _ _ qone2).
+have yp : p2.y < p1.y by rewrite (le_lt_trans pyge).
+have yq : q1.y < q2.y by rewrite (le_lt_trans qyge).
move=> {pyge qyge pylt qylt abbrev}.
-have [/[dup]p1p2 + /[dup] q1q2 +] : [/\ p_x p1 == p_x p2 & p_x q1 == p_x q2].
+have [/[dup]p1p2 + /[dup] q1q2 +] : [/\ p1.x == p2.x & q1.x == q2.x].
by rewrite -p1p p2p -q1q q2q !eqxx.
move=>/eqP/esym/eqP p2p1 /eqP/esym/eqP q2q1.
move: (pone1) (pone2) (qone1) (qone2).
move=>/andP[]pl1 _ /andP[]pl2 _ /andP[]ql1 _ /andP[] ql2 _.
-have [pltq | qltp | pq ] := ltrgtP (p_x p) (p_x q).
-- have [p1q1 p2q2] : p_x p1 < p_x q1 /\ p_x p2 < p_x q2.
+have [pltq | qltp | pq ] := ltrgtP (p.x) (q.x).
+- have [p1q1 p2q2] : p1.x < q1.x /\ p2.x < q2.x.
by rewrite -p1p -q1q -p2p -q2q .
set e3 := Bedge p1q1; set e4 := Bedge p2q2.
have l3a : ~~(left_pt e3 <<= e4).
@@ -1962,7 +1965,7 @@ have [pltq | qltp | pq ] := ltrgtP (p_x p) (p_x q).
by move: yp; rewrite abs ltxx.
have abs := right_ext _ _ _ vq1 piq q1q q2q pi2 qone1 qone2.
by move: yq; rewrite abs ltxx.
-- have [q1p1 q2p2] : p_x q1 < p_x p1 /\ p_x q2 < p_x p2.
+- have [q1p1 q2p2] : q1.x < p1.x /\ q2.x < p2.x.
by rewrite -p1p -q1q -p2p -q2q .
set e3 := Bedge q1p1; set e4 := Bedge q2p2.
have l3u : left_pt e3 <<< e4.
@@ -1998,12 +2001,12 @@ Qed.
Definition pvert_y (p : pt) (e : edge) :=
match vertical_intersection_point p e with
- Some p' => p_y p'
+ Some p' => p'.y
| None => 0
end.
Lemma pvertE p e : valid_edge e p ->
- vertical_intersection_point p e = Some (Bpt (p_x p) (pvert_y p e)).
+ vertical_intersection_point p e = Some (Bpt (p.x) (pvert_y p e)).
Proof.
move=> vep; rewrite /pvert_y.
have [p' p'P] := exists_point_valid vep; rewrite p'P.
@@ -2012,7 +2015,7 @@ by rewrite pxq; case: (p') one.
Qed.
Lemma pvert_on p e : valid_edge e p ->
- Bpt (p_x p) (pvert_y p e) === e.
+ Bpt (p.x) (pvert_y p e) === e.
Proof.
move=> vep; rewrite /pvert_y.
have [p' p'P] := exists_point_valid vep; rewrite p'P.
@@ -2020,17 +2023,17 @@ have [one pxq] := intersection_on_edge p'P.
by rewrite pxq; case: (p') one.
Qed.
-Definition on_pvert p e : p === e -> pvert_y p e = p_y p.
+Definition on_pvert p e : p === e -> pvert_y p e = p.y.
Proof.
move=> /[dup]/andP[] _ vpe pone.
by have := on_edge_same_point pone (pvert_on vpe) (eqxx _) => /eqP ->.
Qed.
Definition cmp_slopes e1 e2 :=
- sg((p_y (right_pt e2) - p_y (left_pt e2)) *
- (p_x (right_pt e1) -p_x (left_pt e1)) -
- (p_y (right_pt e1) - p_y (left_pt e1)) *
- (p_x (right_pt e2) - p_x (left_pt e2))).
+ sg(((right_pt e2).y - (left_pt e2).y) *
+ ((right_pt e1).x -(left_pt e1).x) -
+ ((right_pt e1).y - (left_pt e1).y) *
+ ((right_pt e2).x - (left_pt e2).x)).
Definition pedge_below p e1 e2 :=
(pvert_y p e1 < pvert_y p e2) ||
@@ -2045,9 +2048,9 @@ Lemma same_left_edge_below_slopes e1 e2 :
e1 <| e2 = (0 <= cmp_slopes e1 e2).
Proof.
move=> sameleft.
-rewrite /edge_below/point_under_edge !underE [in X in X || _]sameleft.
+rewrite /edge_below !underE [in X in X || _]sameleft.
rewrite (eqP (proj1 (area3_two_points _ _))) lexx /=.
-rewrite /point_strictly_under_edge !strictE -[in X in _ || X]sameleft -!leNgt.
+rewrite !strictE -[in X in _ || X]sameleft -!leNgt.
rewrite (eqP (proj1 (area3_two_points _ _))) lexx /=.
rewrite !area3E !(proj1 (pue_f_eq_slopes _ _ _ _ _ _)).
rewrite /cmp_slopes sameleft -opprB oppr_le0.
@@ -2062,18 +2065,18 @@ Lemma same_right_edge_below_slopes e1 e2 :
e1 <| e2 = (cmp_slopes e1 e2 <= 0).
Proof.
move=> sameright.
-rewrite /edge_below/point_under_edge !underE [in X in X || _]sameright.
+rewrite /edge_below !underE [in X in X || _]sameright.
rewrite (eqP (proj1 (proj2 (area3_two_points _ _)))) lexx /=.
-rewrite /point_strictly_under_edge !strictE -[in X in _ || X]sameright -!leNgt.
+rewrite !strictE -[in X in _ || X]sameright -!leNgt.
rewrite (eqP (proj1 (proj2 (area3_two_points _ _)))) lexx /= !andbT.
rewrite !area3E !(proj2 (pue_f_eq_slopes _ _ _ _ _ _)).
rewrite /cmp_slopes sameright oppr_le0 opprB.
-rewrite !(mulrC (p_y (right_pt e2) - _)) orbb.
+rewrite !(mulrC ((right_pt e2).y - _)) orbb.
by rewrite sgr_le0 -oppr_ge0 [X in _ = (0 <= X)]opprB.
Qed.
Definition slope e :=
- (p_y (right_pt e) - p_y (left_pt e)) / (p_x (right_pt e) - p_x (left_pt e)).
+ ((right_pt e).y - (left_pt e).y) / ((right_pt e).x - (left_pt e).x).
Lemma cmp_slopesE e1 e2 :
cmp_slopes e1 e2 = sg(slope e2 - slope e1).
@@ -2088,10 +2091,10 @@ rewrite [X in sg(X)]mulrBr 2![in X in sg(X - _)]mulrA.
rewrite [X in sg( X * _ * _ - _)]mulrC.
rewrite 2![in X in sg(_ - X)]mulrA.
rewrite /cmp_slopes.
-set V := (p_x (right_pt e1) - _).
-set W := (p_x (right_pt e2) - _).
-set U := (p_y _ - _).
-set Z := (p_y _ - _).
+set V := ((right_pt e1).x - _).
+set W := ((right_pt e2).x - _).
+set U := (_.y - _).
+set Z := (_.y - _).
have den20 : W != 0 by rewrite -sgr_eq0 den2 oner_neq0.
have den10 : V != 0 by rewrite -sgr_eq0 den1 oner_neq0.
by rewrite (mulrAC V) mulfK // (mulrAC W) mulfK // (mulrC U) (mulrC Z).
@@ -2109,8 +2112,8 @@ have := edge_cond e1.
have := edge_cond e1'.
rewrite -subr_gt0 => den1'.
rewrite subr_eq0.
-set W := (p_x _ - _).
-set V := (p_x _ - _).
+set W := (_.x - _).
+set V := (_.x - _).
have den10 : W != 0.
by rewrite subr_eq0 eq_sym -subr_eq0 lt0r_neq0 // den1.
have den10v : W ^-1 != 0 by rewrite invr_eq0.
@@ -2135,8 +2138,8 @@ have := edge_cond e1.
have := edge_cond e1'.
rewrite -subr_gt0 => den1'.
rewrite subr_eq0.
-set W := (p_x _ - _).
-set V := (p_x _ - _).
+set W := (_.x - _).
+set V := (_.x - _).
have den10 : W != 0.
by rewrite subr_eq0 -subr_eq0 lt0r_neq0 // den1.
have den10v : W ^-1 != 0 by rewrite invr_eq0.
@@ -2160,7 +2163,7 @@ move=> /[dup] on2 /andP[] form val.
suff area3_eq :
sg (area3 (right_pt e1) (left_pt e2) (right_pt e2)) =
-(cmp_slopes e1 e2).
- rewrite /point_under_edge !underE /point_strictly_under_edge !strictE.
+ rewrite !underE !strictE.
rewrite -sgr_le0 area3_eq oppr_le0 sgr_ge0; split;[by [] |].
by rewrite -sgr_lt0 area3_eq oppr_lt0 sgr_gt0.
move: (val) => /andP[] _; rewrite le_eqVlt=> /orP[/eqP atr | le1ltre2].
@@ -2172,7 +2175,7 @@ move: (val) => /andP[] _; rewrite le_eqVlt=> /orP[/eqP atr | le1ltre2].
rewrite area3_opposite area3_cycle.
rewrite sgrN.
rewrite !area3E !(proj1 (pue_f_eq_slopes _ _ _ _ _ _)).
- rewrite -eqps -(mulrC (p_y _ - _)).
+ rewrite -eqps -(mulrC (_.y - _)).
rewrite -[X in _ = - sg (X * _ - _)]opprB -[X in _ = - sg (_ - _ * X)]opprB.
by rewrite mulrN mulNr -opprD opprB.
set e2' := Bedge le1ltre2.
@@ -2183,7 +2186,7 @@ have on2' : left_pt e2' === e2 by exact: on2.
rewrite cmp_slopesE -(on_edge_same_slope_right on2')// -cmp_slopesE.
rewrite cmp_slopesNC.
rewrite area3E (proj1 (pue_f_eq_slopes _ _ _ _ _ _)) /cmp_slopes.
-by rewrite /e2' /= [in LHS](mulrC (p_x _ - _)).
+by rewrite /e2' /= [in LHS](mulrC (_.x - _)).
Qed.
Lemma contact_right_slope e1 e2 :
@@ -2195,7 +2198,7 @@ move=> /[dup] on2 /andP[] form val.
suff area3_eq :
sg (area3 (left_pt e1) (left_pt e2) (right_pt e2)) =
cmp_slopes e1 e2.
- rewrite /point_under_edge !underE /point_strictly_under_edge !strictE.
+ rewrite !underE !strictE.
rewrite -area3_eq -[X in X = _ /\ _]sgr_le0; split; first by [].
by rewrite -[LHS]sgr_lt0.
move: (val) => /andP[] + _; rewrite le_eqVlt eq_sym=> /orP[/eqP atl | le2ltre1].
@@ -2205,7 +2208,7 @@ move: (val) => /andP[] + _; rewrite le_eqVlt eq_sym=> /orP[/eqP atl | le2ltre1].
rewrite atl eqxx => /(_ isT) /eqP; move: (right_pt e1) (left_pt e2) atl.
by move=> [] ? ? [] ? ? /= -> ->.
rewrite !area3E !(proj1 (pue_f_eq_slopes _ _ _ _ _ _)).
- rewrite eqps (mulrC (p_x _ - _)).
+ rewrite eqps (mulrC (_.x - _)).
rewrite -[X in _ = sg (_ * X - _)]opprB -[X in _ = sg (_ - X * _)]opprB.
by rewrite mulrN mulNr -opprD opprB.
set e2' := Bedge le2ltre1.
@@ -2216,12 +2219,12 @@ have on2' : right_pt e2' === e2 by exact: on2.
rewrite cmp_slopesE -(on_edge_same_slope_left on2')// -cmp_slopesE.
rewrite area3_opposite area3_cycle.
rewrite area3E (proj1 (pue_f_eq_slopes _ _ _ _ _ _)) /cmp_slopes.
-rewrite /e2' /= [in LHS](mulrC (p_x _ - _)) opprB.
+rewrite /e2' /= [in LHS](mulrC (_.x - _)) opprB.
by rewrite -4![in LHS](opprB (_ (right_pt e1))) 2!mulrNN.
Qed.
Lemma sub_edge_right (p : pt) (e : edge) : p === e ->
- p_x p < p_x (right_pt e) ->
+ p.x < (right_pt e).x ->
{e' | [/\ left_pt e' = p, right_pt e' = right_pt e &
forall e2, cmp_slopes e' e2 = cmp_slopes e e2]}.
Proof.
@@ -2231,7 +2234,7 @@ by rewrite (@on_edge_same_slope_right e (Bedge dif) one erefl).
Qed.
Lemma sub_edge_left (p : pt) (e : edge) : p === e ->
- p_x (left_pt e) < p_x p ->
+ (left_pt e).x < p.x ->
{e' | [/\ left_pt e' = left_pt e, right_pt e' = p &
forall e2, cmp_slopes e' e2 = cmp_slopes e e2]}.
Proof.
@@ -2242,8 +2245,8 @@ Qed.
Lemma intersection_imp_crossing e1 e2 p :
p === e1 -> p === e2 ->
- p_x (left_pt e1) < p_x p -> p_x p < p_x (right_pt e1) ->
- p_x (left_pt e2) < p_x p -> p_x p < p_x (right_pt e2) ->
+ (left_pt e1).x < p.x -> p.x < (right_pt e1).x ->
+ (left_pt e2).x < p.x -> p.x < (right_pt e2).x ->
~below_alt e1 e2 \/ cmp_slopes e1 e2 == 0.
Proof.
move=> on1 on2 l1ltp pltr1 l2ltp pltr2.
@@ -2268,7 +2271,7 @@ valid_edge low_e p -> valid_edge high_e p ->
vertical_intersection_point p low_e = Some pl ->
vertical_intersection_point p high_e = Some ph ->
low_e <| high_e ->
-p_y pl <= p_y ph.
+pl.y <= ph.y.
Proof.
move => lowv highv vert_pl vert_ph luh.
have := intersection_on_edge vert_pl => [][] poel lx_eq.
@@ -2283,13 +2286,13 @@ have := order_edges_viz_point' pllv plhv luh.
rewrite under_onVstrict // poel /= => [] /= plinfh.
have pluh: pl <<= high_e .
by apply plinfh.
-have px_eq : p_x pl = p_x ph.
+have px_eq : pl.x = ph.x.
by rewrite -lx_eq -hx_eq /=.
by rewrite -(under_edge_lower_y px_eq poeh).
Qed.
Lemma edge_below_equiv p (s : pred edge) :
- {in s, forall e, valid_edge e p && (p_x p < p_x (right_pt e))} ->
+ {in s, forall e, valid_edge e p && (p.x < (right_pt e).x)} ->
{in s &, no_crossing} ->
{in s & , forall e1 e2: edge, (e1 <| e2) = pedge_below p e1 e2}.
Proof.
@@ -2300,12 +2303,12 @@ move: (ve1)=> /pvert_on; rewrite -p1q=> on1.
move=> /[dup] e2in /val /andP[] /[dup] ve2 /exists_point_valid [p2 p2P] re2.
move: (p2P); rewrite (pvertE ve2) =>/esym[] p2q.
move: (ve2)=> /pvert_on; rewrite -p2q=> on2; rewrite /pedge_below.
-have p1p2 : p_x p1 = p_x p2 by rewrite p1q p2q.
+have p1p2 : p1.x = p2.x by rewrite p1q p2q.
have [vylt /= | vylt' /= | vyq] := ltrgtP.
- case: (noc e1 e2 e1in e2in) => // abs.
have := order_below_viz_vertical ve2 ve1 p2P p1P abs; rewrite leNgt.
by rewrite p1q p2q /= vylt.
-- have re1' : p_x p1 < p_x (right_pt e1) by rewrite p1q.
+- have re1' : p1.x < (right_pt e1).x by rewrite p1q.
have p2u : p2 <<< e1.
by rewrite (strict_under_edge_lower_y (esym p1p2)); rewrite // p2q p1q.
have p1a : p1 >>> e2.
@@ -2324,12 +2327,12 @@ move: (ve1) => /andP[] + _; rewrite le_eqVlt=>/orP[/eqP pleft | pmid] /=.
apply/esym/eqP; rewrite pt_eqE.
by rewrite (on_edge_same_point (left_on_edge _) on2) pleft2 p2q eqxx.
by apply: same_left_edge_below_slopes; rewrite -p1l pp.
- have le2ltp2 : p_x (left_pt e2) < p_x p2 by rewrite p2q.
+ have le2ltp2 : (left_pt e2).x < p2.x by rewrite p2q.
have [e2' [le2' re2' sle2']] := sub_edge_left on2 le2ltp2.
have re2'e1 : right_pt e2' === e1 by rewrite re2' -pp.
rewrite /edge_below.
have := (contact_right_slope re2'e1) => /= -[] _; rewrite le2' sle2' => ->.
- have p2ltre2 : p_x p2 < p_x (right_pt e2) by rewrite p2q.
+ have p2ltre2 : p2.x < (right_pt e2).x by rewrite p2q.
have [e2'' [le2'' re2'' sle2'']] := sub_edge_right on2 p2ltre2.
have le2''e1 : left_pt e2'' === e1 by rewrite le2'' -pp.
have := (contact_left_slope le2''e1) => -[] _; rewrite re2'' sle2'' => ->.
@@ -2337,17 +2340,17 @@ move: (ve1) => /andP[] + _; rewrite le_eqVlt=>/orP[/eqP pleft | pmid] /=.
set W := (X in _ || X); have [ | difslope] := boolP W.
rewrite {}/W=>/le_anti/esym=>/eqP.
by rewrite -cmp_slopesNC oppr_eq0 orbT=> /eqP->; rewrite lexx.
- rewrite orbF -p1l pp {1}/point_under_edge underE.
+ rewrite orbF -p1l pp {1}underE.
move: (on2); rewrite /point_on_edge.
move=> /andP[] /eqP -> _; rewrite lexx /=.
by move: (on2); rewrite -pp p1l=>/contact_left_slope=>-[].
-have le1ltp1 : p_x (left_pt e1) < p_x p1 by rewrite p1q.
+have le1ltp1 : (left_pt e1).x < p1.x by rewrite p1q.
have [e1' [le1' re1' sle1']] := sub_edge_left on1 le1ltp1.
have re1'e2 : right_pt e1' === e2 by rewrite re1' pp.
rewrite /edge_below.
set W := (X in X || _); set W' := (X in _ || X).
have := (contact_right_slope re1'e2); rewrite le1' sle1' => /= -[] eq1 _.
-have p1ltre1 : p_x p1 < p_x (right_pt e1) by rewrite p1q.
+have p1ltre1 : p1.x < (right_pt e1).x by rewrite p1q.
have [e1'' [le1'' re1'' sle1'']] := sub_edge_right on1 p1ltre1.
have le1''e2 : left_pt e1'' === e2 by rewrite le1'' pp.
have /= := (contact_left_slope le1''e2); rewrite re1'' sle1'' => - [] /= eq2 _.
@@ -2365,9 +2368,9 @@ move: (ve2) => /andP[] + _; rewrite le_eqVlt => /orP [/eqP l2p | l2ltp].
have/contact_left_slope[_ eq3] : left_pt e2 === e1 by rewrite p2l.
move: on1=>/andP[] /eqP + _; rewrite -p2l => eq4.
rewrite /W' eq3 lt_neqAle -cmp_slopesNC eq_sym oppr_eq0 -Weq difslope andTb.
- rewrite /point_strictly_under_edge strictE.
+ rewrite strictE.
by rewrite -leNgt eq4 lexx -ltNge oppr_lt0.
-have xpp1 : p_x p = p_x p1 by rewrite p1q.
+have xpp1 : p.x = p1.x by rewrite p1q.
move: on2 l2ltp re2; rewrite -pp xpp1 => on2 l2ltp re2.
have := intersection_imp_crossing on1 on2 le1ltp1 p1ltre1 l2ltp re2=> -[[]|abs].
by apply: noc.
@@ -2375,7 +2378,7 @@ by case/negP: difslope; rewrite Weq.
Qed.
Lemma edge_below_equiv' p (s : pred edge) :
- {in s, forall e, valid_edge e p && (p_x (left_pt e) < p_x p)} ->
+ {in s, forall e, valid_edge e p && ((left_pt e).x < p.x)} ->
{in s &, no_crossing} ->
{in s & , forall e1 e2: edge, (e1 <| e2) = pedge_below' p e1 e2}.
Proof.
@@ -2386,12 +2389,12 @@ move: (ve1)=> /pvert_on; rewrite -p1q=> on1.
move=> /[dup] e2in /val /andP[] /[dup] ve2 /exists_point_valid [p2 p2P] le2.
move: (p2P); rewrite (pvertE ve2) =>/esym[] p2q.
move: (ve2)=> /pvert_on; rewrite -p2q=> on2; rewrite /pedge_below'.
-have p1p2 : p_x p1 = p_x p2 by rewrite p1q p2q.
+have p1p2 : p1.x = p2.x by rewrite p1q p2q.
have [vylt /= | vylt' /= | vyq] := ltrgtP.
- case: (noc e1 e2 e1in e2in) => // abs.
have := order_below_viz_vertical ve2 ve1 p2P p1P abs; rewrite leNgt.
by rewrite p1q p2q /= vylt.
-- have le1' : p_x (left_pt e1) < p_x p1 by rewrite p1q.
+- have le1' : (left_pt e1).x < p1.x by rewrite p1q.
have p2u : p2 <<< e1.
by rewrite (strict_under_edge_lower_y (esym p1p2)); rewrite // p2q p1q.
have p1a : p1 >>> e2.
@@ -2410,12 +2413,12 @@ move: (ve1) => /andP[] _ +; rewrite le_eqVlt=>/orP[/eqP pright | pmid] /=.
apply/eqP; rewrite pt_eqE.
by rewrite (on_edge_same_point on2 (right_on_edge _)) -pright2 p2q eqxx.
by apply: same_right_edge_below_slopes; rewrite -p1r pp.
- have p2ltre2 : p_x p2 < p_x (right_pt e2) by rewrite p2q.
+ have p2ltre2 : p2.x < (right_pt e2).x by rewrite p2q.
have [e2' [le2' re2' sle2']] := sub_edge_right on2 p2ltre2.
have le2'e1 : left_pt e2' === e1 by rewrite le2' -pp.
rewrite /edge_below.
have := (contact_left_slope le2'e1) => /= -[] _; rewrite re2' sle2' => ->.
- have le2ltp2 : p_x (left_pt e2) < p_x p2 by rewrite p2q.
+ have le2ltp2 : (left_pt e2).x < p2.x by rewrite p2q.
have [e2'' [le2'' re2'' sle2'']] := sub_edge_left on2 le2ltp2.
have re2''e1 : right_pt e2'' === e1 by rewrite re2'' -pp.
have := (contact_right_slope re2''e1) => -[] _; rewrite le2'' sle2'' => ->.
@@ -2423,17 +2426,17 @@ move: (ve1) => /andP[] _ +; rewrite le_eqVlt=>/orP[/eqP pright | pmid] /=.
set W := (X in _ || X); have [ | difslope] := boolP W.
rewrite {}/W=>/le_anti/esym/eqP.
by rewrite -cmp_slopesNC oppr_eq0 orbT=> /eqP->; rewrite lexx.
- rewrite orbF -p1r pp {2}/point_under_edge underE.
+ rewrite orbF -p1r pp [p2 <<= _]underE.
move: (on2); rewrite /point_on_edge.
move=> /andP[] /eqP -> _; rewrite lexx andbT.
by move: (on2); rewrite -pp p1r=>/contact_right_slope=>-[].
-have p1ltre1 : p_x p1 < p_x (right_pt e1) by rewrite p1q.
+have p1ltre1 : p1.x < (right_pt e1).x by rewrite p1q.
have [e1' [le1' re1' sle1']] := sub_edge_right on1 p1ltre1.
have le1'e2 : left_pt e1' === e2 by rewrite le1' pp.
rewrite /edge_below.
set W := (X in X || _); set W' := (X in _ || X).
have := (contact_left_slope le1'e2); rewrite re1' sle1' => /= -[] eq1 _.
-have le1ltp1 : p_x (left_pt e1) < p_x p1 by rewrite p1q.
+have le1ltp1 : (left_pt e1).x < p1.x by rewrite p1q.
have [e1'' [le1'' re1'' sle1'']] := sub_edge_left on1 le1ltp1.
have re1''e2 : right_pt e1'' === e2 by rewrite re1'' pp.
have /= := (contact_right_slope re1''e2); rewrite le1'' sle1'' => - [] /= eq2 _.
@@ -2451,9 +2454,9 @@ move: (ve2) => /andP[] _; rewrite le_eqVlt => /orP [/eqP r2p | pltr2].
have/contact_right_slope[_ eq3] : right_pt e2 === e1 by rewrite p2r.
move: on1=>/andP[] /eqP + _; rewrite -p2r => eq4.
rewrite /W' eq3 lt_neqAle -cmp_slopesNC oppr_eq0 -Weq difslope andTb.
- by rewrite /W' /point_strictly_under_edge strictE
+ by rewrite /W' strictE
eq4 ltxx andbT -ltNge oppr_gt0.
-have xpp1 : p_x p = p_x p1 by rewrite p1q.
+have xpp1 : p.x = p1.x by rewrite p1q.
move: on2 pltr2 le2; rewrite -pp xpp1 => on2 pltr2 le2.
have := intersection_imp_crossing on1 on2 le1ltp1 p1ltre1 le2 pltr2=> -[[]|abs].
by apply: noc.
@@ -2486,18 +2489,18 @@ by move=> s12 s23; rewrite (le_trans s23 s12).
Qed.
Lemma edge_below_trans p (s : pred edge) :
- {in s, forall e, p_x p < p_x (right_pt e)} \/
- {in s, forall e, p_x (left_pt e) < p_x p} ->
+ {in s, forall e, p.x < (right_pt e).x} \/
+ {in s, forall e, (left_pt e).x < p.x} ->
{in s, forall e, valid_edge e p} -> {in s &, no_crossing} ->
{in s & & , transitive edge_below}.
Proof.
move=> [rbound | lbound] vals noc e2 e1 e3 e2in e1in e3in.
- have valb : {in s, forall e, valid_edge e p && (p_x p < p_x (right_pt e))}.
+ have valb : {in s, forall e, valid_edge e p && (p.x < (right_pt e).x)}.
by move=> e ein; apply/andP; split;[apply: vals | apply: rbound].
rewrite (edge_below_equiv valb noc) // (edge_below_equiv valb noc) //.
rewrite (edge_below_equiv valb noc) //.
by apply: pedge_below_trans.
-have valb : {in s, forall e, valid_edge e p && (p_x (left_pt e) < p_x p)}.
+have valb : {in s, forall e, valid_edge e p && ((left_pt e).x < p.x)}.
by move=> e ein; apply/andP; split;[apply: vals | apply: lbound].
rewrite (edge_below_equiv' valb noc) // (edge_below_equiv' valb noc) //.
rewrite (edge_below_equiv' valb noc) //.
@@ -2507,56 +2510,56 @@ Qed.
Lemma left_pt_above g : left_pt g >>= g.
Proof.
-rewrite /point_strictly_under_edge strictE.
+rewrite strictE.
rewrite (eqP (proj1 (area3_two_points _ _))).
by rewrite ltxx.
Qed.
Lemma right_pt_above g : right_pt g >>= g.
Proof.
-rewrite /point_strictly_under_edge strictE.
+rewrite strictE.
by rewrite (eqP (proj1 (proj2 (area3_two_points _ _)))) ltxx.
Qed.
Lemma left_pt_below g : left_pt g <<= g.
Proof.
-rewrite /point_under_edge underE (eqP (proj1 (area3_two_points _ _))).
+rewrite underE (eqP (proj1 (area3_two_points _ _))).
by rewrite lexx.
Qed.
Lemma right_pt_below g : right_pt g <<= g.
Proof.
-rewrite /point_under_edge underE.
+rewrite underE.
by rewrite (eqP (proj1 (proj2 (area3_two_points _ _)))) lexx.
Qed.
Lemma under_pvert_y (p : pt) (e : edge) :
- valid_edge e p -> (p <<= e) = (p_y p <= pvert_y p e).
+ valid_edge e p -> (p <<= e) = (p.y <= pvert_y p e).
Proof.
move=> val.
-have xs : p_x p = p_x (Bpt (p_x p) (pvert_y p e)) by [].
-have one : Bpt (p_x p) (pvert_y p e) === e by apply: pvert_on.
+have xs : p.x = (Bpt (p.x) (pvert_y p e)).x by [].
+have one : Bpt (p.x) (pvert_y p e) === e by apply: pvert_on.
by rewrite (under_edge_lower_y xs one).
Qed.
Lemma strict_under_pvert_y (p : pt) (e : edge) :
- valid_edge e p -> (p <<< e) = (p_y p < pvert_y p e).
+ valid_edge e p -> (p <<< e) = (p.y < pvert_y p e).
Proof.
move=> val.
-have xs : p_x p = p_x (Bpt (p_x p) (pvert_y p e)) by [].
-have one : Bpt (p_x p) (pvert_y p e) === e by apply: pvert_on.
+have xs : p.x = (Bpt (p.x) (pvert_y p e)).x by [].
+have one : Bpt (p.x) (pvert_y p e) === e by apply: pvert_on.
by rewrite (strict_under_edge_lower_y xs one).
Qed.
Lemma same_x_valid (p1 p2 : pt) (g : edge) :
- p_x p1 == p_x p2 -> valid_edge g p1 = valid_edge g p2.
+ p1.x == p2.x -> valid_edge g p1 = valid_edge g p2.
Proof.
by move=> /eqP xs; rewrite /valid_edge/generic_trajectories.valid_edge xs.
Qed.
Lemma same_pvert_y (p1 p2 : pt) (g : edge) :
valid_edge g p1 ->
- p_x p1 == p_x p2 -> pvert_y p1 g = pvert_y p2 g.
+ p1.x == p2.x -> pvert_y p1 g = pvert_y p2 g.
Proof.
move=> vg xs; apply/eqP.
move: (vg) ; rewrite (same_x_valid _ xs) => vg2.
@@ -2596,8 +2599,8 @@ have vg1 : valid_edge g1 p.
by apply: (allP aval); rewrite !(mem_cat, inE) eqxx ?orbT.
have vg2 : valid_edge g2 p.
by apply: (allP aval); rewrite !(mem_cat, inE) eqxx ?orbT.
-have pg1y : pvert_y p g1 <= p_y p by rewrite leNgt -strict_under_pvert_y.
-have pg2y : p_y p < pvert_y p g2 by rewrite -strict_under_pvert_y.
+have pg1y : pvert_y p g1 <= p.y by rewrite leNgt -strict_under_pvert_y.
+have pg2y : p.y < pvert_y p g2 by rewrite -strict_under_pvert_y.
have g1g2 : pvert_y p g1 < pvert_y p g2 by apply: (le_lt_trans pg1y).
have mp : {in s1++ g1 :: g2 :: s2 &,
{homo (pvert_y p) : x y / x <| y >-> x <= y}}.
@@ -2745,8 +2748,8 @@ have aval'' : all (valid_edge^~ r) (le :: s').
have tr : transitive (relpre (pvert_y r) <=%R).
by move=> y x z; rewrite /=; apply: le_trans.
have le_g' : pvert_y r le < pvert_y r g'.
- have le_r : pvert_y r le < p_y r by rewrite ltNge -under_pvert_y.
- have r_g' : p_y r <= pvert_y r g' by rewrite -under_pvert_y.
+ have le_r : pvert_y r le < r.y by rewrite ltNge -under_pvert_y.
+ have r_g' : r.y <= pvert_y r g' by rewrite -under_pvert_y.
by apply: lt_le_trans le_r r_g'.
have g_le : pvert_y r g <= pvert_y r le.
move: gin; rewrite mem_rcons inE=> /orP[/eqP -> |gin]; first by rewrite lexx.
@@ -2793,8 +2796,8 @@ have aval'' : all (valid_edge^~ r) (he :: s').
have tr : transitive (relpre (pvert_y r) <=%R).
by move=> y x z; rewrite /=; apply: le_trans.
have g_he : pvert_y r g < pvert_y r he.
- have r_he : p_y r < pvert_y r he by rewrite -strict_under_pvert_y.
- have g_r : pvert_y r g <= p_y r by rewrite leNgt -strict_under_pvert_y.
+ have r_he : r.y < pvert_y r he by rewrite -strict_under_pvert_y.
+ have g_r : pvert_y r g <= r.y by rewrite leNgt -strict_under_pvert_y.
by apply: le_lt_trans g_r r_he.
have he_g' : pvert_y r he <= pvert_y r g'.
move: pth; rewrite cat_path last_rcons => /andP[] _.
From 6e4a54f96e9eed783323d4ae848742f72b907fd2 Mon Sep 17 00:00:00 2001
From: Reynald Affeldt
Date: Fri, 26 Apr 2024 11:03:22 +0900
Subject: [PATCH 25/43] bool -> Prop
---
theories/cells.v | 23 +-
theories/cells_alg.v | 96 ++--
theories/opening_cells.v | 19 +-
theories/points_and_edges.v | 871 ++++++++++++++++--------------------
theories/safe_cells.v | 23 +-
5 files changed, 449 insertions(+), 583 deletions(-)
diff --git a/theories/cells.v b/theories/cells.v
index 54b3cfe..5cd8421 100644
--- a/theories/cells.v
+++ b/theories/cells.v
@@ -124,7 +124,7 @@ Lemma inside_open'E p c :
p_x p <= open_limit c].
Proof.
rewrite /inside_open' /inside_open_cell contains_pointE.
-rewrite /point_strictly_under_edge strictE -leNgt !le_eqVlt.
+rewrite strictE -leNgt !le_eqVlt.
rewrite [in _ >>> low c]/point_under_edge -ltNge subrr.
by case: (0 < _); case: (_ < p_x p); rewrite ?andbF ?orbT ?andbT.
Qed.
@@ -141,7 +141,6 @@ Lemma inside_closed'E p c :
p_x p <= right_limit c].
Proof.
rewrite /inside_closed' /inside_closed_cell contains_pointE.
-rewrite /point_strictly_under_edge.
rewrite strictE -leNgt !le_eqVlt.
rewrite [in _ >>> low c]/point_under_edge -ltNge subrr.
by case: (0 < _); case: (_ < p_x p); rewrite ?andbF ?orbT ?andbT.
@@ -374,15 +373,14 @@ Proof.
rewrite contains_pointE /event_close_edge .
move => rf val [/eqP rlc | /eqP rhc].
move : rf val.
- rewrite /point_strictly_under_edge !strictE -rlc {rlc e}.
- have := (area3_two_points (right_pt (low c)) (left_pt (low c))) => [][] _ [] /eqP -> _ .
- rewrite lt_irreflexive /=.
- rewrite /edge_below.
+ rewrite !strictE -rlc {rlc e}.
+ have := area3_two_points (right_pt (low c)) (left_pt (low c)) => [][] _ [] -> _.
+ rewrite ltxx /= /edge_below.
move => /orP [] /andP [] //= => pablhlow pabrhlow [] _ validrlhigh.
apply: not_strictly_above pablhlow pabrhlow validrlhigh.
move : rf val.
-rewrite /point_under_edge underE -rhc {rhc}.
-have := (area3_two_points (right_pt (high c)) (left_pt (high c))) => [] [] _ [] /eqP -> _ /=.
+rewrite underE -rhc {rhc}.
+have := area3_two_points (right_pt (high c)) (left_pt (high c)) => [] [] _ [] -> _ /=.
rewrite le_refl /edge_below /= andbT=> /orP [] /andP [] //= => pablhlow pabrhlow [] valrhlow _ .
apply : not_strictly_under pablhlow pabrhlow valrhlow.
Qed.
@@ -430,18 +428,19 @@ set e2 := @Bedge R (Bpt 0 2) (Bpt 1 1) ltr01.
set p := (Bpt 3%:R 0).
set c := Bcell [::] [::] e1 e2.
have exrf : s_right_form [:: c].
- rewrite /= /= /e1 /e2 /edge_below /= /point_under_edge !underE /=.
- rewrite /point_strictly_under_edge !strictE /=.
+ rewrite /= andbT /e1 /e2 /edge_below /=.
+ rewrite /generic_trajectories.point_under_edge !underE /=.
+ rewrite /generic_trajectories.point_under_edge !strictE /=.
rewrite !(mul0r, subrr, mul1r, subr0, add0r, addr0, oppr0, opprK, addrK).
rewrite le_refl lt_irreflexive /= !andbT.
rewrite -[X in X - 2%:R]/(1%:R) -opprB -natrB // -[(2-1)%N]/1%N.
by rewrite lerN10.
have plow : p <<< low (head dummy_cell [:: c]).
- rewrite /point_strictly_under_edge strictE /=.
+ rewrite strictE /=.
by rewrite !(mul0r, subrr, mul1r, subr0, add0r, addr0, oppr0, opprK) ltrN10.
have := abs [::c] p isT isT exrf plow c.
rewrite inE=> /(_ (eqxx _))=> [][] _.
-rewrite /point_strictly_under_edge strictE /=.
+rewrite strictE /=.
rewrite
!(mul0r, subrr, mul1r, subr0, add0r, addr0, oppr0, opprK, mulr1, addrK).
rewrite -natrM -!natrB // -[X in X%:R]/(1%N).
diff --git a/theories/cells_alg.v b/theories/cells_alg.v
index 031ce72..ed9680c 100644
--- a/theories/cells_alg.v
+++ b/theories/cells_alg.v
@@ -1840,14 +1840,14 @@ case lptsq : (left_pts lsto) => [ | p1 [ | p2 lpts]] //.
by move: lstok; rewrite /open_cell_side_limit_ok lptsq.
have /andP[p1onh p1onl] : (p1 === high lsto) && (p1 === low lsto).
by move: lstok; rewrite /open_cell_side_limit_ok /left_limit lptsq /= eqxx /=.
-have /eqP samex : p_x (point e) = p_x p1.
+have samex : p_x (point e) = p_x p1.
by have := pxhere; rewrite lstxq /left_limit lptsq /=.
suff : p_y (point e) < p_y (point e) by rewrite lt_irreflexive.
-have := same_pvert_y vho samex.
-rewrite (on_pvert p1onh).
+have := same_pvert_y vho samex.
+rewrite (on_pvert p1onh).
have := under_pvert_y vho; move: (puh)=> /[swap] -> /[swap] ->.
move=> /le_lt_trans; apply.
-have := under_pvert_y vlo; move: (pal) => /[swap] ->.
+have := under_pvert_y vlo; move: (pal) => /[swap] ->.
rewrite (same_pvert_y vlo samex).
by rewrite -ltNge (on_pvert p1onl).
Qed.
@@ -1973,13 +1973,13 @@ move=> /andP[] /andP[] /[dup] /eqP p1x -> /andP[] -> ->.
move=> /andP[] /andP[] -> -> /andP[] p1on ->.
rewrite /= !andbT.
have p1e : p1 = (point e).
- have /eqP samex : p_x (point e) = p_x p1.
+ have samex : p_x (point e) = p_x p1.
by have := pxhere; rewrite lstxq /left_limit lptsq /= p1x.
- have /eqP samey : p_y (point e) = p_y p1.
+ have samey : p_y (point e) = p_y p1.
have eonlsthe' : point e === high lsto.
by apply: under_above_on=> //; rewrite -lstheq // ?underW.
- by have /eqP := on_edge_same_point eonlsthe' p1on samex.
- by apply/esym/(@eqP pt); rewrite pt_eqE samex samey.
+ exact: (on_edge_same_point eonlsthe' p1on samex).
+ by apply/esym/(@eqP pt); rewrite pt_eqE samex samey !eqxx.
rewrite p1e /generic_trajectories.pvert_y subrr -strict_under_pvert_y //.
by rewrite puh -pxe pvert_on.
Qed.
@@ -2385,7 +2385,7 @@ Lemma lexPt_left_pt_strict_under_edge_to_p_x (pt : pt) g:
p_x (left_pt g) < p_x pt.
Proof.
move=> vg.
-rewrite /lexPt eq_sym=> /orP[ | /andP[] samex]; first by [].
+rewrite /lexPt eq_sym=> /orP[ | /andP[] /eqP samex]; first by [].
have := same_pvert_y vg samex.
rewrite (on_pvert (left_on_edge g))=> <-.
rewrite ltNge le_eqVlt negb_or andbC.
@@ -2493,7 +2493,7 @@ rewrite inE => /orP[/eqP -> | ].
have [_ /= ] := adjacent_opening_aux vle vhe oute3 oca_eq => ->.
rewrite /=.
move=> /on_edge_same_point /[apply] /=.
- rewrite xcond /left_limit lptsq /= eqxx => /(_ isT) /eqP ->.
+ rewrite xcond /left_limit lptsq /= => /(_ erefl) ->.
by apply/(@eqP pt); rewrite pt_eqE /= !eqxx.
by [].
move=> c1in; exists c1; first by rewrite inE c1in orbT.
@@ -3821,7 +3821,7 @@ have vhe : valid_edge lsthe (point e).
move: (allP sval lsto); rewrite /open mem_cat inE eqxx !orbT.
by move=> /(_ isT)=> /andP[]; rewrite lstheq.
move: puh; rewrite under_pvert_y //.
-move: (samex)=> /esym/eqP=> samex'.
+move: (samex)=> /esym samex'.
rewrite (same_pvert_y vhe samex').
by rewrite (on_pvert (left_on_edge _)) leNgt lty.
Qed.
@@ -4390,13 +4390,13 @@ have [yle | yabove] := lerP (p_y pt') (p_y (point e)).
by apply: valid_edge_extremities; rewrite (oute lco).
move: pin => /andP[] + _; rewrite under_pvert_y; last first.
by move: vlce; rewrite /valid_edge/generic_trajectories.valid_edge ppe.
- rewrite -(same_pvert_y vlce); last by apply/eqP.
+ rewrite -(same_pvert_y vlce)//.
by rewrite on_pvert ?yle // -(eqP (oute lco)) // left_on_edge.
have plec : contains_point' pt' lec.
rewrite /contains_point' -leq pale.
rewrite under_pvert_y //.
apply: (le_trans yle).
- rewrite -(same_pvert_y vhlece); last by apply/eqP.
+ rewrite -(same_pvert_y vhlece)//.
rewrite -under_pvert_y //.
case ccq': cc => [ | cc0 ccs].
by move: ccq; rewrite ccq' /= => -[] <- _; rewrite -heq; apply/underW.
@@ -4443,8 +4443,7 @@ have plcc : contains_point' pt' lcc.
by apply: valid_edge_extremities; rewrite (oute hco).
move: (pin) => /andP[] _; rewrite under_pvert_y; last first.
by move: vhce; rewrite /valid_edge/generic_trajectories.valid_edge ppe.
- rewrite -(same_pvert_y vhce); last by apply/eqP.
- rewrite on_pvert; last first.
+ rewrite -(same_pvert_y vhce)// on_pvert; last first.
by rewrite -(eqP (oute hco)) // left_on_edge.
move=> ple.
have ppe': p_y pt' = p_y (point e).
@@ -4457,9 +4456,8 @@ have plcc : contains_point' pt' lcc.
have vllccp : valid_edge (low lcc) pt'.
by move: vllcce; rewrite /valid_edge/generic_trajectories.valid_edge ppe.
rewrite under_pvert_y // -?ltNge.
- apply: le_lt_trans yabove.
- rewrite -(same_pvert_y vllcce); last by apply/eqP.
- rewrite leNgt -strict_under_pvert_y //.
+ apply: le_lt_trans yabove.
+ rewrite -(same_pvert_y vllcce)// leNgt -strict_under_pvert_y //.
by have /andP[] := lcc_ctn.
have [/eqP lbnd' | safe] := boolP(left_limit lcc == p_x pt').
rewrite closeeq has_cat /= orbA.
@@ -4761,7 +4759,7 @@ have /andP [vlcc vhcc] : valid_edge (low lcc) (point e) &&
have := right_limit_close_cell vlcc vhcc.
rewrite /in_safe_side_right.
move=> ->.
-have [samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
+have [/eqP samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
have [-> -> _] := close_cell_preserve_3sides (point e) lcc.
rewrite -heq.
have eonllcc : (point e) === low lcc.
@@ -4772,10 +4770,8 @@ have eonllcc : (point e) === low lcc.
move=> + /(_ cc2) =>/[swap] /[apply].
move: adj; rewrite ocd ccq cat_rcons; do 2 move =>/adjacent_catW[] _.
by move=> /= /andP[] /eqP ->.
-have vppl : valid_edge (low lcc) pp.
- by rewrite (same_x_valid _ samex).
-have vpphe : valid_edge he pp.
- by rewrite (same_x_valid _ samex).
+have vppl : valid_edge (low lcc) pp by rewrite (same_x_valid _ samex).
+have vpphe : valid_edge he pp by rewrite (same_x_valid _ samex).
rewrite (under_pvert_y vppl) (same_pvert_y vppl samex) -ltNge.
rewrite (on_pvert eonllcc).
rewrite (andbC _ (pp <<< he)).
@@ -4813,17 +4809,15 @@ have /andP [vlcc1 vhcc1] : valid_edge (low cc1) (point e) &&
have := right_limit_close_cell vlcc1 vhcc1.
rewrite /in_safe_side_right.
move=> ->.
-have [samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
+have [/eqP samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
have [-> -> _] := close_cell_preserve_3sides (point e) cc1.
rewrite -leq.
have eonhcc1 : (point e) === high cc1.
have := open_cells_decomposition_point_on cbtom adj
(inside_box_between inbox_e) sval oe.
by move=> /(_ cc1 (mem_head _ _)).
-have vpph : valid_edge (high cc1) pp.
- by rewrite (same_x_valid _ samex).
-have vpple : valid_edge le pp.
- by rewrite (same_x_valid _ samex).
+have vpph : valid_edge (high cc1) pp by rewrite (same_x_valid _ samex).
+have vpple : valid_edge le pp by rewrite (same_x_valid _ samex).
rewrite (strict_under_pvert_y vpph) (same_pvert_y vpph samex).
rewrite (on_pvert eonhcc1).
have [ppue /= | ] := boolP (p_y pp < p_y (point e)); last by [].
@@ -4868,11 +4862,9 @@ have eonl : point e === low c'.
by apply: allon; rewrite ccq -cat_cons mem_cat mem_last.
rewrite /in_safe_side_right cq=> ->.
have [-> -> _] := close_cell_preserve_3sides (point e) c'.
-have [samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
-have vpph : valid_edge (high c') pp.
- by rewrite (same_x_valid _ samex).
-have vppl : valid_edge (low c') pp.
- by rewrite (same_x_valid _ samex).
+have [/eqP samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
+have vpph : valid_edge (high c') pp by rewrite (same_x_valid _ samex).
+have vppl : valid_edge (low c') pp by rewrite (same_x_valid _ samex).
rewrite (strict_under_pvert_y vpph) (same_pvert_y vpph samex).
rewrite (on_pvert eonh).
rewrite (under_pvert_y vppl) (same_pvert_y vppl samex).
@@ -4914,7 +4906,7 @@ have [ppe | ppne] := eqVneq (pp : pt) (point e).
have := right_limit_close_cell vllcc vhlcc.
rewrite /in_safe_side_right.
move=> ->.
-have [samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
+have [/eqP samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
have [-> -> _] := close_cell_preserve_3sides (point e) lcc.
rewrite -heq -leq.
have puhy : p_y (point e) < pvert_y (point e) he.
@@ -4942,9 +4934,9 @@ have [pu | ] := ltrP (p_y pp) (p_y (point e)).
apply/negbTE; move: (ppuhe).
rewrite (strict_under_pvert_y vpphe) lt_neqAle=> /andP[] + _.
by rewrite (same_pvert_y vpphe samex).
- by rewrite ppaly ppuhy ppuhe.
+ by rewrite ppaly ppuhy ppuhe !eqxx.
rewrite le_eqVlt => /orP[samey | /[dup] pa ->].
- by case/negP: ppne; rewrite pt_eqE samex eq_sym samey.
+ by case/negP: ppne; rewrite pt_eqE samex eq_sym samey !eqxx.
rewrite andbF andbT /=.
have [ppuhe /= | ] := boolP (pp <<< he); last by [].
@@ -4961,7 +4953,7 @@ have ppuhy : (p_y pp == pvert_y (point e) he) = false.
apply/negbTE; move: (ppuhe).
rewrite (strict_under_pvert_y vpphe) lt_neqAle=> /andP[] + _.
by rewrite (same_pvert_y vpphe samex).
-by rewrite ppale ppuhy ppaly.
+by rewrite ppale ppuhy ppaly !eqxx.
Qed.
Lemma sides_equiv fc cc lcc lc le he:
@@ -6115,10 +6107,9 @@ have safe_cl : {in events_to_edges [:: ev] & [:: close_cell (point ev) op0],
rewrite right_limit_close_cell // => /eqP samex.
move/negP;apply.
suff -> : p = point ev by rewrite close_cell_in.
- apply /(@eqP pt); rewrite pt_eqE samex eqxx.
- apply: (on_edge_same_point pong).
- by rewrite -lgq left_on_edge.
- by apply/eqP.
+ apply/eqP; rewrite pt_eqE samex eqxx/=; apply/eqP.
+ apply: (on_edge_same_point pong) => //.
+ by rewrite -lgq left_on_edge.
have safe_op : {in events_to_edges [:: ev] & nos ++ [:: lno],
forall g c p, in_safe_side_left p c -> ~ p === g}.
move=> g c gin cin p pin pong.
@@ -6130,12 +6121,12 @@ have safe_op : {in events_to_edges [:: ev] & nos ++ [:: lno],
move: pin=> /andP[] + /andP[] _ /andP[] _.
have := opening_cells_left oute vb0 vt0.
have := opening_cells_in vb0 vt0 oute.
- rewrite /opening_cells oca_eq=> /(_ _ cin) evin /(_ _ cin) -> samex.
+ rewrite /opening_cells oca_eq=> /(_ _ cin) evin /(_ _ cin) -> /eqP samex.
move/negP; apply.
suff -> : p = point ev.
by apply: (opening_cells_in vb0 vt0 oute); rewrite /opening_cells oca_eq.
- apply/(@eqP pt); rewrite pt_eqE samex /=.
- by apply: (on_edge_same_point pong eong samex).
+ apply/eqP; rewrite pt_eqE samex eqxx/=; apply/eqP.
+ apply: (on_edge_same_point pong eong samex) => //.
have cl_no_event : {in [:: ev] & [:: close_cell (point ev) op0],
forall e c (p : pt), in_safe_side_left p c || in_safe_side_right p c ->
p != point e}.
@@ -6515,13 +6506,13 @@ have cl_safe_edge :
move=> /oute /eqP lgq /andP[] _ /andP[]; rewrite lgq leNgt=> /negP[].
by rewrite (eqP pl); apply: lolt; rewrite // inE eqxx.
have vc' : valid_cell c' (point ev) by apply/andP/(allP sval).
- have samex : p_x p == p_x (point ev).
+ have /eqP samex : p_x p == p_x (point ev).
by move: pin=> /andP[] + _; rewrite close_cell_right_limit.
move: gin; rewrite mem_cat=> /orP[gin | /oute/eqP lgq ]; last first.
have peg : point ev === g by rewrite -lgq left_on_edge.
move=> pong.
- have samey := on_edge_same_point pong peg samex.
- have pev : p = point ev by apply/eqP; rewrite pt_eqE samex samey.
+ have /eqP samey := on_edge_same_point pong peg samex.
+ have pev : p = point ev by apply/eqP; rewrite pt_eqE samex samey eqxx.
have := not_safe_event (close_cell (point ev) c').
rewrite -[e in in_safe_side_right e _]pev pin orbT.
by rewrite /closing_cells -map_rcons map_f // => /(_ isT).
@@ -6530,8 +6521,7 @@ have cl_safe_edge :
move=> [[ | pcc0 pcc] []]; first by [].
move=> _ /= [pccsub [pcchigh [_ [_ rlpcc]]]] /andP[] _ /andP[] _.
rewrite leNgt=> /negP; apply.
- rewrite (eqP samex).
- rewrite -rlpcc; apply:rl; last by rewrite inE eqxx.
+ rewrite samex -rlpcc; apply:rl; last by rewrite inE eqxx.
by apply/pccsub; rewrite /last_cell /= mem_last.
move=> [] opc [] pcc [] _ [] opch [] _ [] opco _ abs.
have [vlc'p vhc'p] : valid_edge (low c') p /\ valid_edge (high c') p.
@@ -6563,9 +6553,9 @@ have cl_safe_edge :
move=> /(_ p) + ; move=>/negP.
rewrite inside_open'E stricter valid_open_limit //.
move: cnt; rewrite contains_pointE=> /andP[] _ ->.
- rewrite (eqP samex) lolt //=; last by rewrite inE eqxx.
+ rewrite samex lolt //=; last by rewrite inE eqxx.
rewrite inside_open'E (underW puhc') palc' valid_open_limit //.
- by rewrite (eqP samex) lolt // inE eqxx.
+ by rewrite samex lolt // inE eqxx.
move=> ponl.
have vbp : valid_edge bottom p.
by rewrite (same_x_valid _ samex) (inside_box_valid_bottom inbox_e).
@@ -6597,7 +6587,7 @@ have cl_safe_edge :
have opcok : open_cell_side_limit_ok opc by apply: (allP (sides_ok c_inv)).
move=> /(_ _ ponl ponh); rewrite !inE=> /orP[/eqP pleft | /eqP].
have : left_limit opc < p_x p.
- by rewrite (eqP samex); apply: lolt; rewrite // inE eqxx.
+ by rewrite samex; apply: lolt; rewrite // inE eqxx.
have := left_limit_max opcok.
have [_ | ] := lerP (p_x (left_pt (high opc)))(p_x (left_pt (low opc))).
by move=> /le_lt_trans /[apply]; rewrite pleft lt_irreflexive.
@@ -6631,7 +6621,7 @@ have cl_safe_edge :
have /andP[_ /=]:= general_pos c_inv.
rewrite path_sortedE; last by move=> ? ? ?; apply: lt_trans.
move=> /andP[] /allP /(_ e2 e2in).
- by rewrite -pe2 -prl (eqP samex) lt_irreflexive.
+ by rewrite -pe2 -prl samex ltxx.
have op_safe_edge :
{in events_to_edges (rcons p_set ev) & state_open_seq rstate,
forall g c p, in_safe_side_left p c -> ~ p === g}.
diff --git a/theories/opening_cells.v b/theories/opening_cells.v
index 9064180..fb4f971 100644
--- a/theories/opening_cells.v
+++ b/theories/opening_cells.v
@@ -961,7 +961,7 @@ have lnoin : lno \in opening_cells (point e) (outgoing e) le he.
by rewrite oeq mem_rcons mem_head.
rewrite /in_safe_side_left.
have := opening_cells_left oute vle vhe lnoin=> ->.
-have [samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
+have [/eqP samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
have highlno : high lno = he.
by have := opening_cells_aux_high_last vle vhe oute'; rewrite oca_eq.
rewrite highlno [in RHS]andbC.
@@ -985,7 +985,7 @@ have /oute lfnoq : high (last fno nos') \in outgoing e.
rewrite ?mem_head // last_rcons inE map_rcons mem_rcons mem_head orbT.
have eonl : point e === low lno by rewrite llnoq -(eqP lfnoq) left_on_edge.
have ppal : (pp >>> low lno) = (p_y (point e) < p_y pp).
- have := under_edge_lower_y (eqP samex) eonl => ->.
+ have := under_edge_lower_y samex eonl => ->.
by rewrite -ltNge.
rewrite ppal.
have := opening_cells_last_left_pts vle vhe oute ogn0 puh.
@@ -1024,7 +1024,7 @@ rewrite -[pt_eqb _ _ _ _]/(_ == _ :> pt).
case: ifP=> // samept.
have := pvert_on vle; rewrite -(eqP samept) => onle.
have /andP[/eqP pf _] := onle.
-by move: pal; rewrite /point_under_edge underE pf le_eqVlt eqxx.
+by move: pal; rewrite underE pf le_eqVlt eqxx.
Qed.
Lemma first_opening_cells_side_char e le he pp fno nos lno :
@@ -1048,7 +1048,7 @@ have fnoin : fno \in opening_cells (point e) (outgoing e) le he.
by rewrite oeq mem_rcons !inE eqxx orbT.
rewrite /in_safe_side_left.
have := opening_cells_left oute vle vhe fnoin=> ->.
-have [samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
+have [/eqP samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
have lowfno : low fno = le.
by rewrite (lower_edge_new_cells vle vhe oeq).
rewrite lowfno.
@@ -1063,7 +1063,7 @@ have /oute hfnoq : high fno \in outgoing e.
by rewrite mem_head.
have eonh : point e === high fno by rewrite -(eqP hfnoq) left_on_edge.
have ppue : (pp <<< high fno) = (p_y pp < p_y (point e)).
- by have := strict_under_edge_lower_y (eqP samex) eonh.
+ by have := strict_under_edge_lower_y samex eonh.
rewrite ppue.
have := opening_cells_first_left_pts he vle ogn0 pal.
rewrite oca_eq /= => ->.
@@ -1147,7 +1147,7 @@ rewrite (pvertE vle) (pvertE vhe) /= orbF.
set c := Bcell _ _ _ _.
move=> /(_ _ (mem_head _ _)).
rewrite /in_safe_side_left /= => ->.
-have [samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
+have [/eqP samex /= | ] := boolP (p_x pp == p_x (point e)); last by [].
rewrite andbCA.
have puhy : p_y (point e) < pvert_y (point e) he.
by rewrite -(strict_under_pvert_y vhe).
@@ -1161,8 +1161,8 @@ have vpple : valid_edge le pp by rewrite (same_x_valid _ samex).
have vpphe : valid_edge he pp by rewrite (same_x_valid _ samex).
have [ | pa] := lerP (p_y pp) (p_y (point e)); rewrite ?(andbF, orbF).
- rewrite le_eqVlt => /orP[samey | /[dup] pu ->].
- by case/negP: ppne; rewrite pt_eqE samex samey.
+ rewrite le_eqVlt => /orP[/eqP samey | /[dup] pu ->].
+ by case/negP: ppne; rewrite pt_eqE samex samey !eqxx.
have [ppale | _] := boolP (pp >>> le); last by [].
have -> : pp <<< he.
rewrite (strict_under_pvert_y vpphe).
@@ -1248,7 +1248,7 @@ Lemma half_between_edges (g1 g2 : edge) p :
(Bpt (p_x p) ((pvert_y p g1 + pvert_y p g2) / 2)) <<< g2.
Proof.
move=> vg1 vg2 pal puh; set p1 := Bpt _ _.
-have samex : p_x p1 == p_x p by rewrite eqxx.
+have samex : p_x p1 = p_x p by [].
have v1g1 : valid_edge g1 p1 by rewrite (same_x_valid _ samex).
have v1g2 : valid_edge g2 p1 by rewrite (same_x_valid _ samex).
rewrite (under_pvert_y v1g1) (strict_under_pvert_y v1g2) -ltNge; apply/andP.
@@ -1392,4 +1392,3 @@ End opening_cells.
End proof_environment.
End working_environment.
-
diff --git a/theories/points_and_edges.v b/theories/points_and_edges.v
index 86f3e1b..1c19412 100644
--- a/theories/points_and_edges.v
+++ b/theories/points_and_edges.v
@@ -28,8 +28,8 @@ Lemma pt_eqP : Equality.axiom (pt_eqb R eq_op).
Proof.
rewrite /Equality.axiom.
move=> [a_x a_y] [b_x b_y]; rewrite /pt_eqb/=.
-have [/eqP <-|/eqP anb] := boolP(a_x == b_x).
- have [/eqP <- | /eqP anb] := boolP(a_y == b_y).
+have [/eqP <-|/eqP anb] := boolP (a_x == b_x).
+ have [/eqP <- | /eqP anb] := boolP (a_y == b_y).
by apply: ReflectT.
by apply : ReflectF => [][].
by apply: ReflectF=> [][].
@@ -37,8 +37,7 @@ Qed.
HB.instance Definition _ := hasDecEq.Build _ pt_eqP.
-Lemma pt_eqE (p1 p2 : pt) :
- (p1 == p2) = (p1.x == p2.x) && (p1.y == p2.y).
+Lemma pt_eqE (p1 p2 : pt) : (p1 == p2) = (p1.x == p2.x) && (p1.y == p2.y).
Proof. by move: p1 p2 => [? ?][? ?]. Qed.
Record edge := Bedge {left_pt : pt; right_pt : pt;
@@ -55,8 +54,8 @@ Proof. by move: e => [l r c]. Qed.
Lemma edge_eqP : Equality.axiom edge_eqb.
Proof.
move=> [a1 b1 p1] [a2 b2 p2] /=.
-have [/eqP a1a2 | /eqP a1na2] := boolP(a1 == a2).
- have [/eqP b1b2 | /eqP b1nb2] := boolP(b1 == b2).
+have [/eqP a1a2 | /eqP a1na2] := boolP (a1 == a2).
+ have [/eqP b1b2 | /eqP b1nb2] := boolP (b1 == b2).
move: p1 p2. rewrite -a1a2 -b1b2 => p1 p2.
rewrite (eqtype.bool_irrelevance p1 p2).
by apply: ReflectT.
@@ -175,7 +174,8 @@ Proof.
mc_ring.
Qed.
-Lemma pue_f_inter p_x a_x a_y b_x b_y : b_x != a_x -> (pue_f p_x ((p_x - a_x)* ((b_y - a_y)/(b_x - a_x)) + a_y) a_x a_y b_x b_y) == 0.
+Lemma pue_f_inter p_x a_x a_y b_x b_y : b_x != a_x ->
+ pue_f p_x ((p_x - a_x)* ((b_y - a_y)/(b_x - a_x)) + a_y) a_x a_y b_x b_y = 0.
Proof.
rewrite /pue_f.
rewrite -subr_eq0 => h.
@@ -183,17 +183,18 @@ set slope := (_ / _).
rewrite (mulrDr b_x).
rewrite (mulrDr a_x).
-rewrite -(orbF (_==0)).
-rewrite -(negbTE h).
+apply/eqP.
+rewrite -(orbF (_ == 0)).
+rewrite -(negbTE h).
rewrite -mulf_eq0 .
-rewrite ! ( mulrBl (b_x - a_x), fun x y => mulrDl x y (b_x - a_x)).
+rewrite ! ( mulrBl (b_x - a_x), fun x y => mulrDl x y (b_x - a_x)).
rewrite /slope !mulrA !mulfVK //.
apply/eqP; mc_ring.
Qed.
Lemma pue_f_inters p_x p_y a_x a_y b_x b_y : b_x != a_x -> p_y = ((p_x - a_x) * ((b_y - a_y) / (b_x - a_x)) + a_y) ->
-pue_f p_x p_y a_x a_y b_x b_y == 0.
+pue_f p_x p_y a_x a_y b_x b_y = 0.
Proof.
move => h ->.
by apply pue_f_inter; rewrite h.
@@ -201,46 +202,30 @@ by apply pue_f_inter; rewrite h.
Qed.
-Lemma pue_f_eq p_x p_y a_x a_y :
-pue_f p_x p_y p_x p_y a_x a_y == 0.
-Proof.
-rewrite /pue_f /=.
-
-apply /eqP.
-mc_ring.
-Qed.
+Lemma pue_f_eq p_x p_y a_x a_y : pue_f p_x p_y p_x p_y a_x a_y = 0.
+Proof. by rewrite /pue_f /=; mc_ring. Qed.
Lemma pue_f_two_points p_x p_y a_x a_y :
-pue_f p_x p_y p_x p_y a_x a_y == 0 /\ pue_f p_x p_y a_x a_y p_x p_y == 0 /\
-pue_f p_x p_y a_x a_y a_x a_y == 0.
+ pue_f p_x p_y p_x p_y a_x a_y = 0 /\
+ pue_f p_x p_y a_x a_y p_x p_y = 0 /\
+ pue_f p_x p_y a_x a_y a_x a_y = 0.
Proof.
split.
-apply pue_f_eq.
+ by rewrite pue_f_eq.
split.
-have := pue_f_c p_x p_y a_x a_y p_x p_y.
-move => ->.
-apply pue_f_eq.
-have := pue_f_c a_x a_y a_x a_y p_x p_y.
-move => <-.
-apply pue_f_eq.
+ by rewrite (pue_f_c p_x p_y a_x a_y p_x p_y) pue_f_eq.
+by rewrite -(pue_f_c a_x a_y a_x a_y p_x p_y) pue_f_eq.
Qed.
Lemma pue_f_vert p_y a_x a_y b_x b_y :
- (pue_f a_x a_y b_x b_y b_x p_y) == (b_x - a_x) * (p_y - b_y).
-Proof.
-rewrite /pue_f.
-apply /eqP.
-mc_ring.
-Qed.
+ pue_f a_x a_y b_x b_y b_x p_y = (b_x - a_x) * (p_y - b_y).
+Proof. by rewrite /pue_f; mc_ring. Qed.
Lemma ax4 p_x p_y q_x q_y r_x r_y t_x t_y :
-pue_f t_x t_y q_x q_y r_x r_y + pue_f p_x p_y t_x t_y r_x r_y
-+ pue_f p_x p_y q_x q_y t_x t_y == pue_f p_x p_y q_x q_y r_x r_y.
-Proof.
-rewrite /pue_f.
-apply /eqP.
- mc_ring.
-Qed.
+ pue_f t_x t_y q_x q_y r_x r_y +
+ pue_f p_x p_y t_x t_y r_x r_y +
+ pue_f p_x p_y q_x q_y t_x t_y = pue_f p_x p_y q_x q_y r_x r_y.
+Proof. by rewrite /pue_f; mc_ring. Qed.
Lemma pue_f_linear l a b c d e f :
l * pue_f a b c d e f = pue_f a (l*b) c (l*d) e (l*f).
@@ -250,64 +235,58 @@ mc_ring.
Qed.
Lemma pue_f_on_edge_y a_x a_y b_x b_y m_x m_y :
-pue_f m_x m_y a_x a_y b_x b_y == 0 ->
-(b_x - a_x) * m_y = m_x * (b_y -a_y)- (a_x * b_y - b_x *a_y).
-Proof.
-move => /eqP abmeq0.
-apply /eqP.
-rewrite -subr_eq0.
-apply /eqP.
-rewrite -abmeq0 /pue_f.
-mc_ring.
+ pue_f m_x m_y a_x a_y b_x b_y = 0 ->
+ (b_x - a_x) * m_y = m_x * (b_y -a_y)- (a_x * b_y - b_x *a_y).
+Proof.
+move=> abmeq0.
+apply/eqP; rewrite -subr_eq0; apply/eqP.
+by rewrite -abmeq0 /pue_f; mc_ring.
Qed.
Lemma pue_f_on_edge a_x a_y b_x b_y c_x c_y d_x d_y m_x m_y :
-pue_f m_x m_y a_x a_y b_x b_y == 0 ->
-(b_x - a_x) * pue_f m_x m_y c_x c_y d_x d_y ==
-(m_x - a_x) * pue_f b_x b_y c_x c_y d_x d_y + (b_x - m_x) * pue_f a_x a_y c_x c_y d_x d_y.
+ pue_f m_x m_y a_x a_y b_x b_y = 0 ->
+ (b_x - a_x) * pue_f m_x m_y c_x c_y d_x d_y =
+ (m_x - a_x) * pue_f b_x b_y c_x c_y d_x d_y +
+ (b_x - m_x) * pue_f a_x a_y c_x c_y d_x d_y.
Proof.
-move => on_ed.
-rewrite pue_f_linear /pue_f (pue_f_on_edge_y on_ed).
-apply /eqP.
+move=> on_ed.
+rewrite pue_f_linear /pue_f (pue_f_on_edge_y on_ed).
mc_ring.
Qed.
Lemma pue_f_triangle_on_edge a_x a_y b_x b_y p_x p_y p'_x p'_y :
-pue_f p'_x p'_y a_x a_y b_x b_y == 0 ->
-(b_x - a_x) * pue_f p'_x p'_y a_x a_y p_x p_y ==
-(p'_x - a_x) * pue_f b_x b_y a_x a_y p_x p_y .
+ pue_f p'_x p'_y a_x a_y b_x b_y = 0 ->
+ (b_x - a_x) * pue_f p'_x p'_y a_x a_y p_x p_y =
+ (p'_x - a_x) * pue_f b_x b_y a_x a_y p_x p_y .
Proof.
move=> on_ed.
-rewrite pue_f_linear /pue_f (pue_f_on_edge_y on_ed).
-apply /eqP.
+rewrite pue_f_linear /pue_f (pue_f_on_edge_y on_ed).
mc_ring.
Qed.
Lemma pue_f_triangle_on_edge' a_x a_y b_x b_y p_x p_y p'_x p'_y :
-pue_f p'_x p'_y a_x a_y b_x b_y == 0 ->
-(b_x - a_x) * pue_f p'_x p'_y p_x p_y b_x b_y ==
-(b_x - p'_x) * pue_f a_x a_y p_x p_y b_x b_y .
+ pue_f p'_x p'_y a_x a_y b_x b_y = 0 ->
+ (b_x - a_x) * pue_f p'_x p'_y p_x p_y b_x b_y =
+ (b_x - p'_x) * pue_f a_x a_y p_x p_y b_x b_y .
Proof.
-move => on_ed .
+move => on_ed.
rewrite pue_f_linear /pue_f (pue_f_on_edge_y on_ed).
-apply /eqP.
mc_ring.
Qed.
Lemma pue_f_on_edge_same_point a_x a_y b_x b_y p_x p_y p_x' p_y':
-a_x != b_x ->
-pue_f p_x p_y a_x a_y b_x b_y == 0 ->
-pue_f p_x' p_y' a_x a_y b_x b_y == 0 ->
-(p_x == p_x') -> (p_y == p_y').
-Proof.
-move => axnbx puep0 puep'0.
-have pyeq := (pue_f_on_edge_y puep0 ).
-have p'yeq := (pue_f_on_edge_y puep'0 ).
+ a_x != b_x ->
+ pue_f p_x p_y a_x a_y b_x b_y = 0 ->
+ pue_f p_x' p_y' a_x a_y b_x b_y = 0 ->
+ p_x = p_x' -> p_y = p_y'.
+Proof.
+move=> axnbx puep0 puep'0.
+have pyeq := pue_f_on_edge_y puep0.
+have p'yeq := pue_f_on_edge_y puep'0.
move=> xxs; have yys : (b_x - a_x) * p_y = (b_x - a_x) * p_y'.
- by rewrite pyeq (eqP xxs) p'yeq.
-move: (axnbx); rewrite eq_sym -subr_eq0=> bxmax.
-apply/eqP.
-by apply: (mulfI bxmax).
+ by rewrite pyeq xxs p'yeq.
+move: (axnbx); rewrite eq_sym -subr_eq0.
+by move=> /mulfI; exact.
Qed.
Lemma pue_f_ax5 p_x p_y q_x q_y a_x a_y b_x b_y c_x c_y :
@@ -328,7 +307,7 @@ Lemma pue_f_triangle_decompose a_x a_y b_x b_y c_x c_y d_x d_y :
pue_f b_x b_y c_x c_y d_x d_y.
Proof.
move=> online.
-rewrite -(eqP (ax4 _ _ _ _ _ _ d_x d_y)).
+rewrite -(ax4 _ _ _ _ _ _ d_x d_y).
rewrite addrC; congr (_ + _).
by rewrite addrC pue_f_o pue_f_c online oppr0 add0r -pue_f_c.
Qed.
@@ -458,53 +437,52 @@ Proof.
Qed.
Lemma area3_vert a b c : (b.x = c.x) ->
-area3 a b c == (b.x - a.x) * (c.y - b.y).
+ area3 a b c = (b.x - a.x) * (c.y - b.y).
Proof.
move: a b c => [ax ay] [b_x b_y] [cx cy]/= <-.
-apply : pue_f_vert.
+exact: pue_f_vert.
Qed.
Lemma ax4_three_triangles p q r t :
-area3 t q r + area3 p t r + area3 p q t
-== area3 p q r.
+ area3 t q r + area3 p t r + area3 p q t = area3 p q r.
Proof.
move : p q r t => [px py] [q_x q_y] [rx ry] [t_x t_y]/= .
-apply : ax4.
+exact: ax4.
Qed.
-
Lemma area3_two_points a b :
-area3 a a b == 0 /\ area3 a b a == 0 /\
-area3 a b b == 0.
+ area3 a a b = 0 /\
+ area3 a b a = 0 /\
+ area3 a b b = 0.
Proof.
move : a b => [ax ay] [b_x b_y] /=.
-apply pue_f_two_points.
+exact: pue_f_two_points.
Qed.
Lemma area3_on_edge a b c d m :
-area3 m a b == 0 ->
-(b.x - a.x) * area3 m c d ==
-(m.x - a.x) * area3 b c d + (b.x - m.x) * area3 a c d.
+ area3 m a b = 0 ->
+ (b.x - a.x) * area3 m c d =
+ (m.x - a.x) * area3 b c d + (b.x - m.x) * area3 a c d.
Proof.
move : a b c d m => [ax ay] [b_x b_y] [cx cy] [dx dy] [mx my]/=.
-apply pue_f_on_edge.
+apply: pue_f_on_edge.
Qed.
Lemma area3_on_edge_y a b m :
-area3 m a b == 0 ->
-(b.x - a.x) * m.y = m.x * (b.y - a.y) - (a.x * b.y - b.x * a.y).
+ area3 m a b = 0 ->
+ (b.x - a.x) * m.y = m.x * (b.y - a.y) - (a.x * b.y - b.x * a.y).
Proof.
move : a b m => [ax ay] [b_x b_y] [mx my]/=.
-apply pue_f_on_edge_y.
+exact: pue_f_on_edge_y.
Qed.
Lemma area3_triangle_on_edge a b p p' :
-area3 p' a b == 0 ->
-(b.x - a.x) * area3 p' a p ==
-(p'.x - a.x) * area3 b a p.
+ area3 p' a b = 0 ->
+ (b.x - a.x) * area3 p' a p =
+ (p'.x - a.x) * area3 b a p.
Proof.
move : a b p p' => [ax ay] [b_x b_y] [px py] [p'x p'y] /=.
-apply pue_f_triangle_on_edge.
+exact: pue_f_triangle_on_edge.
Qed.
Definition subpoint (p : pt) :=
@@ -565,8 +543,8 @@ Definition valid_edge :=
generic_trajectories.valid_edge R le edge left_pt right_pt.
Lemma valid_edge_extremities e0 p:
-(left_pt e0 == p) || (right_pt e0 == p) ->
-valid_edge e0 p.
+ (left_pt e0 == p) || (right_pt e0 == p) ->
+ valid_edge e0 p.
Proof.
rewrite /valid_edge/generic_trajectories.valid_edge.
by move => /orP [/eqP eq |/eqP eq ];
@@ -583,10 +561,10 @@ Proof.
by apply: valid_edge_extremities; rewrite eqxx orbT.
Qed.
-Definition point_on_edge (p: pt) (e :edge) : bool :=
- (area3 p (left_pt e) (right_pt e) == 0) && (valid_edge e p).
+Definition point_on_edge (p : pt) (e : edge) : bool :=
+ (area3 p (left_pt e) (right_pt e) == 0) && valid_edge e p.
-Notation "p '===' e" := (point_on_edge p e)( at level 70, no associativity).
+Notation "p '===' e" := (point_on_edge p e) (at level 70, no associativity).
Definition edge_below (e1 : edge) (e2 : edge) : bool :=
((left_pt e1 <<= e2) && (right_pt e1 <<= e2))
@@ -601,8 +579,8 @@ Lemma edge_below_refl e : e <| e.
Proof.
apply/orP; left.
rewrite 2!underE.
-rewrite (eqP (proj1 (area3_two_points _ _))).
-by rewrite (eqP (proj1 (proj2 (area3_two_points _ _)))) lexx.
+rewrite (proj1 (area3_two_points _ _)).
+by rewrite (proj1 (proj2 (area3_two_points _ _))) lexx.
Qed.
Lemma below_altC e1 e2 : below_alt e1 e2 <-> below_alt e2 e1.
@@ -630,79 +608,63 @@ Qed.
Definition no_crossing := forall e1 e2, below_alt e1 e2.
-Definition no_crossing' : Prop:=
+Definition no_crossing' : Prop :=
forall e e' : edge,
valid_edge e (left_pt e') ->
(left_pt e' <<< e -> e' <| e) /\
(~ (left_pt e' <<= e) -> e <| e').
-Lemma left_on_edge e :
-(left_pt e) === e.
+Lemma left_on_edge e : left_pt e === e.
Proof.
move : e => [ l r inE].
rewrite /point_on_edge //=.
-have := area3_two_points l r.
-move => [] -> _ /=.
-apply /andP .
-split.
- by [].
-rewrite /=.
-by apply ltW.
+have [->/= _] := area3_two_points l r.
+rewrite eqxx/=.
+by apply/andP; split => //; exact: ltW.
Qed.
-Lemma right_on_edge e :
-(right_pt e) === e.
+Lemma right_on_edge e : right_pt e === e.
Proof.
move : e => [ l r inE].
rewrite /point_on_edge //=.
-have := area3_two_points r l.
-move => [] _ [] -> _ /=.
-apply /andP .
-split.
- rewrite /=.
- by apply ltW.
-by [].
+have [_ [->/= _]] := area3_two_points r l.
+rewrite eqxx/=.
+by apply/andP; split => //; exact: ltW.
Qed.
Lemma point_on_edge_above low_e high_e a :
-a === high_e ->
-~~ (left_pt high_e <<< low_e) ->
-~~ (right_pt high_e <<< low_e) ->
-~~ (a <<< low_e).
+ a === high_e ->
+ ~~ (left_pt high_e <<< low_e) ->
+ ~~ (right_pt high_e <<< low_e) ->
+ ~~ (a <<< low_e).
Proof.
move : high_e => [lr hr inH] /=.
-rewrite /point_on_edge /valid_edge => /andP [] /= poea /andP [] linfa ainfr.
+rewrite /point_on_edge /valid_edge => /andP [] /= /eqP poea /andP [] linfa ainfr.
have pf := area3_on_edge (left_pt low_e) (right_pt low_e) poea.
rewrite /point_strictly_under_edge.
rewrite /generic_trajectories.point_strictly_under_edge subrr.
rewrite !R_ltb_lt -!leNgt => llrllh llrllrh.
-have diffa : (lr.x - a.x) <= 0.
- by rewrite subr_cp0.
-have diffb : (hr.x - a.x) >= 0.
- by rewrite subr_cp0.
-have difflh : (lr.x - hr.x) < 0.
- by rewrite subr_cp0.
-rewrite -(ler_nM2l difflh _ 0) mulr0 -opprB mulNr oppr_le0 (eqP pf).
+have diffa : lr.x - a.x <= 0 by rewrite subr_cp0.
+have diffb : hr.x - a.x >= 0 by rewrite subr_cp0.
+have difflh : lr.x - hr.x < 0 by rewrite subr_cp0.
+rewrite -(ler_nM2l difflh _ 0) mulr0 -opprB mulNr oppr_le0 pf.
by rewrite addr_ge0 // mulr_ge0 // subr_ge0.
Qed.
Lemma point_on_edge_above_strict low_e high_e a :
-a === high_e ->
-(left_pt high_e >>> low_e) ->
-(right_pt high_e >>> low_e) ->
-(a >>> low_e).
+ a === high_e ->
+ left_pt high_e >>> low_e ->
+ right_pt high_e >>> low_e ->
+ a >>> low_e.
Proof.
move : high_e => [lr hr inH] /=.
-rewrite /point_on_edge /valid_edge => /andP [] /= poea /andP [] linfa ainfr.
+rewrite /point_on_edge /valid_edge => /andP [] /= /eqP poea /andP [] linfa ainfr.
have pf := area3_on_edge (left_pt low_e) (right_pt low_e) poea.
rewrite /point_under_edge -!ltNge !subrr => llrllh llrllrh.
-have diffa : (lr.x - a.x) <= 0.
- by rewrite subr_cp0.
-have diffb : (hr.x - a.x) >= 0.
- by rewrite subr_cp0.
-have difflh : (lr.x - hr.x) < 0.
- by rewrite subr_cp0.
-rewrite -(ltr_nM2l difflh _ 0) mulr0 -opprB mulNr oppr_lt0 (eqP pf).
+have diffa : lr.x - a.x <= 0 by rewrite subr_cp0.
+have diffb : hr.x - a.x >= 0 by rewrite subr_cp0.
+have difflh : lr.x - hr.x < 0 by rewrite subr_cp0.
+rewrite -(ltr_nM2l difflh _ 0) mulr0 -opprB mulNr oppr_lt0 pf.
have addr_le_gt0 (x y : R) : 0 <= x -> 0 < y -> 0 < x + y.
move=> xge0 ygt0; rewrite -(add0r 0).
by apply: ler_ltD.
@@ -715,47 +677,40 @@ by rewrite mulr_gt0 // subr_gt0.
Qed.
Lemma point_on_edge_under low_e high_e a :
-a === (low_e) ->
- (left_pt low_e) <<= high_e ->
- (right_pt low_e) <<= high_e ->
+ a === (low_e) ->
+ left_pt low_e <<= high_e ->
+ right_pt low_e <<= high_e ->
a <<= high_e.
Proof.
move : low_e => [lr hr inH] /=.
-rewrite /point_on_edge /valid_edge => /andP [] /= poea /andP [] linfa ainfr.
+rewrite /point_on_edge /valid_edge => /andP [] /= /eqP poea /andP [] linfa ainfr.
have pf := area3_on_edge (left_pt high_e) (right_pt high_e) poea.
rewrite /point_under_edge /generic_trajectories.point_under_edge !subrr=> llrllh llrllrh.
-have diffa : (lr.x - a.x) <= 0.
- by rewrite subr_cp0.
-have diffb : (hr.x - a.x) >= 0.
- by rewrite subr_cp0.
-have difflh : (lr.x - hr.x) < 0.
- by rewrite subr_cp0.
-rewrite -(ler_nM2r difflh 0 _) mul0r mulrC -opprB mulNr (eqP pf) opprD.
+have diffa : lr.x - a.x <= 0 by rewrite subr_cp0.
+have diffb : hr.x - a.x >= 0 by rewrite subr_cp0.
+have difflh : lr.x - hr.x < 0 by rewrite subr_cp0.
+rewrite -(ler_nM2r difflh 0 _) mul0r mulrC -opprB mulNr pf opprD.
by rewrite addr_ge0 // -mulNr mulr_le0 // oppr_le0 subr_cp0.
Qed.
Lemma point_on_edge_under_strict high_e low_e a :
-a === low_e ->
-(left_pt low_e <<< high_e) ->
-(right_pt low_e <<< high_e) ->
-(a <<< high_e).
+ a === low_e ->
+ left_pt low_e <<< high_e ->
+ right_pt low_e <<< high_e ->
+ a <<< high_e.
Proof.
move : low_e => [lr hr inH] /=.
-rewrite /point_on_edge /valid_edge => /andP [] /= poea /andP [] linfa ainfr.
+rewrite /point_on_edge /valid_edge => /andP [] /= /eqP poea /andP [] linfa ainfr.
have pf := area3_on_edge (left_pt high_e) (right_pt high_e) poea.
rewrite /point_strictly_under_edge.
rewrite/generic_trajectories.point_strictly_under_edge.
rewrite !R_ltb_lt !subrr=> llrllh llrllrh.
-have diffa : (lr.x - a.x) <= 0.
- by rewrite subr_cp0.
-have diffb : (hr.x - a.x) >= 0.
- by rewrite subr_cp0.
-have difflh : (lr.x - hr.x) < 0.
- by rewrite subr_cp0.
-rewrite -(ltr_nM2l difflh 0) mulr0 -opprB mulNr oppr_gt0 (eqP pf).
+have diffa : lr.x - a.x <= 0 by rewrite subr_cp0.
+have diffb : hr.x - a.x >= 0 by rewrite subr_cp0.
+have difflh : lr.x - hr.x < 0 by rewrite subr_cp0.
+rewrite -(ltr_nM2l difflh 0) mulr0 -opprB mulNr oppr_gt0 pf.
have addr_le_lt0 (x y : R) : x <= 0 -> y < 0 -> x + y < 0.
- move=> xle0 ylt0; rewrite -(add0r 0).
- by apply: ler_ltD.
+ by move=> xle0 ylt0; rewrite -(add0r 0) ler_ltD.
move: diffa; rewrite le_eqVlt=> /orP[ | diffa]; last first.
rewrite addrC addr_le_lt0 // ?nmulr_llt0 ?mulr_ge0_le0 //.
by rewrite ltW.
@@ -765,46 +720,41 @@ by rewrite nmulr_llt0 // subr_gt0.
Qed.
Lemma not_strictly_above' low_e high_e p':
-~~ (left_pt (high_e) <<< low_e) ->
-~~ (right_pt (high_e) <<< low_e) ->
-p' === high_e -> (right_pt (low_e)).x = p'.x ->
-right_pt (low_e) <<= high_e .
+ ~~ (left_pt (high_e) <<< low_e) ->
+ ~~ (right_pt (high_e) <<< low_e) ->
+ p' === high_e -> (right_pt (low_e)).x = p'.x ->
+ right_pt (low_e) <<= high_e .
Proof.
move : low_e => [ll lr inL] /=.
move => pablh pabrh poep' eqxp'p.
-have /= /eqP puefcpp' := area3_vert (left_pt (Bedge inL)) eqxp'p .
+have /= puefcpp' := area3_vert (left_pt (Bedge inL)) eqxp'p .
have := (point_on_edge_above poep' pablh pabrh ).
rewrite strictE.
rewrite -area3_cycle -leNgt puefcpp' underE.
-have inle: (lr.x - ll.x) >0.
- by rewrite subr_cp0.
+have inle : lr.x - ll.x > 0 by rewrite subr_cp0.
rewrite (pmulr_rge0 _ inle) => inp'lr.
-have := (ax4_three_triangles lr (left_pt high_e) (right_pt high_e) p') => /eqP <-.
+have <- := ax4_three_triangles lr (left_pt high_e) (right_pt high_e) p'.
move : poep'.
rewrite /point_on_edge=> /andP [] /eqP pue0 valp'.
rewrite pue0.
have := (area3_vert (right_pt high_e) eqxp'p ).
-rewrite -area3_cycle eqxp'p => /eqP ->.
+rewrite -area3_cycle eqxp'p => ->.
move : valp'.
rewrite /valid_edge => /andP [] xlhp' xrhp'.
-have xrhp'0: p'.x - (right_pt high_e).x <=0.
- by rewrite subr_cp0.
-rewrite add0r.
-rewrite -oppr_ge0 opprD /= addr_ge0//.
+have xrhp'0: p'.x - (right_pt high_e).x <= 0 by rewrite subr_cp0.
+rewrite add0r -oppr_ge0 opprD /= addr_ge0//.
by rewrite -mulNr mulr_ge0 // oppr_ge0.
-have := (area3_vert (left_pt high_e) eqxp'p ).
-rewrite -area3_opposite area3_cycle eqxp'p => /eqP ->.
-have xlhp'0: p'.x - (left_pt high_e).x >= 0.
- by rewrite subr_cp0.
-by rewrite mulr_ge0.
+have := area3_vert (left_pt high_e) eqxp'p.
+rewrite -area3_opposite area3_cycle eqxp'p => ->.
+have xlhp'0: p'.x - (left_pt high_e).x >= 0 by rewrite subr_cp0.
+by rewrite mulr_ge0.
Qed.
-Lemma under_above_on e p :
- valid_edge e p -> p <<= e -> p >>= e -> p === e.
+Lemma under_above_on e p : valid_edge e p -> p <<= e -> p >>= e -> p === e.
Proof.
move=> v u a; apply/andP; split => //.
apply/eqP/le_anti/andP;split.
- by move: u; rewrite /point_under_edge/generic_trajectories.point_under_edge!subrr.
+ by move: u; rewrite /point_under_edge /generic_trajectories.point_under_edge !subrr.
move: a; rewrite /point_strictly_under_edge.
rewrite /generic_trajectories.point_strictly_under_edge subrr.
by rewrite R_ltb_lt leNgt=> it; exact: it.
@@ -826,49 +776,39 @@ rewrite /generic_trajectories.vertical_intersection_point /=.
by rewrite /valid_edge in h; rewrite (negbTE h).
Qed.
-
Lemma vertical_correct p e :
- match (vertical_intersection_point p e) with
+ match vertical_intersection_point p e with
None => ~~ valid_edge e p | Some(i) => i === e end.
Proof.
move: p e => [ptx pty] [[ax ay] [bx b_y] /=ab] .
rewrite /vertical_intersection_point/valid_edge.
rewrite /generic_trajectories.vertical_intersection_point.
-case : ifP => /= h ; last first.
-by [].
-have: ax != bx.
-rewrite neq_lt ab //=.
-rewrite /area3.
+case : ifP => /= h ; last by [].
+have: ax != bx by rewrite neq_lt ab.
set py := ((b_y - ay) / (bx - ax) * ptx + (ay - (b_y - ay) / (bx - ax) * ax)).
move => h2.
rewrite /point_on_edge .
-apply /andP.
-split; last first.
-exact h.
-apply pue_f_inters.
-by apply /eqP /nesym /eqP .
-by [].
+apply/andP; split; last exact h.
+apply/eqP.
+apply pue_f_inters => //.
+by rewrite eq_sym.
Qed.
-
-
Lemma exists_point_valid e p :
-(valid_edge e p) ->
-exists p', vertical_intersection_point p e = Some (p').
+ valid_edge e p ->
+ exists p', vertical_intersection_point p e = Some p'.
Proof.
have := vertical_correct p e.
-case : (vertical_intersection_point p e)=> [vp |//=].
- rewrite /point_on_edge.
- move => a b.
+case : (vertical_intersection_point p e)=> [vp |//= a b].
+ rewrite /point_on_edge => a b.
by exists vp.
-move => a b.
exists p.
by rewrite b in a.
Qed.
Lemma intersection_on_edge e p p' :
-vertical_intersection_point p e = Some (p') ->
-p'=== e /\ p.x = p'.x.
+ vertical_intersection_point p e = Some p' ->
+ p' === e /\ p.x = p'.x.
Proof.
have := vertical_correct p e.
case vert : (vertical_intersection_point p e)=> [vp |//=].
@@ -876,142 +816,125 @@ move: vert.
rewrite /vertical_intersection_point.
rewrite /generic_trajectories.vertical_intersection_point.
case : (generic_trajectories.valid_edge _ _ _ _ _ e p) => [| //].
-move => [] /= vpq poe [].
-move => <-.
-by rewrite poe -vpq /=.
+move => [] /= vpq poe [] <-.
+by rewrite poe -vpq.
Qed.
Lemma not_strictly_under' low_e high_e p' :
-(left_pt (low_e)) <<= (high_e) ->
-(right_pt (low_e))<<= (high_e) ->
+ left_pt (low_e) <<= high_e ->
+ right_pt (low_e) <<= high_e ->
(* This is an alternative way to say
valid_edge low_e (right_pt high_e) *)
-p' === low_e -> (right_pt (high_e)).x = p'.x ->
-~~ (right_pt (high_e) <<< low_e).
+ p' === low_e -> (right_pt (high_e)).x = p'.x ->
+ ~~ (right_pt (high_e) <<< low_e).
Proof.
move : high_e => [hl hr inH] /=.
move => pablh pabrh poep' eqxp'p.
-have /= /eqP puefcpp' := area3_vert (left_pt (Bedge inH)) eqxp'p .
-have := (point_on_edge_under poep' pablh pabrh ).
+have /= puefcpp' := area3_vert (left_pt (Bedge inH)) eqxp'p .
+have := point_on_edge_under poep' pablh pabrh.
rewrite underE strictE.
rewrite -area3_cycle.
rewrite -leNgt puefcpp'.
-have inle: (hr.x - hl.x) >0.
- by rewrite subr_cp0.
+have inle : hr.x - hl.x > 0 by rewrite subr_cp0.
rewrite (pmulr_rle0 _ inle ) => inp'hr.
-have := (ax4_three_triangles hr (left_pt low_e) (right_pt low_e) p') => /eqP <-.
+have <- := ax4_three_triangles hr (left_pt low_e) (right_pt low_e) p'.
move : poep'.
rewrite /point_on_edge=> /andP [] /eqP pue0 valp'.
rewrite pue0.
-have := (area3_vert (right_pt low_e) eqxp'p ).
-rewrite -area3_cycle eqxp'p => /eqP ->.
+have := area3_vert (right_pt low_e) eqxp'p.
+rewrite -area3_cycle eqxp'p => ->.
move : valp'.
rewrite /valid_edge => /andP [] xlhp' xrhp'.
-have xrhp'0: p'.x - (right_pt low_e).x <=0.
- by rewrite subr_cp0.
-rewrite add0r addr_ge0//.
- by rewrite mulr_le0.
-have := (area3_vert (left_pt low_e) eqxp'p ).
-rewrite area3_opposite -area3_cycle eqxp'p eqr_oppLR => /eqP ->.
+have xrhp'0 : p'.x - (right_pt low_e).x <= 0 by rewrite subr_cp0.
+rewrite add0r addr_ge0// ?mulr_le0//.
+have := area3_vert (left_pt low_e) eqxp'p.
+rewrite area3_opposite -area3_cycle eqxp'p => /eqP; rewrite eqr_oppLR => /eqP ->.
by rewrite -mulNr mulr_le0 // oppr_le0 subr_cp0.
Qed.
-Lemma pue_right_edge e p :
-(right_pt e).x == p.x ->
-(p <<= e) = ((p.y - (right_pt e).y) <= 0).
+Lemma pue_right_edge e p : (right_pt e).x = p.x ->
+ (p <<= e) = (p.y - (right_pt e).y <= 0).
Proof.
move : e p => [[ax ay][bx b_y] /= inE] [px py] /=.
-rewrite /point_under_edge/generic_trajectories.point_under_edge /=.
-move => /eqP <- /=.
-have := (pue_f_vert py ax ay bx b_y).
-rewrite pue_f_c /pue_f.
-move => /eqP ->.
+rewrite /point_under_edge/generic_trajectories.point_under_edge /= => <-/=.
+have := pue_f_vert py ax ay bx b_y.
+rewrite pue_f_c /pue_f => ->.
rewrite -subr_cp0 -opprB oppr_lt0 in inE.
by rewrite subrr (pmulr_rle0 _ inE) .
Qed.
-Lemma psue_right_edge e p :
-(right_pt e).x == p.x ->
-(p <<< e) = ((p.y - (right_pt e).y) < 0).
+Lemma psue_right_edge e p : (right_pt e).x = p.x ->
+ (p <<< e) = (p.y - (right_pt e).y < 0).
Proof.
move : e p => [[ax ay][bx b_y] /= cnd] [px py] /=.
rewrite /point_strictly_under_edge/generic_trajectories.point_strictly_under_edge /=.
-rewrite R_ltb_lt.
-move => /eqP <- /=.
-have := (pue_f_vert py ax ay bx b_y).
-rewrite pue_f_c /pue_f.
-move => /eqP ->.
+rewrite R_ltb_lt => <- /=.
+have := pue_f_vert py ax ay bx b_y.
+rewrite pue_f_c /pue_f => ->.
rewrite -subr_gt0 in cnd.
-by rewrite subrr (pmulr_rlt0 _ cnd) .
+by rewrite subrr (pmulr_rlt0 _ cnd).
Qed.
-Lemma pue_left_edge e p :
-(left_pt e).x == p.x ->
-(p <<= e) = (0 <= ((left_pt e).y - p.y )).
+Lemma pue_left_edge e p : (left_pt e).x = p.x ->
+ (p <<= e) = (0 <= (left_pt e).y - p.y).
Proof.
move : e p => [[ax ay][bx b_y] /= inE] [px py] /=.
rewrite /point_under_edge.
-rewrite /generic_trajectories.point_under_edge /=.
-move => /eqP <- /=.
-have := (pue_f_vert ay bx b_y ax py).
-rewrite -pue_f_c /pue_f.
-move => /eqP ->.
+rewrite /generic_trajectories.point_under_edge /= => <- /=.
+have := pue_f_vert ay bx b_y ax py.
+rewrite -pue_f_c /pue_f => ->.
rewrite -subr_cp0 in inE.
by rewrite subrr (nmulr_rle0 _ inE).
Qed.
-Lemma psue_left_edge e p :
-(left_pt e).x == p.x ->
-(p <<< e) = (0 < (left_pt e).y - p.y).
+Lemma psue_left_edge e p : (left_pt e).x = p.x ->
+ (p <<< e) = (0 < (left_pt e).y - p.y).
Proof.
-move: e p => [[ax ay][bx b_y] /= cnd] [px py] /=.
-move=> /eqP <- /=.
+move: e p => [[ax ay][bx b_y] /= cnd] [px py] /= <- /=.
rewrite /point_strictly_under_edge.
rewrite /generic_trajectories.point_strictly_under_edge /=.
rewrite R_ltb_lt.
-have := (pue_f_vert ay bx b_y ax py).
-rewrite -pue_f_c /pue_f => /eqP ->.
+have := pue_f_vert ay bx b_y ax py.
+rewrite -pue_f_c /pue_f => ->.
rewrite -subr_cp0 in cnd.
by rewrite subrr (nmulr_rlt0 _ cnd).
Qed.
Lemma not_strictly_under low_e high_e :
-(left_pt low_e) <<= high_e ->
-(right_pt low_e) <<= high_e ->
-valid_edge low_e (right_pt high_e) ->
-~~ (right_pt high_e <<< low_e).
+ left_pt low_e <<= high_e ->
+ right_pt low_e <<= high_e ->
+ valid_edge low_e (right_pt high_e) ->
+ ~~ (right_pt high_e <<< low_e).
Proof.
move => pableft pabright valright.
-have := exists_point_valid valright.
-move => [] p' vip .
-have := intersection_on_edge vip => [][] poep' eqx.
-apply : not_strictly_under' pableft pabright poep' eqx.
+have [p' vip] := exists_point_valid valright.
+have := intersection_on_edge vip => [][] poep' eqx.
+by apply: not_strictly_under' pableft pabright poep' eqx.
Qed.
Lemma not_strictly_above low_e high_e :
-~~ (left_pt high_e <<< low_e) ->
-~~ (right_pt high_e <<< low_e) ->
-valid_edge (high_e) (right_pt (low_e)) ->
-right_pt (low_e) <<= high_e.
+ ~~ (left_pt high_e <<< low_e) ->
+ ~~ (right_pt high_e <<< low_e) ->
+ valid_edge high_e (right_pt low_e) ->
+ right_pt low_e <<= high_e.
Proof.
move => pableft pabright valright.
-have := exists_point_valid valright.
-move => [] p' vip .
-have := intersection_on_edge vip => [][] poep' eqx.
-apply : not_strictly_above' pableft pabright poep' eqx.
+have [p' vip] := exists_point_valid valright.
+have := intersection_on_edge vip => [][] poep' eqx.
+by apply: not_strictly_above' pableft pabright poep' eqx.
Qed.
Lemma on_edge_same_point e p p':
-p === e -> p' === e ->
-(p.x == p'.x) -> (p.y == p'.y).
+ p === e -> p' === e ->
+ p.x = p'.x -> p.y = p'.y.
Proof.
move : e => [l r ec].
rewrite /point_on_edge /= => /andP [] p0 _ /andP[] p'0 _.
have dif : l.x != r.x.
by apply/eqP=> abs; move: ec; rewrite abs ltxx.
-move: l r p0 p'0 dif {ec}=> [a_x a_y][b_x b_y] p0 p'0 dif.
+move: l r p0 p'0 dif {ec}=> [a_x a_y][b_x b_y] /eqP p0 /eqP p'0 dif.
move: p p' p0 p'0 => [x y] [x' y'] puep0 puep'0.
-rewrite /=; apply: (pue_f_on_edge_same_point dif puep0 puep'0).
+exact: pue_f_on_edge_same_point dif puep0 puep'0.
Qed.
Lemma strict_under_edge_lower_y r r' e :
@@ -1025,47 +948,42 @@ move: (valre)=> /andP[] + _; rewrite le_eqVlt=> /orP[/eqP atl| inr].
have rltr : r'.x < (right_pt e).x by rewrite -rr' -atl edge_cond.
have /esym := edge_and_left_vertical_eq rltr (esym (etrans atl rr')).
by move/andP: rone => [] -> _ /eqP.
- by move/eqP/psue_left_edge: atl; rewrite subr_gt0 -req.
+ by move/psue_left_edge : atl; rewrite subr_gt0 -req.
have rue' : (r <<< e) = (area3 r (left_pt e) r' < 0).
- move: rone=> /andP[] /[dup] tmp/area3_triangle_on_edge + _ => /(_ r).
+ move: rone=> /andP[] /[dup] tmp /eqP /area3_triangle_on_edge + _ => /(_ r).
(* TODO : fix area3_triangle_on_edge for cycle *)
rewrite (area3_opposite (left_pt _)).
rewrite (area3_opposite (left_pt _) _ (right_pt _)) !mulrN.
- rewrite inj_eq; last by apply: oppr_inj.
- move/eqP => signcond.
+ move=> /eqP; rewrite eqr_opp => /eqP signcond.
move: (edge_cond e); rewrite -subr_gt0 => /pmulr_rlt0 <-.
rewrite signcond pmulr_rlt0; last by rewrite subr_gt0 -rr'.
- rewrite /point_strictly_under_edge.
- by rewrite /generic_trajectories.point_strictly_under_edge subrr R_ltb_lt.
+ rewrite /point_strictly_under_edge.
+ by rewrite /generic_trajectories.point_strictly_under_edge subrr R_ltb_lt.
have inr' : (left_pt e).x < r'.x by rewrite -rr'.
-have /psue_right_edge : (right_pt (Bedge inr')).x == r.x.
- by rewrite /= rr' eqxx.
+have /psue_right_edge : (right_pt (Bedge inr')).x = r.x by rewrite /= rr'.
rewrite rue' subr_lt0.
rewrite /point_strictly_under_edge.
by rewrite /generic_trajectories.point_strictly_under_edge subrr R_ltb_lt.
Qed.
-Lemma under_onVstrict e p :
- valid_edge e p ->
+Lemma under_onVstrict e p : valid_edge e p ->
(p <<= e) = (p === e) || (p <<< e).
Proof.
move=> valep.
rewrite /point_under_edge /point_strictly_under_edge /point_on_edge.
rewrite /generic_trajectories.point_strictly_under_edge R_ltb_lt.
rewrite /generic_trajectories.point_under_edge subrr.
-by rewrite le_eqVlt valep andbT.
+by rewrite valep andbT -le_eqVlt.
Qed.
Lemma onAbove e p : p === e -> ~~ (p <<< e).
Proof.
rewrite /point_on_edge /point_strictly_under_edge.
rewrite /generic_trajectories.point_strictly_under_edge R_ltb_lt subrr.
-move=> /andP[cmp valep].
-by rewrite -leNgt le_eqVlt eq_sym cmp.
+by move=> /andP[/eqP -> valep]; rewrite ltxx.
Qed.
-Lemma strict_nonAunder e p :
- valid_edge e p ->
+Lemma strict_nonAunder e p : valid_edge e p ->
(p <<< e) = (~~ (p === e)) && (p <<= e).
Proof.
move=> valep.
@@ -1082,7 +1000,7 @@ move=> xs nq under on'.
have vr : valid_edge e r.
by move: on'; rewrite /valid_edge/generic_trajectories.valid_edge xs=> /andP[].
move: under; rewrite (under_onVstrict vr)=> /orP[on | ].
- by case/negP: nq; rewrite pt_eqE (on_edge_same_point on on') xs eqxx.
+ by case/negP: nq; rewrite pt_eqE (on_edge_same_point on on') xs// !eqxx.
by rewrite (strict_under_edge_lower_y xs).
Qed.
@@ -1108,50 +1026,48 @@ move: (valre)=> /andP[] + _; rewrite le_eqVlt=> /orP[/eqP atl| inr].
have rltr : r'.x < (right_pt e).x by rewrite -rr' -atl edge_cond.
have /esym := edge_and_left_vertical_eq rltr (esym (etrans atl rr')).
by move/andP: rone => [] -> _ /eqP.
- by move/eqP/pue_left_edge: atl; rewrite subr_ge0 -req.
+ by move/pue_left_edge: atl; rewrite subr_ge0 -req.
have rue' : (r <<= e) = (area3 r (left_pt e) r' <= 0).
- move: rone=> /andP[] /[dup] tmp/area3_triangle_on_edge + _ => /(_ r).
+ move: rone=> /andP[] /[dup] tmp /eqP /area3_triangle_on_edge + _ => /(_ r).
(* TODO : fix area3_triangle_on_edge for cycle *)
rewrite (area3_opposite (left_pt _)).
rewrite (area3_opposite (left_pt _) _ (right_pt _)) !mulrN.
- rewrite inj_eq; last by apply: oppr_inj.
+ move=> /eqP; rewrite inj_eq; last by apply: oppr_inj.
move/eqP => signcond.
move: (edge_cond e); rewrite -subr_gt0 => /pmulr_rle0 <-.
rewrite /point_under_edge/generic_trajectories.point_under_edge subrr.
by rewrite signcond pmulr_rle0; last rewrite subr_gt0 -rr'.
have inr' : (left_pt e).x < r'.x by rewrite -rr'.
rewrite /point_under_edge/generic_trajectories.point_under_edge subrr.
-have /pue_right_edge : (right_pt (Bedge inr')).x == r.x.
- by rewrite /= rr' eqxx.
+have /pue_right_edge : (right_pt (Bedge inr')).x = r.x by rewrite /= rr'.
move: rue'.
rewrite /point_under_edge/generic_trajectories.point_under_edge subrr=> rue'.
by rewrite rue' subr_le0.
Qed.
Lemma aligned_trans a a' b p : a.x != b.x ->
- area3 a' a b == 0 ->
- area3 p a b == 0 -> area3 p a' b == 0.
+ area3 a' a b = 0 -> area3 p a b = 0 -> area3 p a' b = 0.
Proof.
rewrite -area3_cycle.
-move=> bna /[dup]/area3_triangle_on_edge proc a'ab pab.
-have/mulfI/inj_eq <- : a.x - b.x != 0 by rewrite subr_eq0.
-rewrite -area3_cycle -(eqP (proc _)).
-by rewrite area3_cycle (eqP pab) !mulr0.
+move=> bna /[dup] /area3_triangle_on_edge proc a'ab pab.
+apply/eqP.
+have /mulfI/inj_eq <- : a.x - b.x != 0 by rewrite subr_eq0.
+by rewrite -area3_cycle -(proc _) area3_cycle pab !mulr0.
Qed.
Lemma area3_change_ext a b a' b' p :
a.x < b.x -> a'.x < b'.x ->
- area3 a' a b == 0 -> area3 b' a b == 0 ->
+ area3 a' a b = 0 -> area3 b' a b = 0 ->
sg (area3 p a b) = sg (area3 p a' b').
Proof.
move=> altb altb' ona onb.
-have/area3_triangle_on_edge:= ona => /(_ p)/eqP ona'.
-have/area3_triangle_on_edge:= onb => /(_ p)/eqP onb0.
-have/area3_triangle_on_edge: area3 b' a' a == 0.
+have /area3_triangle_on_edge := ona => /(_ p) ona'.
+have /area3_triangle_on_edge := onb => /(_ p) onb0.
+have /area3_triangle_on_edge : area3 b' a' a = 0.
have bna : b.x != a.x by case: ltrgtP altb.
- by rewrite (aligned_trans bna) //
- area3_opposite oppr_eq0 area3_cycle.
-move=>/(_ p)/eqP onb'.
+ by rewrite (aligned_trans bna) // area3_opposite;
+ apply/eqP; rewrite oppr_eq0 area3_cycle; exact/eqP.
+move=>/(_ p) onb'.
have difab : 0 < b.x - a.x by rewrite subr_gt0.
have difab' : 0 < b'.x - a'.x by rewrite subr_gt0.
have [ | | aa' ] := ltrgtP (a.x) (a'.x); last first.
@@ -1159,8 +1075,9 @@ have [ | | aa' ] := ltrgtP (a.x) (a'.x); last first.
have/on_edge_same_point tmp : a === Bedge altb by exact: left_on_edge.
have/(tmp _) : a' === Bedge altb.
rewrite /point_on_edge ona /valid_edge/generic_trajectories.valid_edge.
+ rewrite eqxx/=.
by rewrite /= -aa' lexx ltW.
- rewrite aa'=> /(_ (eqxx _))/eqP ays.
+ rewrite aa' => /(_ erefl) ays.
have aa : a = a' by move: (a) (a') aa' ays=> [? ?][? ?] /= -> ->.
rewrite -aa area3_opposite [in RHS]area3_opposite.
rewrite -[RHS]mul1r -(gtr0_sg difab) -sgrM mulrN onb0 [X in _ - X]aa' -mulrN.
@@ -1170,7 +1087,7 @@ have [ | | aa' ] := ltrgtP (a.x) (a'.x); last first.
rewrite -area3_opposite -[in RHS]area3_cycle.
rewrite -(gtr0_sg difab) -sgrM ona' [in RHS]area3_opposite.
by rewrite mulrN -mulNr opprB sgrM (gtr0_sg xalta') mul1r.
-rewrite -subr_lt0=> xa'lta; apply/esym.
+rewrite -subr_lt0=> xa'lta; apply/esym.
rewrite area3_opposite -[X in -X]mul1r -mulNr sgrM sgrN1.
rewrite -(ltr0_sg xa'lta) -sgrM onb' sgrM (gtr0_sg difab').
rewrite area3_opposite -area3_cycle sgrN mulrN -(gtr0_sg difab).
@@ -1179,20 +1096,17 @@ by rewrite area3_opposite sgrN mulrN mulNr opprK mul1r.
Qed.
Lemma under_low_imp_under_high low_e high_e p :
-(left_pt low_e) <<= high_e ->
-(right_pt low_e) <<= high_e ->
-valid_edge low_e p ->
-valid_edge high_e p ->
-p <<= low_e -> p <<= high_e.
-Proof.
-move : low_e high_e => [ll lr inL] [hl hr inH] /=.
-move => pulh purh vallow valhigh.
-have := exists_point_valid vallow.
-move => [] p' vip .
-have := intersection_on_edge vip => [][] poep' eqx'.
-have := exists_point_valid valhigh.
-move => [] p'' vip' .
-have := intersection_on_edge vip' => [][] poep'' eqx''{vip' vip}.
+ left_pt low_e <<= high_e ->
+ right_pt low_e <<= high_e ->
+ valid_edge low_e p ->
+ valid_edge high_e p ->
+ p <<= low_e -> p <<= high_e.
+Proof.
+move : low_e high_e => [ll lr inL] [hl hr inH] /= pulh purh vallow valhigh.
+have [p' vip] := exists_point_valid vallow.
+have := intersection_on_edge vip => [][] poep' eqx'.
+have [p'' vip'] := exists_point_valid valhigh.
+have := intersection_on_edge vip' => [][] poep'' eqx''{vip' vip}.
have := poep''.
have := poep'.
@@ -1205,28 +1119,24 @@ rewrite -eqx' in linfp' p'infr.
rewrite -eqx'' in linfp'' p''infr.
move => puep.
-have ydiff : p.y <= p'.y.
- by rewrite -(under_edge_lower_y eqx' poep').
+have ydiff : p.y <= p'.y by rewrite -(under_edge_lower_y eqx' poep').
rewrite eqx' in eqx''.
-have puep' := (point_on_edge_under poep' pulh purh).
-have y'diff : p'.y <= p''.y.
- by rewrite -(under_edge_lower_y eqx'' poep'').
-have y''diff: (p.y <= p''.y).
- by rewrite (le_trans ydiff y'diff).
+have puep' := point_on_edge_under poep' pulh purh.
+have y'diff : p'.y <= p''.y by rewrite -(under_edge_lower_y eqx'' poep'').
+have y''diff : p.y <= p''.y by rewrite (le_trans ydiff y'diff).
rewrite -eqx' in eqx''.
have := ax4_three_triangles p hl hr p''.
-have /eqP pHleq := (area3_vert hl eqx'').
+have pHleq := area3_vert hl eqx''.
have /eqP pHreq := (area3_vert hr eqx'').
rewrite -area3_cycle in pHreq.
rewrite area3_opposite -area3_cycle in pHleq.
-move : poepf'' pHreq => /eqP -> -> .
-have : area3 p hl p'' = - ((p.x - hl.x) * (p''.y - p.y)).
- by rewrite -pHleq opprK.
+move : poepf'' pHreq => /eqP -> /eqP -> .
+have : area3 p hl p'' = - ((p.x - hl.x) * (p''.y - p.y)) by rewrite -pHleq opprK.
move => ->.
rewrite add0r -mulrBl.
-rewrite [x in (x - _) * _ == _] addrC.
+rewrite [x in (x - _) * _ = _] addrC.
rewrite addrKA opprK.
rewrite /= {pulh purh vallow valhigh poep' poep'' poepf' puep puep'}.
@@ -1235,25 +1145,23 @@ rewrite addrC.
have inH' := inH.
rewrite -subr_cp0 in inH'.
rewrite -subr_ge0 in y''diff.
-move => /eqP <-.
+move => <-.
by rewrite nmulr_rle0.
Qed.
Lemma under_low_imp_strict_under_high low_e high_e p :
-(left_pt low_e) <<= high_e ->
-(right_pt low_e) <<= high_e ->
-valid_edge low_e p ->
-valid_edge high_e p ->
-p <<< low_e -> p <<< high_e.
+ left_pt low_e <<= high_e ->
+ right_pt low_e <<= high_e ->
+ valid_edge low_e p ->
+ valid_edge high_e p ->
+ p <<< low_e -> p <<< high_e.
Proof.
move : low_e high_e => [ll lr inL] [hl hr inH] /=.
move => pulh purh vallow valhigh.
-have := exists_point_valid vallow.
-move => [] p' vip .
-have := intersection_on_edge vip => [][] poep' eqx'.
-have := exists_point_valid valhigh.
-move => [] p'' vip' .
-have := intersection_on_edge vip' => [][] poep'' eqx''{vip' vip}.
+have [p' vip] := exists_point_valid vallow.
+have := intersection_on_edge vip => [][] poep' eqx'.
+have [p'' vip'] := exists_point_valid valhigh.
+have := intersection_on_edge vip' => [][] poep'' eqx''{vip' vip}.
have := poep''.
have := poep'.
@@ -1265,28 +1173,25 @@ rewrite -eqx' in linfp' p'infr.
rewrite -eqx'' in linfp'' p''infr.
move => puep.
-have ydiff : p.y < p'.y.
- by rewrite -(strict_under_edge_lower_y eqx' poep').
+have ydiff : p.y < p'.y by rewrite -(strict_under_edge_lower_y eqx' poep').
rewrite eqx' in eqx''.
-have puep' := (point_on_edge_under poep' pulh purh).
-have y'diff : p'.y <= p''.y.
- by rewrite -(under_edge_lower_y eqx'' poep'').
-have y''diff: (p.y < p''.y).
- by rewrite (lt_le_trans ydiff y'diff).
+have puep' := point_on_edge_under poep' pulh purh.
+have y'diff : p'.y <= p''.y by rewrite -(under_edge_lower_y eqx'' poep'').
+have y''diff : p.y < p''.y by rewrite (lt_le_trans ydiff y'diff).
rewrite -eqx' in eqx''.
have := ax4_three_triangles p hl hr p''.
-have /eqP pHleq := (area3_vert hl eqx'').
-have /eqP pHreq := (area3_vert hr eqx'').
+have pHleq := area3_vert hl eqx''.
+have /eqP pHreq := area3_vert hr eqx''.
rewrite -area3_cycle in pHreq.
rewrite area3_opposite -area3_cycle in pHleq.
-move : poepf'' pHreq => /eqP -> -> .
+move : poepf'' pHreq => /eqP -> /eqP -> .
have : area3 p hl p'' = - ((p.x - hl.x) * (p''.y - p.y)).
by rewrite -pHleq opprK.
move => ->.
rewrite add0r -mulrBl.
-rewrite [x in (x - _) * _ == _] addrC.
+rewrite [x in (x - _) * _ = _]addrC.
rewrite addrKA opprK.
rewrite /= {pulh purh vallow valhigh poep' poep'' poepf' puep puep'}.
@@ -1294,25 +1199,22 @@ rewrite addrC.
have inH' := inH.
rewrite -subr_cp0 in inH'.
rewrite -subr_gt0 in y''diff.
-rewrite strictE.
-move => /eqP <-.
+rewrite strictE => <-.
by rewrite nmulr_rlt0.
Qed.
Lemma under_low_imp_under_high_bis low_e high_e p :
-~~ (left_pt high_e <<< low_e) ->
-~~ (right_pt high_e <<< low_e) ->
-valid_edge low_e p ->
-valid_edge high_e p ->
-p <<= low_e -> p <<= high_e.
+ ~~ (left_pt high_e <<< low_e) ->
+ ~~ (right_pt high_e <<< low_e) ->
+ valid_edge low_e p ->
+ valid_edge high_e p ->
+ p <<= low_e -> p <<= high_e.
Proof.
move : low_e high_e => [ll lr inL] [hl hr inH] .
move => pabhl pabhr vallow valhigh.
-have := exists_point_valid vallow.
-move => [] p' vip .
-have := intersection_on_edge vip => [][] poep' eqx'.
-have := exists_point_valid valhigh.
-move => [] p'' vip' .
+have [p' vip] := exists_point_valid vallow.
+have := intersection_on_edge vip => [][] poep' eqx'.
+have [p'' vip'] := exists_point_valid valhigh.
have := intersection_on_edge vip' => [][] poep'' eqx''{vip' vip}.
have := poep''.
have := poep'.
@@ -1325,29 +1227,25 @@ rewrite -eqx' in linfp' p'infr.
rewrite -eqx'' in linfp'' p''infr.
move => /= puep.
-have ydiff : p.y <= p'.y.
- by rewrite -(under_edge_lower_y eqx' poep').
+have ydiff : p.y <= p'.y by rewrite -(under_edge_lower_y eqx' poep').
rewrite eqx' in eqx''.
symmetry in eqx''.
-have pabp' := (point_on_edge_above poep'' pabhl pabhr).
-have y'diff : p'.y <= p''.y.
- by rewrite leNgt -(strict_under_edge_lower_y eqx'' poep').
-have y''diff: (p.y <= p''.y).
- by rewrite (le_trans ydiff y'diff).
+have pabp' := point_on_edge_above poep'' pabhl pabhr.
+have y'diff : p'.y <= p''.y by rewrite leNgt -(strict_under_edge_lower_y eqx'' poep').
+have y''diff : p.y <= p''.y by rewrite (le_trans ydiff y'diff).
rewrite -eqx' in eqx''.
have := ax4_three_triangles p hl hr p''.
have /eqP pHleq := (area3_vert hl eqx'').
-have /eqP pHreq := (area3_vert hr eqx'').
+have pHreq := area3_vert hr eqx''.
rewrite area3_opposite in pHreq.
rewrite area3_cycle in pHleq.
-move : poepf'' pHleq => /eqP -> -> .
-have : area3 p p'' hr = - ((p''.x - hr.x) * (p.y - p''.y)).
- by rewrite -pHreq opprK.
+move : poepf'' pHleq => /eqP -> /eqP -> .
+have : area3 p p'' hr = - ((p''.x - hr.x) * (p.y - p''.y)) by rewrite -pHreq opprK.
move => ->.
rewrite add0r addrC -mulrBl.
-rewrite [x in (x - _) * _ == _] addrC.
+rewrite [x in (x - _) * _ = _]addrC.
rewrite addrKA opprK.
rewrite /= {pabhl pabhr vallow valhigh poep' poep'' poepf' puep pabp'}.
@@ -1355,25 +1253,22 @@ rewrite addrC.
have inH' := inH.
rewrite -subr_gte0 in inH'.
rewrite -subr_le0 in y''diff.
-rewrite underE.
-move => /eqP <-.
+rewrite underE => <-.
by rewrite pmulr_rle0.
Qed.
Lemma under_low_imp_strict_under_high_bis low_e high_e p :
-~~ (left_pt high_e <<< low_e) ->
-~~ (right_pt high_e <<< low_e) ->
-valid_edge low_e p ->
-valid_edge high_e p ->
-p <<< low_e -> p <<< high_e.
+ ~~ (left_pt high_e <<< low_e) ->
+ ~~ (right_pt high_e <<< low_e) ->
+ valid_edge low_e p ->
+ valid_edge high_e p ->
+ p <<< low_e -> p <<< high_e.
Proof.
move : low_e high_e => [ll lr inL] [hl hr inH] .
move => pabhl pabhr vallow valhigh.
-have := exists_point_valid vallow.
-move => [] p' vip .
-have := intersection_on_edge vip => [][] poep' eqx'.
-have := exists_point_valid valhigh.
-move => [] p'' vip' .
+have [p' vip] := exists_point_valid vallow.
+have := intersection_on_edge vip => [][] poep' eqx'.
+have [ p'' vip'] := exists_point_valid valhigh.
have := intersection_on_edge vip' => [][] poep'' eqx''{vip' vip}.
have := poep''.
have := poep'.
@@ -1386,30 +1281,28 @@ rewrite -eqx' in linfp' p'infr.
rewrite -eqx'' in linfp'' p''infr.
move => /= puep.
-have ydiff : p.y < p'.y.
- by rewrite -(strict_under_edge_lower_y eqx' poep').
+have ydiff : p.y < p'.y by rewrite -(strict_under_edge_lower_y eqx' poep').
rewrite eqx' in eqx''.
symmetry in eqx''.
-have pabp' := (point_on_edge_above poep'' pabhl pabhr).
+have pabp' := point_on_edge_above poep'' pabhl pabhr.
have y'diff : p'.y <= p''.y
by rewrite leNgt -(strict_under_edge_lower_y eqx'' poep').
-have y''diff: (p.y < p''.y).
- by rewrite (lt_le_trans ydiff y'diff).
+have y''diff : p.y < p''.y by rewrite (lt_le_trans ydiff y'diff).
rewrite -eqx' in eqx''.
have := ax4_three_triangles p hl hr p''.
have /eqP pHleq := (area3_vert hl eqx'').
-have /eqP pHreq := (area3_vert hr eqx'').
+have pHreq := (area3_vert hr eqx'').
rewrite area3_opposite in pHreq.
rewrite area3_cycle in pHleq.
-move : poepf'' pHleq => /eqP -> -> .
-have : area3 p p'' hr = - ((p''.x - hr.x) * (p.y - p''.y)).
+move : poepf'' pHleq => /eqP -> /eqP -> .
+have : area3 p p'' hr = - ((p''.x - hr.x) * (p.y - p''.y)).
by rewrite -pHreq opprK.
move => ->.
rewrite add0r addrC -mulrBl.
-rewrite [x in (x - _) * _ == _] addrC.
+rewrite [x in (x - _) * _ = _]addrC.
rewrite addrKA opprK.
rewrite /= {pabhl pabhr vallow valhigh poep' poep'' poepf' puep pabp'}.
@@ -1417,8 +1310,7 @@ rewrite addrC.
have inH' := inH.
rewrite -subr_gte0 in inH'.
rewrite -subr_lt0 in y''diff.
-rewrite strictE.
-move => /eqP <-.
+rewrite strictE => <-.
by rewrite pmulr_rlt0.
Qed.
@@ -1465,7 +1357,7 @@ Qed.
Lemma edge_dir_intersect p1 p2 e1 :
p1.x != p2.x ->
- ~~(p1 <<= e1) -> p2 <<< e1 ->
+ ~~ (p1 <<= e1) -> p2 <<< e1 ->
exists p, area3 p (left_pt e1) (right_pt e1) = 0 /\
area3 p p1 p2 = 0 /\
(forall q, area3 q (left_pt e1) (right_pt e1) = 0 ->
@@ -1496,9 +1388,9 @@ have [p [p1 [p2 pu]]] := edge_dir_intersect le2xnre2x ca cu.
exists p; rewrite p1; split=> //.
rewrite /point_on_edge p2 eqxx /= /valid_edge.
rewrite /generic_trajectories.valid_edge.
-have/eqP ol2 := p2.
+have ol2 := p2.
have := area3_on_edge (left_pt e1) (right_pt e1) ol2 => /=.
-rewrite p1 mulr0 eq_sym addrC addr_eq0 -mulNr opprB=> /eqP signcond.
+rewrite p1 mulr0 => /esym/eqP; rewrite addrC addr_eq0 -mulNr opprB=> /eqP signcond.
case : (ltP (p.x) ((right_pt e2).x)).
move=>/[dup]/ltW ->; rewrite andbT -subr_gt0 -subr_le0.
rewrite -(pmulr_lgt0 _ ca') signcond.
@@ -1518,12 +1410,12 @@ have re2xnle2x : (right_pt e2).x != (left_pt e2).x.
by have := edge_cond e2; rewrite lt_neqAle eq_sym=> /andP[].
have [p [p1 [p2 pu]]] := edge_dir_intersect re2xnle2x ca cu.
move: p2; rewrite area3_opposite area3_cycle => /eqP.
-rewrite oppr_eq0=> /[dup] ol2 /eqP p2.
+rewrite oppr_eq0=> /[dup] /eqP ol2 p2.
exists p; rewrite p1; split=> //.
-rewrite /point_on_edge p2 eqxx /= /valid_edge.
+rewrite /point_on_edge p2/= /valid_edge.
rewrite /generic_trajectories.valid_edge.
have := area3_on_edge (left_pt e1) (right_pt e1) ol2 => /=.
-rewrite p1 mulr0 eq_sym addrC addr_eq0 -mulNr opprB=> /eqP signcond.
+rewrite p1 mulr0 => /esym/eqP; rewrite addrC addr_eq0 -mulNr opprB=> /eqP signcond.
case : (ltP (p.x) ((right_pt e2).x)).
move=>/[dup]/ltW ->; rewrite andbT -subr_gt0 -subr_le0.
rewrite -(nmulr_llt0 _ cu') signcond.
@@ -1539,8 +1431,7 @@ Definition lexPt (p1 p2 : pt) : bool :=
Definition lexePt (p1 p2 : pt) : bool :=
(p1.x < p2.x) || ((p1.x == p2.x) && (p1.y <= p2.y)).
-Lemma lexPtW p1 p2 :
- lexPt p1 p2 -> lexePt p1 p2.
+Lemma lexPtW p1 p2 : lexPt p1 p2 -> lexePt p1 p2.
Proof.
rewrite /lexPt /lexePt =>/orP [-> //=| /andP [] -> y_ineq].
rewrite ltW //.
@@ -1631,7 +1522,7 @@ Lemma on_edge_lexePt_left_pt (p : pt) g :
Proof.
move=> on.
have : (left_pt g).x <= p.x by move: on=> /andP[] _ /andP[].
-rewrite le_eqVlt=> /orP[/eqP/esym /[dup] samex' /eqP samex | xlt ].
+rewrite le_eqVlt=> /orP[/eqP/esym /[dup] samex' samex | xlt ].
have/eqP samey := on_edge_same_point on (left_on_edge _) samex.
have -> : p = left_pt g.
by apply/eqP; rewrite pt_eqE samex' samey !eqxx.
@@ -1652,14 +1543,14 @@ move: cpa cpb cpc; rewrite dp d'p d''p {dp d'p d''p}.
case: p=> [px py]; simpl p_x; simpl p_y=> cpa cpb cpc.
move=> c1' c2'.
have c1 : 0 <= pue_f px py a_x a_y b_x b_y.
- move: c1'; rewrite !(eqP (pue_f_eq _ _ _ _)) lexx ltxx !andTb -leNgt.
+ move: c1'; rewrite !(pue_f_eq _ _ _ _) lexx ltxx !andTb -leNgt.
by rewrite pue_f_o oppr_lte0 (pue_f_c px)=> /orP[].
have c2 : 0 <= pue_f px py b_x b_y c_x c_y.
- move: c2'; rewrite !(eqP (pue_f_eq _ _ _ _)) lexx ltxx !andTb -leNgt.
+ move: c2'; rewrite !(pue_f_eq _ _ _ _) lexx ltxx !andTb -leNgt.
by rewrite pue_f_o oppr_lte0 (pue_f_c px)=> /orP[].
move=> {c1' c2'}.
apply/orP; left.
-rewrite (eqP (pue_f_eq _ _ _ _)) lexx andTb pue_f_o -pue_f_c oppr_lte0.
+rewrite (pue_f_eq _ _ _ _) lexx andTb pue_f_o -pue_f_c oppr_lte0.
set p := Bpt px py.
have aright : 0 < area3 p (subpoint p) (Bpt a_x a_y).
by apply: point_sub_right.
@@ -1690,8 +1581,9 @@ have dify : ((left_pt e1 <<< e2) \/ (~~(left_pt e1 <<= e2))) -> (left_pt e1).y !
by move: disj; rewrite under_onVstrict // strict_nonAunder // -A pone2; case.
have pone2'': pue_f ((left_pt e2).x) ((left_pt e2).y)
((right_pt e2).x) ((right_pt e2).y)
- (p.x) (p.y) == 0.
- by rewrite -pue_f_c; move: pone2'; rewrite area3E pue_f_c.
+ (p.x) (p.y) = 0.
+ rewrite -pue_f_c; move: pone2'; rewrite area3E pue_f_c.
+ by move/eqP.
move: (edge_cond e2); rewrite -(subr_gt0 (_.x))=> ce2.
have dife2 : 0 < (right_pt e2).x - (left_pt e2).x.
by move: (edge_cond e2); rewrite -(subr_gt0 (_.x)).
@@ -1699,11 +1591,11 @@ have dife2' : (right_pt e2).x - (left_pt e2).x != 0.
by move: dife2; rewrite lt_neqAle eq_sym=> /andP[].
have plp2 : (left_pt e2).x = (left_pt e1).x -> p = left_pt e2.
move=> c; have:= on_edge_same_point pone2 (left_on_edge _).
- rewrite c px eqxx=> /(_ isT)=> /eqP; move: px c.
+ rewrite c px => /(_ erefl); move: px c.
by case: (p) (left_pt e2)=> [? ?][? ?]/= <- <- ->.
have prp2 : (right_pt e2).x = (left_pt e1).x -> p = right_pt e2.
move=> c; have:= on_edge_same_point pone2 (right_on_edge _).
- rewrite c px eqxx=> /(_ isT)=> /eqP; move: px c.
+ rewrite c px => /(_ erefl); move: px c.
by case: (p) (right_pt e2)=> [? ?][? ?]/= <- <- ->.
have main : (0 < area3 (left_pt e1) (left_pt e2) (right_pt e2)) =
(p.y < (left_pt e1).y).
@@ -1713,7 +1605,7 @@ have main : (0 < area3 (left_pt e1) (left_pt e2) (right_pt e2)) =
by rewrite -atleft pisl (edge_cond e2).
have fact1 : (0 < p.x - (left_pt e2).x) by rewrite subr_gt0 -px.
rewrite -(pmulr_rgt0 _ fact1) area3_opposite mulrN.
- rewrite -(eqP (area3_triangle_on_edge (left_pt e1) pone2')) -mulrN.
+ rewrite -(area3_triangle_on_edge (left_pt e1) (eqP pone2')) -mulrN.
rewrite -area3_opposite area3_cycle pmulr_rgt0 //.
by apply: edge_and_right_vertical; rewrite -px.
have arith : forall (a b : R), a <= 0 -> b <= 0 -> a + b <= 0.
@@ -1729,7 +1621,7 @@ have case1 : left_pt e1 <<< e2 -> e1 <| e2.
have : 0 < area3 p (left_pt e1) (right_pt e1).
by rewrite edge_and_left_vertical // -px (edge_cond e1).
rewrite -(pmulr_rgt0 _ ce2).
- rewrite (eqP (area3_on_edge (left_pt e1) (right_pt e1) pone2')).
+ rewrite (area3_on_edge (left_pt e1) (right_pt e1) (eqP pone2')).
rewrite ltNge arith //.
apply: mulr_ge0_le0; first by rewrite -px subr_ge0.
by move: re2b; rewrite underE -area3_cycle.
@@ -1746,7 +1638,7 @@ have : 0 < area3 (left_pt e1) p (right_pt e1).
by rewrite edge_and_left_vertical // (edge_cond e1).
rewrite area3_opposite -area3_cycle.
rewrite -(pmulr_rgt0 _ dife2) mulrN.
-move: (eqP (area3_on_edge (left_pt e1) (right_pt e1) pone2')) => ->.
+rewrite (area3_on_edge (left_pt e1) (right_pt e1) (eqP pone2')).
by rewrite oppr_gt0 ltNge addr_ge0 // mulr_ge0 // -px subr_ge0.
Qed.
@@ -1759,8 +1651,8 @@ move=> nc e1 e2 e1in e2in.
have nc' := inter_at_ext_sym nc.
have ceq : e1 = e2 -> below_alt e1 e2.
move=> <-; left; apply/orP; left; rewrite !underE.
- rewrite (fun a b => eqP (proj1 (area3_two_points a b))).
- rewrite (fun a b => eqP (proj1 (proj2 (area3_two_points a b)))).
+ rewrite (fun a b => proj1 (area3_two_points a b)).
+ rewrite (fun a b => proj1 (proj2 (area3_two_points a b))).
by rewrite lexx.
have [/eqP/ceq // | e1ne2] := boolP(e1 == e2).
have [/eqP | {}nc ] := nc _ _ e1in e2in; first by rewrite (negbTE e1ne2).
@@ -1876,9 +1768,9 @@ Lemma common_point_edges_y_left r r1 r2 e1 e2 :
Proof.
move=> v xl rr1 rr2 e1e2 re1 re2.
have xl': r.x = (left_pt e1).x by apply: le_anti; rewrite xl; case/andP:v.
-have:= on_edge_same_point e1e2 re2; rewrite -xl' rr2 eqxx=> /(_ isT)/eqP <-.
+have:= on_edge_same_point e1e2 re2; rewrite -xl' rr2 => /(_ erefl) <-.
have:= on_edge_same_point (left_on_edge _) re1.
-by rewrite -xl' rr1 eqxx=>/(_ isT)/eqP<-.
+by rewrite -xl' rr1 =>/(_ erefl) <-.
Qed.
Lemma common_point_edges_y_right r r1 r2 e1 e2 :
@@ -1890,9 +1782,9 @@ Proof.
move=> v xl rr1 rr2 e1e2 re1 re2.
have xl': r.x = (right_pt e1).x.
by apply: le_anti; rewrite xl andbC; case/andP:v.
-have:= on_edge_same_point e1e2 re2; rewrite -xl' rr2 eqxx=> /(_ isT)/eqP <-.
+have:= on_edge_same_point e1e2 re2; rewrite -xl' rr2 => /(_ erefl) <-.
have:= on_edge_same_point (right_on_edge _) re1.
- by rewrite -xl' rr1 eqxx=>/(_ isT)/eqP<-.
+ by rewrite -xl' rr1 =>/(_ erefl) <-.
Qed.
Lemma expand_valid p q (pq : p.x < q.x) e r :
@@ -1932,22 +1824,22 @@ have yq : q1.y < q2.y by rewrite (le_lt_trans qyge).
move=> {pyge qyge pylt qylt abbrev}.
have [/[dup]p1p2 + /[dup] q1q2 +] : [/\ p1.x == p2.x & q1.x == q2.x].
by rewrite -p1p p2p -q1q q2q !eqxx.
-move=>/eqP/esym/eqP p2p1 /eqP/esym/eqP q2q1.
+move=>/eqP/esym p2p1 /eqP/esym q2q1.
move: (pone1) (pone2) (qone1) (qone2).
-move=>/andP[]pl1 _ /andP[]pl2 _ /andP[]ql1 _ /andP[] ql2 _.
+move=>/andP[/eqP pl1 _] /andP[/eqP pl2 _] /andP[/eqP ql1 _] /andP[/eqP ql2 _].
have [pltq | qltp | pq ] := ltrgtP (p.x) (q.x).
- have [p1q1 p2q2] : p1.x < q1.x /\ p2.x < q2.x.
by rewrite -p1p -q1q -p2p -q2q .
set e3 := Bedge p1q1; set e4 := Bedge p2q2.
- have l3a : ~~(left_pt e3 <<= e4).
- by move/(@pue_left_edge e4):p2p1=> -> /=; rewrite subr_ge0 -ltNge.
+ have l3a : ~~ (left_pt e3 <<= e4).
+ by move/(@pue_left_edge e4) : p2p1 => -> /=; rewrite subr_ge0 -ltNge.
have r3u : right_pt e3 <<< e4.
- by move/(@psue_right_edge e4):q2q1=> -> /=; rewrite subr_lt0.
+ by move/(@psue_right_edge e4) : q2q1 => -> /=; rewrite subr_lt0.
have [pi [pi4 /andP[pi3 piint]]] := intersection_middle_au l3a r3u.
have pi1 : pi === e1.
apply/andP; split; last first.
- apply: (expand_valid piint);
- by rewrite /valid_edge/generic_trajectories.valid_edge -?p1p -?q1q.
+ by apply: (expand_valid piint);
+ rewrite /valid_edge/generic_trajectories.valid_edge -?p1p -?q1q.
rewrite -sgr_eq0 (area3_change_ext _ (edge_cond e1) p1q1) //.
by rewrite (eqP pi3) /sg !eqxx.
have pi2 : pi === e2.
@@ -1995,7 +1887,7 @@ have [pltq | qltp | pq ] := ltrgtP (p.x) (q.x).
have abs := right_ext _ _ _ vp1 pip p1p p2p pi2 pone1 pone2.
by move: yp; rewrite abs ltxx.
have := conj (on_edge_same_point pone1 qone1) (on_edge_same_point pone2 qone2).
-rewrite -p1p -p2p pq q1q q1q2 !eqxx=> -[]/(_ isT)/eqP p1q1 /(_ isT)/eqP p2q2.
+rewrite -p1p -p2p pq q1q (eqP q1q2) => -[]/(_ erefl) p1q1 /(_ erefl) p2q2.
by move: yp; rewrite p1q1 p2q2; rewrite ltNge le_eqVlt yq orbT.
Qed.
@@ -2026,7 +1918,7 @@ Qed.
Definition on_pvert p e : p === e -> pvert_y p e = p.y.
Proof.
move=> /[dup]/andP[] _ vpe pone.
-by have := on_edge_same_point pone (pvert_on vpe) (eqxx _) => /eqP ->.
+by rewrite (on_edge_same_point pone (pvert_on vpe)).
Qed.
Definition cmp_slopes e1 e2 :=
@@ -2049,9 +1941,9 @@ Lemma same_left_edge_below_slopes e1 e2 :
Proof.
move=> sameleft.
rewrite /edge_below !underE [in X in X || _]sameleft.
-rewrite (eqP (proj1 (area3_two_points _ _))) lexx /=.
+rewrite (proj1 (area3_two_points _ _)) lexx /=.
rewrite !strictE -[in X in _ || X]sameleft -!leNgt.
-rewrite (eqP (proj1 (area3_two_points _ _))) lexx /=.
+rewrite (proj1 (area3_two_points _ _)) lexx /=.
rewrite !area3E !(proj1 (pue_f_eq_slopes _ _ _ _ _ _)).
rewrite /cmp_slopes sameleft -opprB oppr_le0.
rewrite [X in (_ <= X - _) || _]mulrC.
@@ -2066,9 +1958,9 @@ Lemma same_right_edge_below_slopes e1 e2 :
Proof.
move=> sameright.
rewrite /edge_below !underE [in X in X || _]sameright.
-rewrite (eqP (proj1 (proj2 (area3_two_points _ _)))) lexx /=.
+rewrite (proj1 (proj2 (area3_two_points _ _))) lexx /=.
rewrite !strictE -[in X in _ || X]sameright -!leNgt.
-rewrite (eqP (proj1 (proj2 (area3_two_points _ _)))) lexx /= !andbT.
+rewrite (proj1 (proj2 (area3_two_points _ _))) lexx /= !andbT.
rewrite !area3E !(proj2 (pue_f_eq_slopes _ _ _ _ _ _)).
rewrite /cmp_slopes sameright oppr_le0 opprB.
rewrite !(mulrC ((right_pt e2).y - _)) orbb.
@@ -2170,7 +2062,7 @@ move: (val) => /andP[] _; rewrite le_eqVlt=> /orP[/eqP atr | le1ltre2].
rewrite /cmp_slopes atr.
have eqps : left_pt e1 = right_pt e2.
have := on_edge_same_point (right_on_edge _) on2.
- rewrite atr eqxx => /(_ isT) /eqP; move: (right_pt e2) (left_pt e1) atr.
+ rewrite atr => /(_ erefl); move: (right_pt e2) (left_pt e1) atr.
by move=> [] ? ? [] ? ? /= -> ->.
rewrite area3_opposite area3_cycle.
rewrite sgrN.
@@ -2180,7 +2072,7 @@ move: (val) => /andP[] _; rewrite le_eqVlt=> /orP[/eqP atr | le1ltre2].
by rewrite mulrN mulNr -opprD opprB.
set e2' := Bedge le1ltre2.
have signcond := area3_change_ext (right_pt e1) (edge_cond e2) le1ltre2
- form (proj1 (proj2 (area3_two_points _ _))).
+ (eqP form) (proj1 (proj2 (area3_two_points _ _))).
rewrite {}signcond.
have on2' : left_pt e2' === e2 by exact: on2.
rewrite cmp_slopesE -(on_edge_same_slope_right on2')// -cmp_slopesE.
@@ -2205,7 +2097,7 @@ move: (val) => /andP[] + _; rewrite le_eqVlt eq_sym=> /orP[/eqP atl | le2ltre1].
rewrite /cmp_slopes atl.
have eqps : right_pt e1 = left_pt e2.
have := on_edge_same_point (left_on_edge _) on2.
- rewrite atl eqxx => /(_ isT) /eqP; move: (right_pt e1) (left_pt e2) atl.
+ rewrite atl => /(_ erefl); move: (right_pt e1) (left_pt e2) atl.
by move=> [] ? ? [] ? ? /= -> ->.
rewrite !area3E !(proj1 (pue_f_eq_slopes _ _ _ _ _ _)).
rewrite eqps (mulrC (_.x - _)).
@@ -2213,7 +2105,7 @@ move: (val) => /andP[] + _; rewrite le_eqVlt eq_sym=> /orP[/eqP atl | le2ltre1].
by rewrite mulrN mulNr -opprD opprB.
set e2' := Bedge le2ltre1.
have signcond := area3_change_ext (left_pt e1) (edge_cond e2) le2ltre1
- (proj1 (area3_two_points _ _)) form.
+ (proj1 (area3_two_points _ _)) (eqP form).
rewrite {}signcond.
have on2' : right_pt e2' === e2 by exact: on2.
rewrite cmp_slopesE -(on_edge_same_slope_left on2')// -cmp_slopesE.
@@ -2321,11 +2213,11 @@ have pp : p1 = p2 by rewrite p1q p2q vyq.
move: (ve1) => /andP[] + _; rewrite le_eqVlt=>/orP[/eqP pleft | pmid] /=.
have p1l : p1 = left_pt e1.
apply/esym/eqP; rewrite pt_eqE.
- by rewrite (on_edge_same_point (left_on_edge _) on1) pleft p1q eqxx.
+ by rewrite (on_edge_same_point (left_on_edge _) on1) pleft p1q// eqxx andbT.
move: ve2 => /andP[] + _; rewrite le_eqVlt=> /orP [/eqP pleft2 | pmid2].
have p2l : p2 = left_pt e2.
apply/esym/eqP; rewrite pt_eqE.
- by rewrite (on_edge_same_point (left_on_edge _) on2) pleft2 p2q eqxx.
+ by rewrite (on_edge_same_point (left_on_edge _) on2) pleft2 p2q// eqxx andbT.
by apply: same_left_edge_below_slopes; rewrite -p1l pp.
have le2ltp2 : (left_pt e2).x < p2.x by rewrite p2q.
have [e2' [le2' re2' sle2']] := sub_edge_left on2 le2ltp2.
@@ -2363,7 +2255,7 @@ rewrite le_eqVlt eq_sym -Weq (negbTE difslope) /=.
move: (ve2) => /andP[] + _; rewrite le_eqVlt => /orP [/eqP l2p | l2ltp].
have /eqP p2l : left_pt e2 == p1.
rewrite pt_eqE.
- rewrite (eqP (on_edge_same_point (left_on_edge _) on2 _)) -pp l2p p1q //=.
+ rewrite (on_edge_same_point (left_on_edge _) on2 _) -pp l2p p1q //=.
by rewrite !eqxx.
have/contact_left_slope[_ eq3] : left_pt e2 === e1 by rewrite p2l.
move: on1=>/andP[] /eqP + _; rewrite -p2l => eq4.
@@ -2407,11 +2299,11 @@ have pp : p1 = p2 by rewrite p1q p2q vyq.
move: (ve1) => /andP[] _ +; rewrite le_eqVlt=>/orP[/eqP pright | pmid] /=.
have p1r : p1 = right_pt e1.
apply/eqP; rewrite pt_eqE.
- by rewrite (on_edge_same_point on1 (right_on_edge _)) -pright p1q eqxx.
+ by rewrite (on_edge_same_point on1 (right_on_edge _)) -pright p1q// eqxx andbT.
move: ve2 => /andP[] _; rewrite le_eqVlt=> /orP [/eqP pright2 | pmid2].
have p2l : p2 = right_pt e2.
apply/eqP; rewrite pt_eqE.
- by rewrite (on_edge_same_point on2 (right_on_edge _)) -pright2 p2q eqxx.
+ by rewrite (on_edge_same_point on2 (right_on_edge _)) -pright2 p2q// eqxx andbT.
by apply: same_right_edge_below_slopes; rewrite -p1r pp.
have p2ltre2 : p2.x < (right_pt e2).x by rewrite p2q.
have [e2' [le2' re2' sle2']] := sub_edge_right on2 p2ltre2.
@@ -2449,7 +2341,7 @@ rewrite le_eqVlt -Weq (negbTE difslope) /=.
move: (ve2) => /andP[] _; rewrite le_eqVlt => /orP [/eqP r2p | pltr2].
have /eqP p2r : right_pt e2 == p1.
rewrite pt_eqE.
- rewrite -(eqP (on_edge_same_point on2 (right_on_edge _) _)) -pp -r2p p1q //=.
+ rewrite -(on_edge_same_point on2 (right_on_edge _) _) -pp -r2p p1q //=.
by rewrite !eqxx.
have/contact_right_slope[_ eq3] : right_pt e2 === e1 by rewrite p2r.
move: on1=>/andP[] /eqP + _; rewrite -p2r => eq4.
@@ -2507,31 +2399,17 @@ rewrite (edge_below_equiv' valb noc) //.
by apply: pedge_below_trans'.
Qed.
-
Lemma left_pt_above g : left_pt g >>= g.
-Proof.
-rewrite strictE.
-rewrite (eqP (proj1 (area3_two_points _ _))).
-by rewrite ltxx.
-Qed.
+Proof. by rewrite strictE (proj1 (area3_two_points _ _)) ltxx. Qed.
Lemma right_pt_above g : right_pt g >>= g.
-Proof.
-rewrite strictE.
-by rewrite (eqP (proj1 (proj2 (area3_two_points _ _)))) ltxx.
-Qed.
+Proof. by rewrite strictE (proj1 (proj2 (area3_two_points _ _))) ltxx. Qed.
Lemma left_pt_below g : left_pt g <<= g.
-Proof.
-rewrite underE (eqP (proj1 (area3_two_points _ _))).
-by rewrite lexx.
-Qed.
+Proof. by rewrite underE (proj1 (area3_two_points _ _)) lexx. Qed.
Lemma right_pt_below g : right_pt g <<= g.
-Proof.
-rewrite underE.
-by rewrite (eqP (proj1 (proj2 (area3_two_points _ _)))) lexx.
-Qed.
+Proof. by rewrite underE (proj1 (proj2 (area3_two_points _ _))) lexx. Qed.
Lemma under_pvert_y (p : pt) (e : edge) :
valid_edge e p -> (p <<= e) = (p.y <= pvert_y p e).
@@ -2552,18 +2430,17 @@ by rewrite (strict_under_edge_lower_y xs one).
Qed.
Lemma same_x_valid (p1 p2 : pt) (g : edge) :
- p1.x == p2.x -> valid_edge g p1 = valid_edge g p2.
+ p1.x = p2.x -> valid_edge g p1 = valid_edge g p2.
Proof.
-by move=> /eqP xs; rewrite /valid_edge/generic_trajectories.valid_edge xs.
+by move=> xs; rewrite /valid_edge /generic_trajectories.valid_edge xs.
Qed.
Lemma same_pvert_y (p1 p2 : pt) (g : edge) :
- valid_edge g p1 ->
- p1.x == p2.x -> pvert_y p1 g = pvert_y p2 g.
+ valid_edge g p1 -> p1.x = p2.x -> pvert_y p1 g = pvert_y p2 g.
Proof.
-move=> vg xs; apply/eqP.
+move=> vg xs.
move: (vg) ; rewrite (same_x_valid _ xs) => vg2.
-by have := on_edge_same_point (pvert_on vg) (pvert_on vg2) xs.
+exact: (on_edge_same_point (pvert_on vg) (pvert_on vg2) xs).
Qed.
Lemma edge_below_pvert_y g1 g2 p :
@@ -2572,11 +2449,11 @@ Lemma edge_below_pvert_y g1 g2 p :
Proof.
move=> v1 v2 g1g2.
have := pvert_on v1; set p' := Bpt _ _ => p'on.
-have/esym := @same_x_valid p p' g1 (eqxx _); rewrite v1 => v'1.
-have/esym := @same_x_valid p p' g2 (eqxx _); rewrite v2 => v'2.
+have/esym := @same_x_valid p p' g1 erefl; rewrite v1 => v'1.
+have/esym := @same_x_valid p p' g2 erefl; rewrite v2 => v'2.
have := order_edges_viz_point' v'1 v'2 g1g2.
rewrite (under_onVstrict v'1) p'on => /(_ isT).
-by rewrite under_pvert_y //.
+by rewrite under_pvert_y.
Qed.
Lemma pvert_y_edge_below g1 g2 p :
diff --git a/theories/safe_cells.v b/theories/safe_cells.v
index 6f65f4b..59d50d8 100644
--- a/theories/safe_cells.v
+++ b/theories/safe_cells.v
@@ -201,8 +201,8 @@ do 5 move=> /andP[] _.
move=> /andP[] rn0 /andP[] rsx /andP[] srt /andP[] _ lon.
have p'q : p' = last dummy_pt (right_pts c).
have := on_edge_same_point p'on lon.
- rewrite (allP rsx _ pin)=> /(_ isT)=> samey.
- by apply/(@eqP pt); rewrite pt_eqE samey (allP rsx _ pin).
+ have /eqP -> := allP rsx _ pin => /(_ erefl) samey.
+ by apply/(@eqP pt); rewrite pt_eqE samey (allP rsx _ pin)/=; exact/eqP.
move: rn0 p'q pin srt.
elim/last_ind: (right_pts c) => [| rpts p2 Ih] // _ p'q pin srt.
move: pin; rewrite mem_rcons inE => /orP[/eqP -> | pin].
@@ -243,9 +243,9 @@ move=> /andP[] ln0 /andP[] lsx /andP[] srt /andP[] hon _.
have p'q : p' = head dummy_pt (left_pts c).
have := on_edge_same_point p'on hon.
rewrite (eqP (allP lsx _ pin)).
- rewrite (x_left_pts_left_limit cok (head_in_not_nil _ ln0)) eqxx.
- move=> /(_ isT)=> samey.
- apply/(@eqP pt); rewrite pt_eqE samey andbT.
+ rewrite (x_left_pts_left_limit cok (head_in_not_nil _ ln0)).
+ move=> /(_ erefl) samey.
+ apply/(@eqP pt); rewrite pt_eqE samey eqxx andbT.
rewrite (eqP (allP lsx _ pin)) eq_sym.
by rewrite (allP lsx _ (head_in_not_nil _ ln0)).
move: ln0 p'q pin srt.
@@ -275,10 +275,10 @@ have : left_limit pc1 <= p_x p.
by move:(pong)=> /andP[] _ /andP[]; rewrite lpcc.
rewrite le_eqVlt=> /orP[ /eqP pxq | ].
have plg : p = left_pt g.
- move: lpcc; rewrite /= pxq=> /eqP samex.
+ move: lpcc; rewrite /= pxq=> samex.
have := on_edge_same_point pong (left_on_edge _).
- rewrite samex=> /(_ isT) samey.
- by apply/(@eqP pt); rewrite pt_eqE samex samey.
+ rewrite samex=> /(_ erefl) samey.
+ by apply/(@eqP pt); rewrite pt_eqE samex samey !eqxx.
have pin : p \in points.
apply: obstacles_point_in; rewrite mem_cat; apply/orP; left.
by rewrite plg map_f.
@@ -306,7 +306,7 @@ rewrite le_eqVlt=> /orP[ /eqP pxq | ].
by rewrite prlq le_refl andbT (non_empty_closed ccl').
elim: pcc pc1 pcccl highs conn rpcc {lpcc pccn0} =>
[ | pc2 pcc Ih] pc1 pcccl highs conn rpcc pc1lp.
- have pc1cl : pc1 \in closed by apply: pcccl; rewrite inE eqxx.
+ have pc1cl : pc1 \in closed by apply: pcccl; rewrite inE eqxx.
have hpc1 : high pc1 = g by apply: (highs _ (mem_head _ _)).
move: rpcc; rewrite /last_cell/= => rpc1.
have vgp : valid_edge g p by move: pong=> /andP[].
@@ -334,9 +334,10 @@ elim: pcc pc1 pcccl highs conn rpcc {lpcc pccn0} =>
noc1 (closed_ok pc1cl) _ ponh; apply.
rewrite pc1lp /= rpc1.
move: (pong)=> /andP[] _ /andP[] _; rewrite le_eqVlt=> /orP[]; last by [].
- move=> abs.
+ move=> /eqP abs.
move: pnr=> /negP[]; rewrite pt_eqE abs /=.
- by have := on_edge_same_point pong (right_on_edge _) abs.
+ rewrite (on_edge_same_point pong (right_on_edge _)) -abs//.
+ by rewrite !eqxx.
have vph1 : valid_edge (high pc1) p by move: ponh=> /andP[].
have [cqc' | ] := disj_closed ccl pc1cl.
by move: puh; rewrite strict_nonAunder cqc' // ponh.
From 96e7b3a8257e27c03b182f97f7bd2c0d0584fb38 Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Tue, 30 Apr 2024 16:33:36 +0200
Subject: [PATCH 26/43] reinstate the separation between the abstract
presentation of shortest_path and the rest of generic_trajectories. adds a
new function to be extracted so that we can visualize the piecewise linear
trajectory
---
_CoqProject | 1 +
theories/generic_trajectories.v | 173 ++++++++++----------
theories/shortest_path.v | 273 +++++++++++---------------------
theories/smooth_trajectories.v | 4 +
www/Makefile.coq.local | 2 +-
5 files changed, 190 insertions(+), 263 deletions(-)
diff --git a/_CoqProject b/_CoqProject
index a923345..73b65ce 100644
--- a/_CoqProject
+++ b/_CoqProject
@@ -1,3 +1,4 @@
+theories/shortest_path.v
theories/generic_trajectories.v
theories/smooth_trajectories.v
theories/convex.v
diff --git a/theories/generic_trajectories.v b/theories/generic_trajectories.v
index 28a29b6..ab59cc9 100644
--- a/theories/generic_trajectories.v
+++ b/theories/generic_trajectories.v
@@ -1,5 +1,6 @@
From mathcomp Require Import all_ssreflect.
Require Import ZArith (* List *) String OrderedType OrderedTypeEx FMapAVL.
+Require Import shortest_path.
Notation head := seq.head.
Notation sort := path.sort.
@@ -432,63 +433,6 @@ Definition edges_to_cells bottom top edges :=
(* To compute a path that has reasonable optimzation, we compute a shortest *)
(* path between reference points chosen inside doors. *)
-Section shortest_path.
-
-Variable cell : Type.
-Variable node : Type.
-Variable node_eqb : node -> node -> bool.
-Variable neighbors_of_node : node -> seq (node * R).
-Variable source target : node.
-
-Definition gpath := seq node.
-Variable priority_queue : Type.
-Variable empty : priority_queue.
-Variable gfind : priority_queue -> node -> option (gpath * option R).
-Variable update : priority_queue -> node -> gpath -> option R -> priority_queue.
-Variable pop : priority_queue -> option (node * gpath * option R * priority_queue).
-
-Definition cmp_option (v v' : option R) :=
- if v is Some x then
- if v' is Some y then
- (R_ltb x y)%O
- else
- true
- else
- false.
-
-Definition Dijkstra_step (d : node) (p : seq node) (dist : R)
- (q : priority_queue) : priority_queue :=
- let neighbors := neighbors_of_node d in
- foldr (fun '(d', dist') q =>
- match gfind q d' with
- | None => q
- | Some (p', o_dist) =>
- let new_dist_to_d' := Some (R_add dist dist') in
- if cmp_option new_dist_to_d' o_dist then
- update q d' (d :: p) new_dist_to_d'
- else q
- end) q neighbors.
-
-Fixpoint Dijkstra (fuel : nat) (q : priority_queue) :=
- match fuel with
- | 0%nat => None
- |S fuel' =>
- match pop q with
- | Some (d, p, Some dist, q') =>
- if node_eqb d target then Some p else
- Dijkstra fuel' (Dijkstra_step d p dist q')
- | _ => None
- end
- end.
-
-Definition shortest_path (s : seq node) :=
- Dijkstra (size s)
- (update (foldr [fun n q => update q n [::] None] empty s)
- source [::] (Some R0)).
-
-End shortest_path.
-
-
(* defining the connection relation between adjacent cells. Two cells
are adjacent when it is possible to move from one cell directly to the
other without colliding an obstacle edge. In the data structure, it means
@@ -501,6 +445,9 @@ Definition vert_edge_eqb (v1 v2 : vert_edge) :=
let: Build_vert_edge v2x v2t v2b := v2 in
R_eqb v1x v2x && R_eqb v1t v2t && R_eqb v1b v2b.
+(* the lists of points left_pts and right_pts for each cell define the
+ extremities of the doors, but we wish to have a list of all doors,
+ obtained by making intervals between two points. *)
Fixpoint seq_to_intervals_aux [A : Type] (a : A) (s : seq A) :=
match s with
| nil => nil
@@ -524,9 +471,19 @@ Definition cell_safe_exits_right (c : cell) : seq vert_edge :=
map (fun p => Build_vert_edge lx (p_y (fst p)) (p_y (snd p)))
(seq_to_intervals (rev (right_pts c))).
+(* The index_seq function is a trick to circumvent the absence of a mapi
+ function in Coq code. It makes it possible to build a list of pairs,
+ where each element is annotated with its position in the list. *)
Definition index_seq {T : Type} (s : list T) : list (nat * T) :=
zip (iota 0 (size s)) s.
+(* Given a set of cells (given as a sequence), we wish to construct all
+ the vertical edges (called doors) connecting two cells, and we wish each
+ door to contain information about the cells they are connected to, here
+ their rank in the sequence of cells. *)
+
+Definition door := (vert_edge * nat * nat)%type.
+
Definition cells_to_doors (s : list cell) :=
let indexed_s := index_seq s in
let vert_edges_and_right_cell :=
@@ -549,13 +506,17 @@ Definition on_vert_edge (p : pt) (v : vert_edge) : bool :=
Definition vert_edge_midpoint (ve : vert_edge) : pt :=
{|p_x := ve_x ve; p_y := R_div ((R_add (ve_top ve) (ve_bot ve))) R2|}.
+(* When a vertical edge contains the source or the target, we wish this
+ point to be considered as the reference point for that edge. *)
Definition vert_edge_to_reference_point (s t : pt) (v : vert_edge) :=
if on_vert_edge s v then s
else if on_vert_edge t v then t
else vert_edge_midpoint v.
-Definition door := (vert_edge * nat * nat)%type.
-
+(* Each door has one or two neighboring cells, the neighboring doors
+ are those doors that share one of these neighboring cells. Here we only
+ want to know the index of the neighbors. We make sure to avoid including
+ the current door in the neighbors. *)
Definition one_door_neighbors
(indexed_doors : seq (nat * door))
(i_d : nat * door) : list nat :=
@@ -571,12 +532,19 @@ Definition left_limit (c : cell) := p_x (seq.last dummy_pt (left_pts c)).
Definition right_limit c := p_x (seq.last dummy_pt (right_pts c)).
+Definition cmp_option := cmp_option _ R_ltb.
+
Definition strict_inside_closed p c :=
negb (point_under_edge p (low c)) &&
point_strictly_under_edge p (high c) &&
(R_ltb (left_limit c) (p_x p) &&
(R_ltb (p_x p) (right_limit c))).
+(* For each extremity, we check whether it is already inside an existing
+ door. If it is the case, we need to remember the index of that door.
+ If the extremity is not inside a door, then we create a fictitious door,
+ where the neighboring cells both are set to the one cell containing this
+ point. *)
Definition add_extremity_reference_point
(indexed_cells : seq (nat * cell))
(p : pt) (doors : seq door) :=
@@ -590,6 +558,10 @@ Definition add_extremity_reference_point
(filter (fun '(i', c') => strict_inside_closed p c') indexed_cells) in
(rcons doors ({|ve_x := p_x p; ve_top := p_y p; ve_bot := p_y p|}, i, i), size doors).
+(* This function makes sure that the sequence of doors contains a door
+ for each of the extremities, adding new doors when needed. It returns
+ the updated sequence of doors and the indexes for the doors containing
+ each of the extremities. *)
Definition doors_and_extremities (indexed_cells : seq (nat * cell))
(doors : seq door) (s t : pt) : seq door * nat * nat :=
let '(d_s, i_s) :=
@@ -598,6 +570,8 @@ Definition doors_and_extremities (indexed_cells : seq (nat * cell))
add_extremity_reference_point indexed_cells t d_s in
(d_t, i_s, i_t).
+(* In the end the door adjacency map describes the graph in which we
+ want to compute paths. *)
Definition door_adjacency_map (doors : seq door) :
seq (seq nat) :=
let indexed_doors := index_seq doors in
@@ -608,6 +582,10 @@ Definition dummy_vert_edge :=
Definition dummy_door := (dummy_vert_edge, 0, 0).
+(* To compute the distance between two doors, we compute the distance
+ between the reference points. TODO: this computation does not take
+ into account the added trajectory to go to a safe point inside the
+ cell where the doors are vertically aligned. *)
Definition distance (doors : seq door) (s t : pt)
(i j : nat) :=
let '(v1, _, _) := seq.nth dummy_door doors i in
@@ -616,6 +594,8 @@ Definition distance (doors : seq door) (s t : pt)
let p2 := vert_edge_to_reference_point s t v2 in
pt_distance (p_x p1) (p_y p1) (p_x p2) (p_y p2).
+(* The function cells_too_doors_graph constructs the graph with
+ weighted edges. *)
Definition cells_to_doors_graph (cells : seq cell) (s t : pt) :=
let regular_doors := cells_to_doors cells in
let indexed_cells := index_seq cells in
@@ -627,20 +607,28 @@ Definition cells_to_doors_graph (cells : seq cell) (s t : pt) :=
| '(i, neighbors) <- index_seq adj_map] in
(full_seq_of_doors, neighbors_and_distances, i_s, i_t).
+(* We can now call the shortest path algorithm, where the nodes are
+ door indices. *)
Definition node := nat.
-Definition empty := @nil (node * gpath node * option R).
+Definition empty := @nil (node * seq node * option R).
-Notation priority_queue := (list (node * gpath node * option R)).
+(* The shortest graph algorithm relies on a priority queue. We implement
+ such a queue by maintaining a sorted list of nodes. *)
+Notation priority_queue := (list (node * seq node * option R)).
Definition node_eqb := Nat.eqb.
+(* To find a element in the priority queue, we just traverse the list
+ until we find one node that that the same index. *)
Fixpoint gfind (q : priority_queue) n :=
match q with
| nil => None
| (n', p, d) :: tl => if node_eqb n' n then Some (p, d) else gfind tl n
end.
+(* To remove an element, we traverse the list. Note that we only remove
+ the first instance. *)
Fixpoint remove (q : priority_queue) n :=
match q with
| nil => nil
@@ -651,6 +639,8 @@ Fixpoint remove (q : priority_queue) n :=
(n', p', d') :: remove tl n
end.
+(* To insert a new association in the priority queue, we are careful to
+ insert the node in the right place comparing the order. *)
Fixpoint insert (q : priority_queue) n p d :=
match q with
| nil => (n, p, d) :: nil
@@ -665,22 +655,31 @@ Definition update q n p d :=
insert (remove q n) n p d.
Definition pop (q : priority_queue) :
- option (node * gpath node * option R * priority_queue) :=
+ option (node * seq node * option R * priority_queue) :=
match q with
| nil => None
| v :: tl => Some (v, tl)
end.
+(* This function takes as input the sequence of cells, the source and
+ target points. It returns a tuple containing:
+ - the graph of doors,
+ this graph is a sequence of pairs, where the first component is
+ is door, and the second component is the sequence of nodes
+ - the path, when it exists,
+ - the index of the doors containing the source and targt points *)
Definition c_shortest_path cells s t :=
let '(adj, i_s, i_t) := cells_to_doors_graph cells s t in
- (adj, shortest_path node node_eqb (seq.nth [::] adj.2) i_s
- i_t _ empty
- gfind update pop (iota 0 (size adj.2)), i_s, i_t).
+ (adj, shortest_path R R0 R_ltb R_add node node_eqb
+ (seq.nth [::] adj.2) i_s i_t _ empty
+ gfind update pop (iota 0 (size adj.2)), i_s, i_t).
Definition midpoint (p1 p2 : pt) : pt :=
{| p_x := R_div (R_add (p_x p1) (p_x p2)) R2;
p_y := R_div (R_add (p_y p1) (p_y p2)) R2|}.
+(* The center of the cell is computed using the middle of the high edge
+ the middle of the low edge, and their middle. *)
Definition cell_center (c : cell) :=
midpoint
(midpoint (seq.last dummy_pt (left_pts c))
@@ -688,9 +687,16 @@ Definition cell_center (c : cell) :=
(midpoint (head dummy_pt (left_pts c))
(seq.last dummy_pt (right_pts c))).
+(* Each point used in the doors is annotated with the doors on which they
+ are and the cells they connect. The last information may be useless
+ since we have now door information. *)
Record annotated_point :=
Apt { apt_val : pt; door_index : option nat; cell_indices : seq nat}.
+(* Given two points p1 and p2 on a side of a cell, this computes a point
+ inside the cell that is a sensible intermediate point to move from p1
+ to p2 while staying safely inside the cell. *)
+
Definition safe_intermediate_point_in_cell (p1 p2 : pt) (c : cell)
(ci : nat) :=
let new_x := p_x (cell_center c) in
@@ -701,6 +707,9 @@ Definition safe_intermediate_point_in_cell (p1 p2 : pt) (c : cell)
else
Apt (cell_center c) None (ci :: nil).
+(* When two neighbor doors are aligned vertically, they have a neighboring
+ cell in common. This can be computed by looking at the intersection
+ between their lists of neighboring cells. *)
Definition intersection (s1 s2 : seq nat) :=
[seq x | x <- s1 & existsb (fun y => Nat.eqb x y) s2].
@@ -733,13 +742,6 @@ Fixpoint a_shortest_path (cells : seq cell)
p :: a_shortest_path cells doors s t a_p' tlpath
end.
-Fixpoint path_to_segments (p : annotated_point)
- (path : seq annotated_point) : seq (annotated_point * annotated_point) :=
- match path with
- | nil => nil
- | p' :: tl => (p, p') :: path_to_segments p' tl
- end.
-
Definition path_reverse (s : seq (annotated_point * annotated_point)) :=
List.map (fun p => (snd p, fst p)) (List.rev_append s nil).
@@ -759,7 +761,7 @@ Definition source_to_target
match a_shortest_path cells doors source target
last_point path with
| nil => None
- | a :: tl => Some(doors.1, path_reverse (path_to_segments a tl))
+ | a :: tl => Some(doors.1, path_reverse (seq_to_intervals_aux a tl))
end
else
None.
@@ -846,12 +848,12 @@ Fixpoint check_bezier_ccw (fuel : nat) (v : vert_edge)
match fuel with
| O => None
| S p =>
- let top_edge := Bpt (ve_x v) (ve_top v) in
- if negb (point_under_edge top_edge (Bedge a c)) then
+ let top_of_edge := Bpt (ve_x v) (ve_top v) in
+ if negb (point_under_edge top_of_edge (Bedge a c)) then
Some true
else if
- point_under_edge top_edge (Bedge a b) ||
- point_under_edge top_edge (Bedge b c)
+ point_under_edge top_of_edge (Bedge a b) ||
+ point_under_edge top_of_edge (Bedge b c)
then
Some false
else
@@ -878,12 +880,12 @@ Fixpoint check_bezier_cw (fuel : nat) (v : vert_edge)
match fuel with
| O => None
| S p =>
- let bot_edge := Bpt (ve_x v) (ve_bot v) in
- if point_strictly_under_edge bot_edge (Bedge a c) then
+ let bot_of_edge := Bpt (ve_x v) (ve_bot v) in
+ if point_strictly_under_edge bot_of_edge (Bedge a c) then
Some true
else if
- negb (point_strictly_under_edge bot_edge (Bedge a b)) ||
- negb (point_strictly_under_edge bot_edge (Bedge b c))
+ negb (point_strictly_under_edge bot_of_edge (Bedge a b)) ||
+ negb (point_strictly_under_edge bot_of_edge (Bedge b c))
then
Some false
else
@@ -977,6 +979,15 @@ Definition smooth_from_cells (cells : seq cell)
| None => nil
end.
+Definition point_to_point (bottom top : edge) (obstacles : seq edge)
+ (initial final : pt) : seq curve_element :=
+ let cells := edges_to_cells bottom top obstacles in
+ match source_to_target cells initial final with
+ | Some (doors, s) =>
+ List.map (fun '(a, b) => straight a b) s
+ | None => nil
+ end.
+
(* This function wraps up all operations:
- constructing the cells
- constructing the broken line
diff --git a/theories/shortest_path.v b/theories/shortest_path.v
index 8145e38..3f3f537 100644
--- a/theories/shortest_path.v
+++ b/theories/shortest_path.v
@@ -1,35 +1,38 @@
From mathcomp Require Import all_ssreflect all_algebra.
-Require Import ZArith (* List *) String OrderedType OrderedTypeEx FMapAVL.
-Require Import smooth_trajectories.
+Require Import ZArith String OrderedType OrderedTypeEx FMapAVL.
Notation head := seq.head.
Notation seq := seq.seq.
Notation nth := seq.nth.
Notation sort := path.sort.
+Import Order.POrderTheory Order.TotalTheory.
+
Section shortest_path.
Variable R : Type.
Variable R0 : R.
-Variable ltb : R -> R -> bool.
-Variable add : R -> R -> R.
+Variable R_ltb : R -> R -> bool.
+Variable R_add : R -> R -> R.
+
Variable cell : Type.
Variable node : Type.
Variable node_eqb : node -> node -> bool.
Variable neighbors_of_node : node -> seq (node * R).
Variable source target : node.
-Definition path := seq node.
Variable priority_queue : Type.
Variable empty : priority_queue.
-Variable find : priority_queue -> node -> option (path * option R).
-Variable update : priority_queue -> node -> path -> option R -> priority_queue.
-Variable pop : priority_queue -> option (node * path * option R * priority_queue).
+Variable gfind : priority_queue -> node -> option (seq node * option R).
+Variable update : priority_queue -> node -> seq node -> option R ->
+ priority_queue.
+Variable pop : priority_queue ->
+ option (node * seq node * option R * priority_queue).
Definition cmp_option (v v' : option R) :=
if v is Some x then
if v' is Some y then
- (ltb x y)%O
+ (R_ltb x y)%O
else
true
else
@@ -38,11 +41,11 @@ Definition cmp_option (v v' : option R) :=
Definition Dijkstra_step (d : node) (p : seq node) (dist : R)
(q : priority_queue) : priority_queue :=
let neighbors := neighbors_of_node d in
- foldr (fun '(d', dist') q =>
- match find q d' with
+ foldr (fun '(d', dist') q =>
+ match gfind q d' with
| None => q
| Some (p', o_dist) =>
- let new_dist_to_d' := Some (add dist dist')%R in
+ let new_dist_to_d' := Some (R_add dist dist') in
if cmp_option new_dist_to_d' o_dist then
update q d' (d :: p) new_dist_to_d'
else q
@@ -54,7 +57,7 @@ Fixpoint Dijkstra (fuel : nat) (q : priority_queue) :=
|S fuel' =>
match pop q with
| Some (d, p, Some dist, q') =>
- if node_eqb d target then Some p else
+ if node_eqb d target then Some p else
Dijkstra fuel' (Dijkstra_step d p dist q')
| _ => None
end
@@ -67,171 +70,79 @@ Definition shortest_path (s : seq node) :=
End shortest_path.
-Import generic_trajectories.
-Notation cell := (cell R edge).
-
-Notation v_eqb := (vert_edge_eqb R QArith_base.Qeq_bool).
-Notation cell_left_doors :=
- (cell_safe_exits_left R (QArith_base.inject_Z 1) edge).
-Notation cell_right_doors :=
- (cell_safe_exits_right R (QArith_base.inject_Z 1) edge).
-
-Notation dummy_cell := (dummy_cell R (QArith_base.inject_Z 1) edge Bedge).
-
-Definition index_seq {T : Type} (s : list T) : list (nat * T) :=
- zip (iota 0 (size s)) s.
-
-Definition cells_to_doors (s : list cell) :=
- let indexed_s := index_seq s in
- let vert_edges_and_right_cell :=
- flatten (map (fun '(i, c) =>
- (map (fun v => (v, i))) (cell_left_doors c))
- indexed_s) in
- let vert_edges_and_both_cells :=
- flatten (map (fun '(v, i) =>
- (map (fun '(i', c') => (v, i, i'))
- (filter (fun '(i', c') =>
- existsb (v_eqb v) (cell_right_doors c'))
- indexed_s)))
- vert_edges_and_right_cell) in
- vert_edges_and_both_cells.
-
-Notation on_vert_edge :=
- (on_vert_edge R QArith_base.Qeq_bool QArith_base.Qle_bool).
-
-Notation vert_edge_midpoint :=
- (vert_edge_midpoint R QArith_base.Qplus QArith_base.Qdiv (QArith_base.inject_Z 1)).
-
-Definition vert_edge_to_reference_point (s t : pt R) (v : vert_edge R) :=
- if on_vert_edge s v then s
- else if on_vert_edge t v then t
- else vert_edge_midpoint v.
-
-Definition one_door_neighbors
- (indexed_doors : seq (nat * (vert_edge R * nat * nat)))
- (i_d : nat * (vert_edge R * nat * nat)) : list nat :=
- match i_d with
- | (j, (v0, i0, i'0)) =>
- map fst
- (filter (fun '(vi, (v, i, i')) => (Nat.eqb i i0 || Nat.eqb i i'0 ||
- Nat.eqb i' i0 || Nat.eqb i' i'0) && (negb (Nat.eqb j vi)))
- indexed_doors)
- end.
-
-Notation strict_inside_closed :=
- (strict_inside_closed R QArith_base.Qeq_bool QArith_base.Qle_bool QArith_base.Qplus QArith_base.Qminus QArith_base.Qmult (QArith_base.inject_Z 1) edge left_pt
- right_pt).
-
-Definition add_extremity_reference_point
- (indexed_cells : seq (nat * cell))
- (doors : seq (vert_edge R * nat * nat)) (p : pt R) :=
- if existsb (fun '(v, _, _) => on_vert_edge p v) doors then
- [::]
- else
- let '(i, c) :=
- head (size indexed_cells, dummy_cell)
- (filter (fun '(i', c') => strict_inside_closed p c') indexed_cells) in
- [:: ({|ve_x := p_x _ p; ve_top := p_y _ p; ve_bot := p_y _ p|}, i, i)].
-
-Definition doors_and_extremities (indexed_cells : seq (nat * cell))
- (doors : seq (vert_edge R * nat * nat)) (s t : pt R) :=
- add_extremity_reference_point indexed_cells doors s ++
- add_extremity_reference_point indexed_cells doors t ++
- doors.
-
-Definition door_adjacency_map (doors : seq (vert_edge R * nat * nat)) :
- seq (seq nat) :=
- let indexed_doors := index_seq doors in
- map (fun i_d => one_door_neighbors indexed_doors i_d) indexed_doors.
-
-Notation dummy_vert_edge :=
- (dummy_vert_edge R QArith_base.Qminus (QArith_base.inject_Z 1)).
-
-Definition dummy_door := (dummy_vert_edge, 0, 0).
-
-Definition distance (doors : seq (vert_edge R * nat * nat)) (s t : pt R)
- (i j : nat) :=
- let '(v1, _, _) := nth dummy_door doors i in
- let '(v2, _, _) := nth dummy_door doors j in
- let p1 := vert_edge_to_reference_point s t v1 in
- let p2 := vert_edge_to_reference_point s t v2 in
- pt_distance p1 p2.
-
-Definition cells_to_doors_graph (cells : seq cell) (s t : pt R) :=
- let regular_doors := cells_to_doors cells in
- let indexed_cells := index_seq cells in
- let full_seq_of_doors :=
- doors_and_extremities indexed_cells regular_doors s t in
- let adj_map := door_adjacency_map full_seq_of_doors in
- let neighbors_and_distances :=
- [seq [seq (j, distance full_seq_of_doors s t i j) | j <- neighbors]
- | '(i, neighbors) <- index_seq adj_map] in
- (full_seq_of_doors, neighbors_and_distances).
-
-(* TODO : beware of the case where s and t are on the same door, they can't
- both be the reference point! *)
-
-Import generic_trajectories.
-
-Definition node := nat.
-
-Definition empty := @nil (node * path node * option R).
-
-Notation priority_queue := (list (node * path node * option R)).
-
-Definition node_eqb := Nat.eqb.
-
-Fixpoint find (q : priority_queue) n :=
- match q with
- | nil => None
- | (n', p, d) :: tl => if node_eqb n' n then Some (p, d) else find tl n
- end.
-
-Fixpoint remove (q : priority_queue) n :=
- match q with
- | nil => nil
- | (n', p', d') :: tl =>
- if node_eqb n' n then
- tl
- else
- (n', p', d') :: remove tl n
- end.
-
-Fixpoint insert (q : priority_queue) n p d :=
- match q with
- | nil => (n, p, d) :: nil
- | (n', p', d') :: tl =>
- if cmp_option R QArith_base.Qle_bool d d' then
- (n, p, d) :: q
- else
- (n', p', d') :: insert tl n p d
- end.
-
-Definition update q n p d :=
- insert (remove q n) n p d.
-
-Definition pop (q : priority_queue) :
- option (node * path node * option R * priority_queue) :=
- match q with
- | nil => None
- | v :: tl => Some (v, tl)
- end.
-
-Section example.
-
-Import QArith.
-Check Qedges_to_cells.
-Definition bottom := Bedge (Bpt _ 0 0) (Bpt _ 4 0).
-Definition top := Bedge (Bpt _ 0 4) (Bpt _ 4 4).
-Definition edges := [:: Bedge (Bpt _ 1 2) (Bpt _ 3 2)].
-Definition start := Bpt _ 1.2 3.
-Definition target := Bpt _ 1.2 1.
-Notation Bpt := (smooth_trajectories.Bpt _).
-
-Definition adj := cells_to_doors_graph (Qedges_to_cells bottom top edges)
- start target.
-Compute adj.
-Compute shortest_path R 0 Qlt_bool Qplus nat Nat.eqb
- (nth nil adj.2) 0%N 1%N _ empty find update pop (iota 0 (size adj.2)).
-
-End example.
+Section shortest_path_proofs.
+
+Variable R : realDomainType.
+
+Variable node : eqType.
+
+Variable neighbors : node -> seq (node * R).
+
+Variable queue : Type.
+Variable empty : queue.
+Variable find : queue -> node -> option (seq node * option R).
+Variable update : queue -> node -> seq node -> option R -> queue.
+Variable pop : queue -> option (node * seq node * option R * queue).
+
+Hypothesis find_empty :
+ forall n, find empty n = None.
+Hypothesis find_update_eq : forall q n p d p' d',
+ find q n = Some(p', d') -> cmp_option R <%R d d' ->
+ find (update q n p d) n = Some(p, d).
+Hypothesis find_update_None : forall q n p d,
+ find q n = None -> find (update q n p d) n = Some(p, d).
+Hypothesis find_update_diff : forall q n1 n2 p d,
+ n1 != n2 ->
+ find (update q n1 p d) n2 = find q n2.
+Hypothesis pop_remove :
+ forall q n p d q', pop q = Some (n, p, d, q') ->
+ find q' n = None.
+Hypothesis pop_find :
+ forall q n p d q', pop q = Some (n, p, d, q') ->
+ find q n = Some(p, d).
+Hypothesis pop_diff :
+ forall q n1 n2 p d q', pop q = Some(n1, p, d, q') ->
+ n1 != n2 ->
+ find q' n2 = find q n2.
+Hypothesis pop_min : forall q n1 n2 p p' d d' q',
+ pop q = Some(n1, p, d, q') ->
+ find q n2 = Some(p', d') -> cmp_option _ <%R d d'.
+Hypothesis update_discard :
+ forall q n p d p' d',
+ find q n = Some(p, d) ->
+ ~~ cmp_option _ <%R d' d ->
+ find (update q n p' d') n = find q n.
+
+Lemma oltNgt (d1 d2 : option R) : cmp_option _ <%R d1 d2 ->
+ ~~ cmp_option _ <%R d2 d1.
+Proof.
+case: d1 => [d1 | ]; case: d2 => [d2 | ] //.
+rewrite /cmp_option.
+by rewrite -leNgt le_eqVlt orbC => ->.
+Qed.
+
+Lemma update_update q n1 n2 n3 p d p' d' :
+ find (update (update q n1 p d) n2 p' d') n3 =
+ find (update (update q n2 p' d') n1 p d) n3.
+Proof.
+have [n1n3 | n1nn3] := eqVneq n1 n3.
+ rewrite -n1n3.
+ have [n1n2 | n1nn2] := eqVneq n1 n2.
+ rewrite -n1n2.
+ case n1inq : (find q n1) => [ [p1 d1] | ].
+ case cmp1 : (cmp_option _ <%R d d1).
+ case cmp2 :(cmp_option _ <%R d' d).
+ have int1 : find (update q n1 p d) n1 = Some(p, d).
+ by apply: find_update_eq n1inq cmp1.
+ rewrite (find_update_eq _ _ _ _ _ _ int1 cmp2).
+ have [cmp3 | cmp3]:= boolP(cmp_option _ <%R d' d1).
+ have int2 : find (update q n1 p' d') n1 = Some(p', d').
+ by apply: find_update_eq n1inq cmp3.
+ rewrite (update_discard _ _ _ _ _ _ int2); last by apply: oltNgt.
+ by rewrite int2.
+ have int3 : find (update q n1 p' d') n1 = Some (p1, d1).
+ by rewrite (update_discard _ _ _ _ _ _ n1inq).
+ have : ~~ cmp_option _ <%R d d1.
+Admitted.
+
+End shortest_path_proofs.
diff --git a/theories/smooth_trajectories.v b/theories/smooth_trajectories.v
index 155ef37..2aa1993 100644
--- a/theories/smooth_trajectories.v
+++ b/theories/smooth_trajectories.v
@@ -45,6 +45,10 @@ Definition euclidean_distance (p1x p1y p2x p2y : R) :=
Definition pt_distance := euclidean_distance.
+Definition Qpoint_to_point :=
+ point_to_point Q Qeq_bool Qle_bool Qplus Qminus Qmult Qdiv
+ pt_distance 1 edge Bedge left_pt right_pt.
+
Definition Qsmooth_point_to_point :=
smooth_point_to_point Q Qeq_bool Qle_bool Qplus Qminus Qmult Qdiv
pt_distance 1 edge Bedge left_pt right_pt.
diff --git a/www/Makefile.coq.local b/www/Makefile.coq.local
index 7b0ca27..86b4c69 100644
--- a/www/Makefile.coq.local
+++ b/www/Makefile.coq.local
@@ -9,7 +9,7 @@ clean::
SmoothTrajectories.ml SmoothTrajectories.mli : ../theories/smooth_trajectories.vo
- cd ../theories; echo 'Require Import QArith smooth_trajectories. Extraction "SmoothTrajectories.ml" Qsmooth_point_to_point Qedges_to_cells Qreduction.Qred.' | coqtop -R . trajectories
+ cd ../theories; echo 'Require Import QArith smooth_trajectories. Extraction "SmoothTrajectories.ml" Qsmooth_point_to_point Qpoint_to_point Qedges_to_cells Qreduction.Qred.' | coqtop -R . trajectories
cp ../theories/SmoothTrajectories.ml ../theories/SmoothTrajectories.mli .
SmoothTrajectories.cmi : SmoothTrajectories.mli
From acac84a4d65af7632f6011d9497d9f5fd26c86aa Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Tue, 30 Apr 2024 16:37:39 +0200
Subject: [PATCH 27/43] rename Qpoint_to_point into Qstraight_point_to_point
---
theories/smooth_trajectories.v | 2 +-
www/Makefile.coq.local | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/theories/smooth_trajectories.v b/theories/smooth_trajectories.v
index 2aa1993..8eb2669 100644
--- a/theories/smooth_trajectories.v
+++ b/theories/smooth_trajectories.v
@@ -45,7 +45,7 @@ Definition euclidean_distance (p1x p1y p2x p2y : R) :=
Definition pt_distance := euclidean_distance.
-Definition Qpoint_to_point :=
+Definition Qstraight_point_to_point :=
point_to_point Q Qeq_bool Qle_bool Qplus Qminus Qmult Qdiv
pt_distance 1 edge Bedge left_pt right_pt.
diff --git a/www/Makefile.coq.local b/www/Makefile.coq.local
index 86b4c69..3465d69 100644
--- a/www/Makefile.coq.local
+++ b/www/Makefile.coq.local
@@ -9,7 +9,7 @@ clean::
SmoothTrajectories.ml SmoothTrajectories.mli : ../theories/smooth_trajectories.vo
- cd ../theories; echo 'Require Import QArith smooth_trajectories. Extraction "SmoothTrajectories.ml" Qsmooth_point_to_point Qpoint_to_point Qedges_to_cells Qreduction.Qred.' | coqtop -R . trajectories
+ cd ../theories; echo 'Require Import QArith smooth_trajectories. Extraction "SmoothTrajectories.ml" Qsmooth_point_to_point Qstraight_point_to_point Qedges_to_cells Qreduction.Qred.' | coqtop -R . trajectories
cp ../theories/SmoothTrajectories.ml ../theories/SmoothTrajectories.mli .
SmoothTrajectories.cmi : SmoothTrajectories.mli
From d73e8abf2dd26c869a1f39a5795cfd9b9b95cf16 Mon Sep 17 00:00:00 2001
From: thery
Date: Wed, 1 May 2024 07:18:45 +0200
Subject: [PATCH 28/43] Adding straight line
---
www/grid.html | 2 +
www/grid.js | 121 ++++++++++++++++++++++++++++++++++++-
www/jSmoothTrajectories.ml | 15 +++--
3 files changed, 130 insertions(+), 8 deletions(-)
diff --git a/www/grid.html b/www/grid.html
index 8452fd9..d2d69b3 100755
--- a/www/grid.html
+++ b/www/grid.html
@@ -28,6 +28,8 @@
+
+
diff --git a/www/grid.js b/www/grid.js
index 0b353fe..291fa68 100644
--- a/www/grid.js
+++ b/www/grid.js
@@ -256,6 +256,10 @@ function cleanCurve () {
}
function getCurve() {
+ console.log("getCurve\n");
+ if (positions == null) {
+ return;
+ }
let val = "";
val += outVal(positions.fX) + outVal(positions.fZ) +
outVal(positions.tX) + outVal(positions.tZ);
@@ -332,6 +336,105 @@ function getCurve() {
}
}
+/* The straight */
+
+var straightFlag = true;
+
+const straightButtons =
+ document.querySelectorAll('input[name="Show Straight"]');
+
+for (const straightButton of straightButtons) {
+ straightButton.addEventListener("click", setStraight, false);
+}
+
+function setStraight() {
+ straightFlag = straightButtons[0].checked;
+ cleanStraight();
+ cleanCurve();
+ if (straightFlag) {
+ getStraight();
+ } else {
+ getCurve();
+ }
+ renderer.render( scene, camera );
+}
+
+
+var straights = [];
+const smaterial = new THREE.LineBasicMaterial( { color: 'orange' } );
+setStraight();
+
+
+function cleanStraight () {
+ let i = 0;
+ console.log("straights " + straights);
+ while (i < straights.length)
+ for (const straight of straights) {
+ scene.remove(straight);
+ i++;
+ }
+ renderer.render( scene, camera );
+ straights = [];
+}
+
+function getStraight() {
+ console.log("getStraight\n");
+ if (positions == null) {
+ return;
+ }
+ let val = "";
+ val += outVal(positions.fX) + outVal(positions.fZ) +
+ outVal(positions.tX) + outVal(positions.tZ);
+ if (borders.length != 2) {
+ return;
+ }
+ if (borders[0].fZ <= borders[1].fZ) {
+ val += outVal(borders[0].fX) + outVal(borders[0].fZ) +
+ outVal(borders[0].tX) + outVal(borders[0].tZ);
+ val += outVal(borders[1].fX) + outVal(borders[1].fZ) +
+ outVal(borders[1].tX) + outVal(borders[1].tZ);
+ } else {
+ val += outVal(borders[1].fX) + outVal(borders[1].fZ) +
+ outVal(borders[1].tX) + outVal(borders[1].tZ);
+ val += outVal(borders[0].fX) + outVal(borders[0].fZ) +
+ outVal(borders[0].tX) + outVal(borders[0].tZ);
+ }
+ for (const obstacle of obstacles) {
+ val += outVal(obstacle.fX) + outVal(obstacle.fZ)
+ + outVal(obstacle.tX) + outVal(obstacle.tZ);
+ }
+ console.log("boarders " + borders.length + " obstacles " + obstacles.length);
+ console.log("val " + val);
+ let res = ocamlLib.straight(val);
+ console.log("res " + res);
+ let res1 = res.split(' ').map(Number);
+ let i = 0;
+ while (i < res1.length) {
+ if (res1[i] == 1) {
+ /* Straight line */
+ let fx = res1[i + 2] / res1 [i + 3] * gSize - 0.5 - gSize/2;
+ let fy = 0.3;
+ let fz = res1[i + 4] / res1 [i + 5] * gSize - 0.5 - gSize/2;
+ let tx = res1[i + 6] / res1 [i + 7] * gSize - 0.5 - gSize/2;
+ let ty = 0.3;
+ let tz = res1[i + 8] / res1 [i + 9] * gSize - 0.5 - gSize/2;
+ console.log("Adding a line" + fx + " " + fz + " " + tx + " " + tz);
+ let epoints = [];
+ epoints.push( new THREE.Vector3(fx, fy, fz) );
+ epoints.push( new THREE.Vector3(tx, ty, tz));
+ let egeometry = new THREE.BufferGeometry().setFromPoints( epoints );
+ let sline = new THREE.Line( egeometry, smaterial );
+ straights.push(sline);
+ scene.add( sline );
+ renderer.render( scene, camera );
+ i += 10;
+ } else if (res1[i] == 2) {
+ i += 14;
+ } else {
+ i++;
+ }
+ }
+}
/* The modality */
@@ -346,6 +449,7 @@ for (const radioButton of radioButtons) {
function setModality() {
cleanCurve();
+ cleanStraight();
fromValid = false;
toValid = false;
fromCube.position.y = -0.2;
@@ -400,6 +504,7 @@ function onDocumentMouseDown( event ) {
fromCube.position.y = -0.2;
toCube.position.y = -0.2;
cleanCurve();
+ cleanStraight();
renderer.render( scene, camera );
}
if (fromValid) {
@@ -419,6 +524,7 @@ function onDocumentMouseDown( event ) {
return;
}
cleanCurve();
+ cleanStraight();
addObstacle(fromX, fromZ, toX, toZ);
}
if (modality == "positions") {
@@ -430,7 +536,12 @@ function onDocumentMouseDown( event ) {
renderer.render( scene, camera );
positions = {fX : fromX, fZ : fromZ, tX : toX, tZ : toZ }
cleanCurve();
- getCurve();
+ cleanStraight();
+ if (straightFlag) {
+ getStraight();
+ } else {
+ getCurve();
+ }
}
} else {
fromValid = true;
@@ -441,6 +552,7 @@ function onDocumentMouseDown( event ) {
fromCube.position.x = fromX;
toCube.position.y = -0.2;
cleanCurve();
+ cleanStraight();
renderer.render( scene, camera );
}
}
@@ -504,7 +616,12 @@ document.getElementById('loadButton').addEventListener('click', function() {
renderer.render( scene, camera );
positions = {fX : fX, fZ : fZ, tX : tX, tZ : tZ }
cleanCurve();
- getCurve();
+ cleanStraight();
+ if (straightFlag) {
+ getStraight();
+ } else {
+ getCurve();
+ }
renderer.render( scene, camera );
}
};
diff --git a/www/jSmoothTrajectories.ml b/www/jSmoothTrajectories.ml
index 67f8520..f06aeb1 100644
--- a/www/jSmoothTrajectories.ml
+++ b/www/jSmoothTrajectories.ml
@@ -91,7 +91,7 @@ let call_smooth s =
l2stringr (curve_elements2n v)
-let call_smooth1 s =
+let call_straight s =
let l = string2ln s in
match l with
| p1n1 :: p1d1 :: p1n2 :: p1d2 :: p2n1 :: p2d1 :: p2n2 ::p2d2 ::
@@ -99,11 +99,13 @@ let call_smooth1 s =
e2n1 :: e2d1 :: e2n2 :: e2d2 :: e2n3 :: e2d3 :: e2n4 :: e2d4 ::
ls ->
let es = list2es ls in
- ((n2edge e1n1 e1d1 e1n2 e1d2 e1n3 e1d3 e1n4 e1d4),
- (n2edge e2n1 e2d1 e2n2 e2d2 e2n3 e2d3 e2n4 e2d4),
- es ,
- (n2pt p1n1 p1d1 p1n2 p1d2),
- (n2pt p2n1 p2d1 p2n2 p2d2))
+ let v = qstraight_point_to_point (n2edge e1n1 e1d1 e1n2 e1d2 e1n3 e1d3 e1n4 e1d4)
+ (n2edge e2n1 e2d1 e2n2 e2d2 e2n3 e2d3 e2n4 e2d4)
+ es
+ (n2pt p1n1 p1d1 p1n2 p1d2)
+ (n2pt p2n1 p2d1 p2n2 p2d2) in
+ l2stringr (curve_elements2n v)
+
let rec cells_element2n ce =
match ce with
@@ -132,6 +134,7 @@ let call_cells s =
let _ =
Js.export "ocamlLib"
(object%js
+ method straight s = Js.string (call_smooth (Js.to_string s))
method smooth s = Js.string (call_smooth (Js.to_string s))
method cells s = Js.string (call_cells (Js.to_string s))
end)
From 0c98981bd4845e4ae7c0eb58e77a53e1384393fa Mon Sep 17 00:00:00 2001
From: thery
Date: Wed, 1 May 2024 07:34:21 +0200
Subject: [PATCH 29/43] fix refresh position
---
www/grid.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/www/grid.js b/www/grid.js
index 291fa68..f310688 100644
--- a/www/grid.js
+++ b/www/grid.js
@@ -257,7 +257,7 @@ function cleanCurve () {
function getCurve() {
console.log("getCurve\n");
- if (positions == null) {
+ if ((fromValid == false) || (toValid == false)) {
return;
}
let val = "";
@@ -379,7 +379,7 @@ function cleanStraight () {
function getStraight() {
console.log("getStraight\n");
- if (positions == null) {
+ if ((fromValid == false) || (toValid == false)) {
return;
}
let val = "";
From ade48048a5d075d46e132d2a3e5ab99fbe669604 Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Wed, 1 May 2024 08:00:11 +0200
Subject: [PATCH 30/43] use call_straight at the right place
---
www/jSmoothTrajectories.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/www/jSmoothTrajectories.ml b/www/jSmoothTrajectories.ml
index f06aeb1..cd552f3 100644
--- a/www/jSmoothTrajectories.ml
+++ b/www/jSmoothTrajectories.ml
@@ -134,7 +134,7 @@ let call_cells s =
let _ =
Js.export "ocamlLib"
(object%js
- method straight s = Js.string (call_smooth (Js.to_string s))
+ method straight s = Js.string (call_straight (Js.to_string s))
method smooth s = Js.string (call_smooth (Js.to_string s))
method cells s = Js.string (call_cells (Js.to_string s))
end)
From 34a33604f347de7e3c32bb8649b8d7d693f0abec Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Fri, 3 May 2024 09:53:59 +0200
Subject: [PATCH 31/43] straight line trajectories in blue
---
www/grid.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/www/grid.js b/www/grid.js
index f310688..0762b6d 100644
--- a/www/grid.js
+++ b/www/grid.js
@@ -361,7 +361,7 @@ function setStraight() {
var straights = [];
-const smaterial = new THREE.LineBasicMaterial( { color: 'orange' } );
+const smaterial = new THREE.LineBasicMaterial( { color: 'blue' } );
setStraight();
From 5f34171453beb85fd90cff4adf4c1bb809bf87fb Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Fri, 3 May 2024 21:06:30 +0200
Subject: [PATCH 32/43] add some form of improvement for straight trajectories
---
theories/generic_trajectories.v | 107 ++++++++++++++++++++++++++++----
theories/smooth_trajectories.v | 3 +
2 files changed, 99 insertions(+), 11 deletions(-)
diff --git a/theories/generic_trajectories.v b/theories/generic_trajectories.v
index ab59cc9..f59366e 100644
--- a/theories/generic_trajectories.v
+++ b/theories/generic_trajectories.v
@@ -32,8 +32,6 @@ Notation sort := path.sort.
Notation seq := list.
-Module natmap := FMapAVL.Make Nat_as_OT.
-
Section generic_implementation.
(* In the original development R has type numFieldType and the various
@@ -53,6 +51,8 @@ Notation "x - y" := (R_sub x y).
Notation "x + y" := (R_add x y).
+Notation "x / y" := (R_div x y).
+
Variable pt_distance : R -> R -> R -> R -> R.
Variable R1 : R.
@@ -693,19 +693,32 @@ Definition cell_center (c : cell) :=
Record annotated_point :=
Apt { apt_val : pt; door_index : option nat; cell_indices : seq nat}.
+(* This value (1/16) of margin is suitable for the demo environment. In real
+ life, this should be a parameter of the algorithm. *)
+Definition margin := R1 / ((R1 + R1) *
+ (R1 + R1) * (R1 + R1) * (R1 + R1) * (R1 * R1)).
+
+
(* Given two points p1 and p2 on a side of a cell, this computes a point
inside the cell that is a sensible intermediate point to move from p1
to p2 while staying safely inside the cell. *)
-
Definition safe_intermediate_point_in_cell (p1 p2 : pt) (c : cell)
(ci : nat) :=
let new_x := p_x (cell_center c) in
let new_y := R_div (R_add (p_y p1) (p_y p2)) R2 in
- let new_pt := {|p_x := new_x; p_y := new_y|} in
- if strict_inside_closed new_pt c then
- Apt new_pt None (ci :: nil)
- else
- Apt (cell_center c) None (ci :: nil).
+ if R_ltb new_x (p_x p1) then
+ let new_pt := {|p_x := p_x p1 - margin; p_y := new_y|} in
+ if strict_inside_closed new_pt c then
+ Apt new_pt None (ci :: nil)
+ else
+ Apt (cell_center c) None (ci :: nil)
+ else
+ let new_pt := {|p_x := p_x p1 + margin; p_y := new_y|} in
+ if strict_inside_closed new_pt c then
+ Apt new_pt None (ci :: nil)
+ else
+ Apt (cell_center c) None (ci :: nil).
+
(* When two neighbor doors are aligned vertically, they have a neighboring
cell in common. This can be computed by looking at the intersection
@@ -745,6 +758,72 @@ Fixpoint a_shortest_path (cells : seq cell)
Definition path_reverse (s : seq (annotated_point * annotated_point)) :=
List.map (fun p => (snd p, fst p)) (List.rev_append s nil).
+Definition intersect_vert_edge (p1 p2 : pt) (ve : vert_edge) : pt :=
+ Bpt (ve_x ve)
+ (p_y p1 + (ve_x ve - p_x p1) / (p_x p2 - p_x p1) * (p_y p2 - p_y p1)).
+
+Definition optim_three (doors : seq door) (p1 p2 p3 : annotated_point) :=
+ let p1' := apt_val p1 in
+ let p3' := apt_val p3 in
+ if p2 is Apt p2' (Some d_i) cells then
+ let d := (seq.nth dummy_door doors d_i).1.1 in
+ if R_ltb (p_x p1') (ve_x d) && R_ltb (ve_x d) (p_x p3') then
+ if R_ltb R0 (area3 p1' p2' p3') then
+ if R_ltb R0 (area3 p1' p3' (Bpt (ve_x d) (ve_top d))) then
+ let p2_2 := intersect_vert_edge p1' p3' d in
+ Apt p2_2 (Some d_i) cells
+ else
+ if R_ltb (ve_bot d) (ve_top d - margin) then
+ Apt (Bpt (ve_x d) (ve_top d - margin)) (Some d_i) cells
+ else
+ p2
+ else
+ if R_ltb (area3 p1' p3' (Bpt (ve_x d) (ve_bot d))) R0 then
+ let p2_2 := intersect_vert_edge p1' p3' d in
+ Apt p2_2 (Some d_i) cells
+ else
+ if R_ltb (ve_bot d + margin) (ve_top d) then
+ Apt (Bpt (ve_x d) (ve_bot d + margin)) (Some d_i) cells
+ else
+ p2
+ else if R_ltb (p_x p3') (ve_x d) && R_ltb (ve_x d) (p_x p1') then
+ if R_ltb R0 (area3 p1' p2' p3') then
+ if R_ltb R0 (area3 p1' p3' (Bpt (ve_x d) (ve_bot d))) then
+ let p2_2 := intersect_vert_edge p1' p3' d in
+ Apt p2_2 (Some d_i) cells
+ else
+ if R_ltb (ve_bot d + margin) (ve_top d) then
+ Apt (Bpt (ve_x d) (ve_bot d + margin)) (Some d_i) cells
+ else
+ p2
+ else
+ if R_ltb (area3 p1' p3' (Bpt (ve_x d) (ve_top d))) R0 then
+ let p2_2 := intersect_vert_edge p1' p3' d in
+ Apt p2_2 (Some d_i) cells
+ else
+ if R_ltb (ve_bot d) (ve_top d - margin) then
+ Apt (Bpt (ve_x d) (ve_top d - margin)) (Some d_i) cells
+ else
+ p2
+ else
+ p2
+ else
+ p2.
+
+Fixpoint local_improvements (doors : seq door)
+ (p : seq (annotated_point * annotated_point)) :
+ seq (annotated_point * annotated_point) :=
+match p with
+| (p1, p2) :: ((_ , p3) :: _) as tl =>
+ match local_improvements doors tl with
+ | [::] => p
+ | (_, p3') :: tl' =>
+ let p2' := optim_three doors p1 p2 p3' in
+ (p1, p2') :: (p2', p3') :: tl'
+ end
+| _ => p
+end.
+
Definition source_to_target
(cells : seq cell) (source target : pt) :
option (seq door *
@@ -761,7 +840,10 @@ Definition source_to_target
match a_shortest_path cells doors source target
last_point path with
| nil => None
- | a :: tl => Some(doors.1, path_reverse (seq_to_intervals_aux a tl))
+ | a :: tl =>
+ Some(doors.1,
+ local_improvements doors.1
+ (path_reverse (seq_to_intervals_aux a tl)))
end
else
None.
@@ -973,12 +1055,15 @@ end.
Definition smooth_from_cells (cells : seq cell)
(initial final : pt) : seq curve_element :=
match source_to_target cells initial final with
- | Some (doors, s) => List.concat
- (List.map (check_curve_element_and_repair fuel_constant doors)
+ | Some (doors, s) =>
+ List.concat
+ (List.map (check_curve_element_and_repair fuel_constant doors)
(smoothen (break_segments s)))
| None => nil
end.
+(* This function only computes the piecewise straight line trajectory,
+ starting from the sequence of edges and the source and target. *)
Definition point_to_point (bottom top : edge) (obstacles : seq edge)
(initial final : pt) : seq curve_element :=
let cells := edges_to_cells bottom top obstacles in
diff --git a/theories/smooth_trajectories.v b/theories/smooth_trajectories.v
index 8eb2669..50df61f 100644
--- a/theories/smooth_trajectories.v
+++ b/theories/smooth_trajectories.v
@@ -49,6 +49,9 @@ Definition Qstraight_point_to_point :=
point_to_point Q Qeq_bool Qle_bool Qplus Qminus Qmult Qdiv
pt_distance 1 edge Bedge left_pt right_pt.
+Definition Qoptim_three := optim_three Q Qeq_bool Qle_bool Qplus Qminus
+ Qmult Qdiv 1.
+
Definition Qsmooth_point_to_point :=
smooth_point_to_point Q Qeq_bool Qle_bool Qplus Qminus Qmult Qdiv
pt_distance 1 edge Bedge left_pt right_pt.
From 02deb906614859bf7087940b0013a9a7019afd88 Mon Sep 17 00:00:00 2001
From: Yves Bertot
Date: Mon, 20 May 2024 10:59:54 +0200
Subject: [PATCH 33/43] adds slides for the Festschrift
---
documents/FHG_slides.tex | 192 +++++++++++++++++++++++++++++++++++++++
documents/Makefile | 5 +-
documents/collision.ps | Bin 292 -> 378 bytes
documents/collision2.ps | Bin 324 -> 589 bytes
4 files changed, 196 insertions(+), 1 deletion(-)
create mode 100644 documents/FHG_slides.tex
diff --git a/documents/FHG_slides.tex b/documents/FHG_slides.tex
new file mode 100644
index 0000000..c345de6
--- /dev/null
+++ b/documents/FHG_slides.tex
@@ -0,0 +1,192 @@
+\documentclass[compress]{beamer}
+\usepackage[latin1]{inputenc}
+\usepackage{alltt}
+\newdimen\topcrop
+\topcrop=10cm %alternatively 8cm if the pdf inclusions are in letter format
+\newdimen\topcropBezier
+\topcropBezier=19cm %alternatively 16cm if the inclusions are in letter format
+
+\setbeamertemplate{footline}[frame number]
+\title{Smooth trajectories in straight line mazes}
+\author{Yves Bertot\\
+Joint work with Thomas Portet, Quentin Vermande}
+\date{April 2023}
+\mode
+\begin{document}
+
+\maketitle
+\begin{frame}
+\frametitle{The game}
+\begin{itemize}
+\item Apply Type Theory-based verification to a problem understood by a
+ wide audience
+\item Find a smooth path in a maze
+\item Decompose the problem
+\begin{itemize}
+\item Find a discrete approximation of the problem
+\item Construct a piece-wise linear path
+\item smoothen the angles
+\end{itemize}
+\item Prove the correctness of the algorithm
+\begin{itemize}
+\item Safety: absence of collision
+\item work in progress
+\end{itemize}
+\end{itemize}
+\end{frame}
+\begin{frame}
+\frametitle{Example}
+\includegraphics[trim={0 0 0 \topcrop}, clip, width=\textwidth]{empty_spiral.pdf}
+\end{frame}
+\begin{frame}
+\frametitle{Cell decomposition}
+\begin{itemize}
+\item Decompose the space into simple cells
+\item Each cell is convex
+\item Each cell is free of obstacles
+\item Each cell may have neighbours where moving is safe
+\end{itemize}
+\end{frame}
+\begin{frame}
+\frametitle{Vertical cell decomposition example}
+\includegraphics[trim={0 0 0 \topcrop}, clip, width=\textwidth]{cells_spiral.pdf}
+\end{frame}
+\begin{frame}
+\frametitle{Cell assumptions}
+\begin{itemize}
+\item Vertical edges are safe passages between two cells
+\item Moving directly from a left-edge to a right-edge is safe
+\begin{itemize}
+\item and vice-versa
+\end{itemize}
+\item Moving from a left-edge to the cell center is safe
+\begin{itemize}
+\item similarly for a right-edge
+\item moving from left-edge to left-edge is safe by going through the
+ cell center
+\end{itemize}
+\end{itemize}
+\end{frame}
+\begin{frame}
+\frametitle{Finding a path in the cell graph}
+\begin{itemize}
+\item A discrete path from cell to cell is found by breadth-first search
+\item Connected components of the graph are defined by polygons
+\item Special care for points that are already on the common edge of two cells
+\item Recent improvement: take distances into account
+\begin{itemize}
+\item Use a graph of doors instead of cells
+\item Easier to associate a distance between pairs of doors
+\item Dijkstra shortest path algorithm
+\end{itemize}
+\end{itemize}
+\end{frame}
+\begin{frame}
+\frametitle{Two examples of elementary safe paths}
+\includegraphics[trim={0 0 0 \topcrop}, clip, width=\textwidth]{spiral_safe2.pdf}
+\end{frame}
+\begin{frame}
+\frametitle{piecewise linear path}
+\label{broken-line}
+\includegraphics[trim={0 0 0 \topcrop}, clip, width=\textwidth]{spiral_bline.pdf}
+\end{frame}
+\begin{frame}
+\frametitle{Making corners smooth}
+\begin{itemize}
+\item Using quadratic Bezier curves
+\item Bezier curves are given by a set of control points
+ (3 for a quadratic curve)
+\item Points on the curves are obtained by computing weighted barycenters
+\begin{itemize}
+\item The curve is enclosed in the convex hull of the control points
+\end{itemize}
+\item Given control points \(a_0, a_1, \ldots, a_{n-1}, a_n\), \(a_0, a_1\)
+is tangent to the curve in \(a_0\)
+\begin{itemize}
+\item same for \(a_{n-1}, a_n\) in \(a_n\)
+\end{itemize}
+\end{itemize}
+\end{frame}
+\begin{frame}
+\frametitle{Bezier curve illustration}
+\begin{itemize}
+\item How the point for ratio \(4/9\) is computed
+\item Control points for the two subcurves are given by the new point,
+the initial starting and end points, and the solid green straight edge tip
+\end{itemize}
+\includegraphics[trim={0 6cm 0 \topcropBezier}, clip, width=\textwidth]{bezier_example2.pdf}
+\end{frame}
+\begin{frame}
+\frametitle{Using Bezier curves for smoothing}
+\begin{itemize}
+\item Add extra points in the middle of each straight line segment
+\item Uses these extra points as first and last control points for Bezier curves
+\item Use the angle point as the middle control point
+\item Check the Bezier curve for collision and repair if need be
+\end{itemize}
+\end{frame}
+\begin{frame}
+\frametitle{Collision checking, graphically}
+\includegraphics[trim={0 4cm 0 17cm}, clip, width=\textwidth]{collision.pdf}
+\end{frame}
+\begin{frame}
+\frametitle{Not passing in the top door}
+\includegraphics[trim={0 4cm 0 17cm}, clip, width=\textwidth]{collision2.pdf}
+\end{frame}
+\begin{frame}
+\frametitle{Final trajectories}
+\label{final-spiral}
+\includegraphics[trim={0 0 0 \topcrop}, clip, width=\textwidth]{smooth_spiral2.pdf}
+\end{frame}
+\begin{frame}
+\frametitle{Proof tools}
+\begin{itemize}
+\item Convex hulls (Pichardie \& B. 2001)
+\begin{itemize}
+\item Orientation predicate
+\item point below or above edge
+\end{itemize}
+\item Linear arithmetic
+\begin{itemize}
+\item Algorithms only use rational numbers
+\item Bezier curve intersections rely on algebraic numbers
+\end{itemize}
+\item Convex spaces and Bezier Curve
+\begin{itemize}
+\item Internship by Q. Vermande
+\item Using {\tt infotheo}, especially convex and conical spaces
+ (Affeldt \& Garrigue \& Saikawa 2020)
+\end{itemize}
+\end{itemize}
+\end{frame}
+\begin{frame}
+\frametitle{Vertical cell decomposition proofs}
+\begin{itemize}
+\item Use of semi-closed vertical cells
+\item Show disjoint property
+\item Show that obstacles are covered by cell tops
+\item This proof is complete
+\end{itemize}
+\end{frame}
+\begin{frame}
+\frametitle{Future work}
+\begin{itemize}
+\item Intend to prove only safety
+\item Produce concrete code from abstract models
+\begin{itemize}
+\item Move from exact computation to approximations
+\item Efficient implementation of graphs
+\end{itemize}
+\item Already usable in \textcolor{blue}{\href{https://stamp.gitlabpages.inria.fr/trajectories.html}{web-base demonstration}.}
+\begin{itemize}
+\item Extracted code to Ocaml, then compile to JavaScript
+\end{itemize}
+\end{itemize}
+\end{frame}
+\end{document}
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
diff --git a/documents/Makefile b/documents/Makefile
index 3038b9a..60dd236 100644
--- a/documents/Makefile
+++ b/documents/Makefile
@@ -1,4 +1,4 @@
-all : intro_slides.pdf FHG_paper.pdf
+all : intro_slides.pdf FHG_paper.pdf FHG_slides.pdf
PSFILES=bezier_example.ps bezier_example2.ps cells_spiral.ps \
collision.ps collision2.ps empty_spiral.ps polygon.ps repair2.ps \
@@ -16,5 +16,8 @@ FHG_paper.pdf : FHG_paper.tex FHG_paper.bib $(PDFFILES) illustration.png
pdflatex FHG_paper.tex; bibtex FHG_paper; pdflatex FHG_paper.tex \
FHG_paper.tex
+FHG_slides.pdf : FHG_slides.tex $(PDFFILES)
+ PDFLATEX FHG_slides.tex; pdflatex FHG_slides.tex
+
$(PDFFILES): %.pdf: %.ps
ps2pdf -sPAPERSIZE=a4 $<
diff --git a/documents/collision.ps b/documents/collision.ps
index 03beb133f1b0e0ae17bdacd61347cfc4a547dfe2..ff64f80bc4e2255c1d4d67143ce62439768f26d5 100644
GIT binary patch
delta 143
zcmWm7F$%&k6o6sOW;aJEfwu(Lwg!ie-XuvMwGi{*CGFrH1m7JTy@}WG6i(Lh=NtZ~
z`l`oiYk+(%E<~}1qX8dhgg7P4Jp@XHDMH5aimBwPfd<+&3y(ffB(AznNN=p%_0GT<
pZxb?vnHQ|Am6uklzw6q-K*T*P$YlyH!r<}+hyO=DMzyWT{s(ETFZBQb
delta 112
zcmeyxw1jDb*+fTG5d#GS1w)16)RLm~q~!dZ{30$x%ZW2(S&e|g29pyRC9O=rOaq17
z{Ib-Nd@f@X0|g@xHaAc(HZWH(w1lveON+qr#U(}g*{NLV#ffE;tr%4&h6qhO%?SYb
CDj)~|
diff --git a/documents/collision2.ps b/documents/collision2.ps
index ddf615fdb6e8f51ff6cce2de7edea2da02ac2c9c..9ddbf9f362d5cbebeadca02d0e61cb401261b460 100644
GIT binary patch
literal 589
zcmZ{h%~FIg49D+%ig?(g+VZiCJcXm)91jHw%UH-v)8+Y1x(f<39+;3O`Q@MF^zizw
zoFVc7}eOyB_DLOa|0i?~+3Hv--L^csB&>D4St-(
zr5NyA3L1ZP>5*z^86VICxnXj1B&9)vVK;`MY0+a)S$4zxq2^|z76s>XqkWShIEomg
z+r|1G=sE%RASgR`Aj)dU&iWWvx@f2&uZ}p8DRI%qI9)2v
z5xc5AjJBss>m-J2m~P6WSe7Mm;W53ao|tdS+uz#ZpY_~N*C7V3U0jGG-xoSd7uTg)
c^?8Qk3vxMyJf~~s<+cf#-Ta>6e%x*EKVjpmbpQYW
delta 139
zcmX@ha)fDu*+eH*5d#GS1w)16)RLm~q~!dZ{30$x%ZamO8I30Hkc~1jF;y_KG*HOR
zFH0@S=Q1`kP%ttuRmjQA191(3GDhYISpy?IpmGy)APH4rVgxkYzyQWAE-A{-PUT83
RPAr?u%cMFnRA}NEP5?OwDJK8`
From f2f42a15661add81933a387fcfdd4c1056ec9c14 Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Tue, 21 May 2024 07:55:09 +0200
Subject: [PATCH 34/43] silence
---
_CoqProject | 2 --
1 file changed, 2 deletions(-)
diff --git a/_CoqProject b/_CoqProject
index 73b65ce..517d550 100644
--- a/_CoqProject
+++ b/_CoqProject
@@ -28,13 +28,11 @@ theories/cells_alg.v
theories/door_crossing.v
theories/events.v
theories/extraction_command.v
-theories/generic_trajectories.v
theories/math_comp_complements.v
theories/no_crossing.v
theories/opening_cells.v
theories/points_and_edges.v
theories/safe_cells.v
-theories/smooth_trajectories.v
-R theories trajectories
From 060bc02133cc6b6c923eaf7a02f3aab55af4549d Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Tue, 21 May 2024 08:02:13 +0200
Subject: [PATCH 35/43] changed the order in which the points are are stored in
right_pts, The proofs go through, but the algorithm is broken, because
updating right_pts in the case of vertically aligned events is now wrong.
---
theories/cells.v | 9 ++---
theories/cells_alg.v | 18 +++++-----
theories/generic_trajectories.v | 4 +--
theories/safe_cells.v | 61 +++++++++++++++++++--------------
4 files changed, 51 insertions(+), 41 deletions(-)
diff --git a/theories/cells.v b/theories/cells.v
index 5cd8421..47d1bdd 100644
--- a/theories/cells.v
+++ b/theories/cells.v
@@ -180,12 +180,13 @@ Lemma no_dup_seq_aux_eq {A : eqType} (s : seq A) :
no_dup_seq s = no_dup_seq_aux eq_op s.
Proof. by elim: s => [ | a s /= ->]. Qed.
+(* TODO : remove duplication with generic_trajectories *)
Definition close_cell (p : pt) (c : cell) :=
match vertical_intersection_point p (low c),
vertical_intersection_point p (high c) with
| None, _ | _, None => c
| Some p1, Some p2 =>
- Bcell (left_pts c) (no_dup_seq [:: p1; p; p2]) (low c) (high c)
+ Bcell (left_pts c) (no_dup_seq [:: p2; p; p1]) (low c) (high c)
end.
Definition closing_cells (p : pt) (contact_cells: seq cell) : seq cell :=
@@ -947,9 +948,9 @@ Definition closed_cell_side_limit_ok c :=
last dummy_pt (left_pts c) === low c,
right_pts c != [::] :> seq pt,
all (fun p : pt => p_x p == right_limit c) (right_pts c),
- sorted <%R [seq p_y p | p <- right_pts c],
- head dummy_pt (right_pts c) === low c &
- last dummy_pt (right_pts c) === high c].
+ sorted >%R [seq p_y p | p <- right_pts c],
+ head dummy_pt (right_pts c) === high c &
+ last dummy_pt (right_pts c) === low c].
Lemma closed_right_imp_open c:
closed_cell_side_limit_ok c -> right_limit c <= open_limit c.
diff --git a/theories/cells_alg.v b/theories/cells_alg.v
index ed9680c..96f918f 100644
--- a/theories/cells_alg.v
+++ b/theories/cells_alg.v
@@ -760,18 +760,18 @@ rewrite -?(eq_sym (point e)).
failed at porting time. *)
case:ifP (o1) (o2) =>[/eqP q1 |enp1];case:ifP=>[/eqP q2 |enp2];
rewrite ?q1 ?q2;
- rewrite -?q1 -?q2 /= ?eqxx ?x2 ?x1 /= => -> -> //; rewrite /= ?andbT.
-- move: x1 x2 ctp=> /eqP/esym x1 /eqP x2 /andP[] _ eh.
- have := (under_edge_strict_lower_y x2 (negbT enp2) eh o2).
- by rewrite q1=> ->//; rewrite andbT.
+ rewrite -?q1 -?q2 /= ?eqxx ?x2 ?x1 /= => -> -> //=; rewrite ?andbT.
- move: x1 x2 ctp=> /eqP/esym x1 /eqP x2 /andP[] el _.
- have := (above_edge_strict_higher_y x1 _ el).
- by apply => //; exact: negbT.
+ have := (above_edge_strict_higher_y x1 (negbT enp2) el).
+ by rewrite /right_limit /= x1 eqxx /=; apply.
+- move: x1 x2 ctp=> /eqP/esym x1 /eqP x2 /andP[] _ eh.
+ have := (under_edge_strict_lower_y x2 (negbT enp1) eh o2).
+ rewrite /right_limit /= x2 eqxx /=; apply.
move: x1 x2 ctp=> /eqP/esym x1 /eqP x2 /andP[] el eh.
rewrite (above_edge_strict_higher_y x1 _ el) //; last first.
exact: negbT.
-rewrite (under_edge_strict_lower_y x2 (negbT enp2) eh) //.
-by rewrite -x1 x2 eqxx.
+rewrite (under_edge_strict_lower_y x2 (negbT enp1) eh) //.
+by rewrite !andbT /right_limit /= -x1 -x2 eqxx.
Qed.
Lemma closing_cells_side_limit' cc :
@@ -4826,7 +4826,7 @@ rewrite /right_pts/close_cell (pvertE vlcc1) (pvertE vhcc1) /=.
rewrite !pt_eqE !eqxx /=.
rewrite (on_pvert eonhcc1) eqxx.
rewrite -leq; move: (pal).
-rewrite (under_pvert_y vle) -ltNge lt_neqAle=> /andP[] /negbTE -> _.
+rewrite (under_pvert_y vle) -ltNge lt_neqAle eq_sym => /andP[] /negbTE -> _.
have ppaly : (p_y pp == pvert_y (point e) le) = false.
apply/negbTE; move: (ppal).
rewrite (under_pvert_y vpple) -ltNge lt_neqAle eq_sym=> /andP[] + _.
diff --git a/theories/generic_trajectories.v b/theories/generic_trajectories.v
index f59366e..0d5a515 100644
--- a/theories/generic_trajectories.v
+++ b/theories/generic_trajectories.v
@@ -206,7 +206,7 @@ Definition close_cell (p : pt) (c : cell) :=
vertical_intersection_point p (high c) with
| None, _ | _, None => c
| Some p1, Some p2 =>
- Bcell (left_pts c) (no_dup_seq (p1 :: p :: p2 :: nil)) (low c) (high c)
+ Bcell (left_pts c) (no_dup_seq (p2 :: p :: p1 :: nil)) (low c) (high c)
end.
Definition closing_cells (p : pt) (contact_cells: seq cell) : seq cell :=
@@ -469,7 +469,7 @@ Definition cell_safe_exits_left (c : cell) : seq vert_edge :=
Definition cell_safe_exits_right (c : cell) : seq vert_edge :=
let lx := p_x (head dummy_pt (right_pts c)) in
map (fun p => Build_vert_edge lx (p_y (fst p)) (p_y (snd p)))
- (seq_to_intervals (rev (right_pts c))).
+ (seq_to_intervals (right_pts c)).
(* The index_seq function is a trick to circumvent the absence of a mapi
function in Coq code. It makes it possible to build a list of pairs,
diff --git a/theories/safe_cells.v b/theories/safe_cells.v
index 59d50d8..1868198 100644
--- a/theories/safe_cells.v
+++ b/theories/safe_cells.v
@@ -95,8 +95,8 @@ Lemma right_limit_right_pt_high_cl (c : cell) :
right_limit c <= p_x (right_pt (high c)).
Proof.
move=> /andP[] _ /andP[] _ /andP[] _ /andP[] _ /andP[] _.
-move=> /andP[] rn0 /andP[] rsx /andP[] _ /andP[] _ /andP[] _ /andP[] _.
-by rewrite (eqP (allP rsx _ (last_in_not_nil _ rn0))).
+move=> /andP[] rn0 /andP[] rsx /andP[] _ /andP[] /andP[] _ /andP[] _ + _.
+by rewrite (eqP (allP rsx _ (head_in_not_nil _ rn0))).
Qed.
Lemma left_limit_left_pt_low_cl (c : cell) :
@@ -113,8 +113,8 @@ Lemma right_limit_right_pt_low_cl (c : cell) :
right_limit c <= p_x (right_pt (low c)).
Proof.
move=> /andP[] _ /andP[] _ /andP[] _ /andP[] _ /andP[] _.
-move=> /andP[] rn0 /andP[] rsx /andP[] _ /andP[] /andP[] _ /andP[] _ + _.
-by rewrite (eqP (allP rsx _ (head_in_not_nil _ rn0))).
+move=> /andP[] rn0 /andP[] rsx /andP[] _ /andP[] _ /andP[] _ /andP[] _ +.
+by rewrite (eqP (allP rsx _ (last_in_not_nil _ rn0))).
Qed.
Lemma right_valid :
@@ -155,8 +155,8 @@ have [vlp vhp] : valid_edge (low c) p /\ valid_edge (high c) p.
rewrite (eqP (allP lsx _ (@head_in_not_nil pt dummy_pt _ ln0))) in lh.
rewrite (eqP (allP rsx _ (@last_in_not_nil pt dummy_pt _ rn0))) in rh.
split; rewrite /valid_edge/generic_trajectories.valid_edge.
- by rewrite (ltW (le_lt_trans ll midl)) (ltW (lt_le_trans midr rl)).
- by rewrite (ltW (le_lt_trans lh midl)) (ltW (lt_le_trans midr rh)).
+ by rewrite (ltW (le_lt_trans ll midl)) (ltW (lt_le_trans midr rh)).
+ by rewrite (ltW (le_lt_trans lh midl)) (ltW (lt_le_trans midr rl)).
rewrite under_onVstrict // negb_or.
move: noclh=> [abs | noclh]; first by rewrite abs eqxx in dif.
apply/andP; split; last first.
@@ -198,18 +198,25 @@ have p'on : p' === high c by apply: pvert_on vph.
rewrite (under_edge_lower_y sx) //.
have := cok.
do 5 move=> /andP[] _.
-move=> /andP[] rn0 /andP[] rsx /andP[] srt /andP[] _ lon.
-have p'q : p' = last dummy_pt (right_pts c).
+move=> /andP[] rn0 /andP[] rsx /andP[] srt /andP[] lon _.
+have p'q : p' = head dummy_pt (right_pts c).
have := on_edge_same_point p'on lon.
- have /eqP -> := allP rsx _ pin => /(_ erefl) samey.
- by apply/(@eqP pt); rewrite pt_eqE samey (allP rsx _ pin)/=; exact/eqP.
+ have /eqP -> := allP rsx _ (head_in_not_nil dummy_pt rn0).
+ have /eqP -> := allP rsx _ pin=> /(_ erefl) samey.
+ apply/(@eqP pt).
+ rewrite pt_eqE samey eqxx andbT.
+ rewrite (eqP (allP rsx _ pin))/=.
+ by rewrite (eqP (allP rsx _ (head_in_not_nil dummy_pt rn0))).
move: rn0 p'q pin srt.
-elim/last_ind: (right_pts c) => [| rpts p2 Ih] // _ p'q pin srt.
-move: pin; rewrite mem_rcons inE => /orP[/eqP -> | pin].
- by rewrite p'q last_rcons.
-apply: ltW; rewrite p'q last_rcons.
-move: srt; rewrite map_rcons=> srt.
-by have := (allP (sorted_rconsE lt_trans srt)); apply; rewrite map_f.
+elim: (right_pts c) => [| p2 rpts Ih] // rn0 p'1 pin srt.
+move: pin; rewrite inE => /orP[/eqP -> | pin].
+ by rewrite p'1.
+rewrite /= in srt.
+have gt_trans : transitive (>%R : rel R).
+ by move=> x y z xy yz ; apply: (lt_trans yz xy).
+move: (srt); rewrite (path_sortedE gt_trans)=> /andP[] srt' _.
+apply: ltW; rewrite p'1.
+by apply: (allP srt'); rewrite map_f.
Qed.
Lemma in_bound_closed_valid (c : cell) p :
@@ -292,17 +299,19 @@ rewrite le_eqVlt=> /orP[ /eqP pxq | ].
rewrite inside_closed'E p'al.
have c'ok := closed_ok ccl'.
have /andP[_ /andP[_ /andP[_ /andP[_ /andP[_ ]]] ]] := c'ok.
- move=> /andP[rn0 /andP[samex /andP[srt /andP[onlow onhigh]]]].
+ move=> /andP[rn0 /andP[samex /andP[srt /andP[onhigh onlow]]]].
have prlq : p_x p = right_limit c' by apply/eqP/(allP samex).
- rewrite (under_edge_lower_y prlq onhigh).
- have -> /= : p_y p <= p_y (last dummy_pt (right_pts c')).
- elim/last_ind:{-1} (right_pts c') (erefl (right_pts c'))=>[| ps pn _] psq.
- by rewrite psq in rn0.
- move: pc'r; rewrite psq mem_rcons inE => /orP[/eqP -> | pps].
- by rewrite last_rcons.
- move: (srt); rewrite psq map_rcons => srt'.
- have := sorted_rconsE lt_trans srt'=> /allP/(_ _ (map_f _ pps))/ltW.
- by rewrite last_rcons.
+ rewrite (under_edge_lower_y _ onhigh) /=; last first.
+ rewrite (eqP (allP samex _ pc'r)).
+ by rewrite (eqP (allP samex _ (head_in_not_nil dummy_pt rn0))).
+ have -> /= : p_y p <= p_y (head dummy_pt (right_pts c')).
+ case psq : (right_pts c') => [ | p1 ps]; first by rewrite psq in rn0.
+ move: pc'r; rewrite psq inE=> /orP[/eqP -> | pps]; first by [].
+ apply: ltW.
+ have gt_trans : transitive (>%R : rel R).
+ by move=> x y z xy yz; apply: (lt_trans yz xy).
+ move: (srt); rewrite psq /= (path_sortedE gt_trans)=> /andP[] + _.
+ by move=> /allP /(_ _ (map_f _ pps)).
by rewrite prlq le_refl andbT (non_empty_closed ccl').
elim: pcc pc1 pcccl highs conn rpcc {lpcc pccn0} =>
[ | pc2 pcc Ih] pc1 pcccl highs conn rpcc pc1lp.
From 812c7d16e5a2bb11b42e82ec81d020519a9cd86b Mon Sep 17 00:00:00 2001
From: Yves Bertot
Date: Tue, 21 May 2024 09:52:26 +0200
Subject: [PATCH 36/43] change the order of points in update_closed_cell
---
theories/cells_alg.v | 60 +++++++++++++++------------------
theories/generic_trajectories.v | 4 +--
2 files changed, 29 insertions(+), 35 deletions(-)
diff --git a/theories/cells_alg.v b/theories/cells_alg.v
index 96f918f..1bb2312 100644
--- a/theories/cells_alg.v
+++ b/theories/cells_alg.v
@@ -643,7 +643,7 @@ Hypothesis closed_right_limit :
Hypothesis uniq_closed : uniq (rcons cls lstc).
Hypothesis non_empty_closed :
{in rcons cls lstc, forall c, exists p, inside_closed' p c}.
-Hypothesis non_empty_right : right_pts lstc != [::] :> seq pt.
+Hypothesis non_empty_right : (1 < size (right_pts lstc))%N.
Hypothesis uniq_out : uniq (outgoing e).
Hypothesis high_inj : {in open &, injective high}.
Hypothesis btm_left : bottom_left_cells_lex open (point e).
@@ -2436,16 +2436,27 @@ rewrite /inside_closed' /set_right_pts /inside_closed_cell /contains_point /=.
by rewrite /right_limit /= => ->.
Qed.
+Lemma update_closed_cell_keeps_right_limit c pt :
+ (1 < size (right_pts c))%N ->
+ closed_cell_side_limit_ok c ->
+ right_limit (update_closed_cell c pt) =
+ right_limit c.
+Proof.
+move=> non_empty.
+do 5 move=> /andP[_]; move=> /andP[ptsn0 /andP[/allP allx _]].
+rewrite /update_closed_cell /right_limit /=.
+move: non_empty.
+by case: (right_pts c) => [ | hr [ | r2 rpts]].
+Qed.
+
Lemma inside_closed'_update q1 q:
inside_closed' q lstc = inside_closed' q (update_closed_cell lstc q1).
Proof.
have samer : last dummy_pt (right_pts lstc) =
- last dummy_pt (belast (head dummy_pt (right_pts lstc))
- (behead (right_pts lstc)) ++
- [:: q1; last dummy_pt (right_pts lstc)]).
+ last dummy_pt (head dummy_pt (right_pts lstc) :: q1 ::
+ (behead (right_pts lstc))).
move: non_empty_right.
- elim/last_ind : (right_pts lstc) => [ // | rpts lr _] _ /=.
- by rewrite !last_cat /=.
+ by case : (right_pts lstc) => [ // | hr [ // | r2 rpts]].
rewrite /update_closed_cell.
have := inside_closed_set_right_pts q samer.
rewrite /set_right_pts /=.
@@ -3169,18 +3180,6 @@ rewrite /close_cell (pvertE vlc) (pvertE vhc) /=.
by case: ifP; case: ifP.
Qed.
-Lemma update_closed_cell_keeps_right_limit c pt :
- closed_cell_side_limit_ok c ->
- right_limit (update_closed_cell c pt) =
- right_limit c.
-Proof.
-do 5 move=> /andP[_]; move=> /andP[ptsn0 /andP[/allP allx _]].
-rewrite /update_closed_cell /right_limit /=.
-elim/last_ind: {-1} (right_pts c) (erefl (right_pts c))
- ptsn0=> [ // | [ // | pt0 pts] ptf _] ptsq _ /=.
- by rewrite last_cat.
-Qed.
-
Lemma step_keeps_closed_to_the_left :
let s' := step (Bscan fop lsto lop cls lstc lsthe lstx) e in
{in state_closed_seq s', forall c, right_limit c <= p_x (point e)}.
@@ -3219,12 +3218,9 @@ case: ifP => [ebelow_st {ebelow} | eonlsthe].
case uoc_eq : (update_open_cell _ _) => [nos lno].
rewrite /state_closed_seq /=.
move=> x; rewrite mem_rcons inE => /orP[/eqP -> | ].
- rewrite /update_closed_cell /right_limit /=.
- have := non_empty_right; case pts_eq: (right_pts lstc) => [| p1 rpts] // _.
- rewrite /= last_cat /=.
- have /closed_right_limit: lstc \in rcons cls lstc.
- by rewrite mem_rcons inE eqxx.
- by rewrite /right_limit pts_eq.
+ rewrite update_closed_cell_keeps_right_limit //; last first.
+ by apply: (allP close_side_limit); rewrite mem_rcons inE eqxx.
+ by apply: closed_right_limit; rewrite mem_rcons inE eqxx.
move=> xin.
suff /closed_right_limit : x \in rcons cls lstc by [].
by rewrite mem_rcons inE xin orbT.
@@ -3720,15 +3716,16 @@ by rewrite /= ab.
Qed.
Lemma edge_covered_update_closed_cell g l1 l2 c pt :
+ (1 < size (right_pts c))%N ->
closed_cell_side_limit_ok c ->
edge_covered g l1 (rcons l2 c) ->
edge_covered g l1 (rcons l2 (update_closed_cell c pt)).
Proof.
-move=> cok ecg.
+move=> szpts cok ecg.
have lq : left_limit (update_closed_cell c pt) = left_limit c.
by case: (c).
have rq : right_limit (update_closed_cell c pt) = right_limit c.
- by rewrite update_closed_cell_keeps_right_limit.
+ rewrite update_closed_cell_keeps_right_limit //.
case: ecg => [[oc [pcc [ocP1 [hP [cP [ocin conn]]]]]] | ].
left; exists oc, (seq_subst pcc c (update_closed_cell c pt)).
split.
@@ -3873,9 +3870,8 @@ case: ifP => [ebelow_st {ebelow} | eonlsthe].
rewrite /state_open_seq /= cats0 /state_closed_seq /=.
apply: edge_covered_set_left_pts.
by rewrite /left_limit ptsq.
- apply: edge_covered_update_closed_cell.
- by apply: (allP close_side_limit); rewrite mem_rcons inE eqxx.
- by exact: ecg.
+ apply: edge_covered_update_closed_cell=> //.
+ by apply: (allP close_side_limit); rewrite mem_rcons inE eqxx.
rewrite -/(opening_cells_aux _ _ _ _).
case oca_eq : (opening_cells_aux _ _ _ _) => [[ | fno nos] lno] /=.
have outn0 : fog :: ogs != nil by [].
@@ -3914,7 +3910,7 @@ case: ifP => [ebelow_st {ebelow} | eonlsthe].
rewrite (opening_cells_left oute vlo vho).
by rewrite pxhere lstxq /left_limit ptsq.
by rewrite /opening_cells ogq oca_eq mem_rcons !inE eqxx !orbT.
- apply: edge_covered_update_closed_cell.
+ apply: edge_covered_update_closed_cell=> //.
by apply: (allP close_side_limit); rewrite mem_rcons inE eqxx.
left; exists lno, pcc.
split; first by [].
@@ -3947,13 +3943,13 @@ case: ifP => [ebelow_st {ebelow} | eonlsthe].
by rewrite mem_rcons !inE eqxx !orbT.
apply: edge_covered_set_left_pts.
by rewrite left_fno lstxq /left_limit ptsq.
- apply: edge_covered_update_closed_cell.
+ apply: edge_covered_update_closed_cell=> //.
by apply: (allP close_side_limit); rewrite mem_rcons inE eqxx.
left; exists oc, pcc; repeat (split; first by []); split; last by [].
by rewrite !(mem_cat, inE); move: inold=> /orP[] ->; rewrite ?orbT.
move=> [pcc [P1 [P2 [P3 [P4 P5]]]]].
rewrite /state_open_seq /state_closed_seq /=.
- apply: edge_covered_update_closed_cell.
+ apply: edge_covered_update_closed_cell => //.
by apply: (allP close_side_limit); rewrite mem_rcons inE eqxx.
by right; exists pcc; repeat (split; first by []); done.
rewrite -/(open_cells_decomposition _ _).
diff --git a/theories/generic_trajectories.v b/theories/generic_trajectories.v
index 0d5a515..4fc8c30 100644
--- a/theories/generic_trajectories.v
+++ b/theories/generic_trajectories.v
@@ -282,9 +282,7 @@ Record scan_state :=
Definition update_closed_cell (c : cell) (p : pt) : cell :=
let ptseq := right_pts c in
- let newptseq :=
- (belast (head dummy_pt ptseq) (behead ptseq)) ++
- [:: p; seq.last dummy_pt ptseq] in
+ let newptseq := seq.head dummy_pt ptseq :: p :: behead ptseq in
Bcell (left_pts c) newptseq (low c) (high c).
Definition set_left_pts (c : cell) (l : seq pt) :=
From 0ca511fff970785ef97cbac4258265160722b7e8 Mon Sep 17 00:00:00 2001
From: Yves Bertot
Date: Wed, 22 May 2024 07:50:36 +0200
Subject: [PATCH 37/43] introducing the invariant for non-general positions
(with possibly vertically aligned events)
---
theories/cells_alg.v | 233 ++++++++++++++++++++++++--------
theories/generic_trajectories.v | 4 +-
theories/safe_cells.v | 2 +
3 files changed, 181 insertions(+), 58 deletions(-)
diff --git a/theories/cells_alg.v b/theories/cells_alg.v
index 1bb2312..43c91f9 100644
--- a/theories/cells_alg.v
+++ b/theories/cells_alg.v
@@ -22,7 +22,7 @@ Notation p_x := (p_x R).
Notation p_y := (p_y R).
Notation Bpt := (Bpt R).
Notation edge := (edge R).
-Notation event := (event R edge).
+Notation event' := (event R edge).
Notation outgoing := (outgoing R edge).
Notation point := (point R edge).
@@ -137,7 +137,7 @@ rewrite inE lc0; congr (_ || _).
by rewrite -map_cons main mem_rcons inE.
Qed.
-Lemma not_bottom_or_top bottom top (ev : event) :
+Lemma not_bottom_or_top bottom top (ev : event') :
inside_box bottom top (point ev) ->
out_left_event ev ->
{in outgoing ev, forall g, g \notin [:: bottom; top]}.
@@ -574,7 +574,7 @@ Qed.
Section step.
-Variable e : event.
+Variable e : event'.
Variable fop : seq cell.
Variable lsto : cell.
Variable lop : seq cell.
@@ -582,7 +582,7 @@ Variable cls : seq cell.
Variable lstc : cell.
Variable lsthe : edge.
Variable lstx : R.
-Variable future_events : seq event.
+Variable future_events : seq event'.
Variable p : pt.
Let open := (fop ++ lsto :: lop).
@@ -5019,8 +5019,8 @@ Lemma cell_edges_start bottom top :
cell_edges [::(start_open_cell bottom top)] = [:: bottom; top].
Proof. by []. Qed.
-Record common_general_position_invariant bottom top edge_set s
- (events : seq event) :=
+Record common_invariant bottom top edge_set s
+ (events : seq event') :=
{ inv1 : inv1_seq bottom top events (state_open_seq s);
lstx_eq : lst_x _ _ s = left_limit (lst_open s);
high_lsto_eq : high (lst_open s) = lst_high _ _ s;
@@ -5032,11 +5032,23 @@ Record common_general_position_invariant bottom top edge_set s
[seq point x | x <- events];
lex_events : sorted (@lexPtEv _) events;
sides_ok : all open_cell_side_limit_ok (state_open_seq s);
+}.
+
+Record common_general_position_invariant bottom top edge_set s
+ (events : seq event') :=
+ { gcomm : common_invariant bottom top edge_set s events;
general_pos :
all (fun ev => lst_x _ _ s < p_x (point ev)) events &&
sorted (fun e1 e2 => p_x (point e1) < p_x (point e2)) events;
}.
+Record common_non_gp_invariant bottom top edge_set s (events : seq event') :=
+ { ngcomm : common_invariant bottom top edge_set s events;
+ lst_side_lex :
+ (1 < size (left_pts (lst_open s)))%N &&
+ path (@lexPt _) (nth dummy_pt (left_pts (lst_open s)) 1)
+ [seq point e | e <- events]}.
+
(* This lemma only provides a partial correctness statement in the case
where the events are never aligned vertically. This condition is
expressed by the very first hypothesis. TODO: it relies on the assumption
@@ -5048,7 +5060,7 @@ Record common_general_position_invariant bottom top edge_set s
cells, here named "open", should be reduced to only one element. *)
Record disjoint_general_position_invariant (bottom top : edge)
(edge_set : seq edge)
- (s : scan_state) (events : seq event) :=
+ (s : scan_state) (events : seq event') :=
{ op_cl_dis :
{in state_open_seq s & state_closed_seq s,
disjoint_open_closed_cells R};
@@ -5065,7 +5077,7 @@ Record disjoint_general_position_invariant (bottom top : edge)
Definition dummy_state :=
Bscan [::] dummy_cell [::] [::] dummy_cell dummy_edge 0.
-Definition initial_state bottom top (events : seq event) :=
+Definition initial_state bottom top (events : seq event') :=
match events with
| [::] => dummy_state
| ev :: future_events =>
@@ -5078,7 +5090,7 @@ Definition initial_state bottom top (events : seq event) :=
end.
Lemma initial_intermediate bottom top s events :
- sorted (fun e1 e2=> p_x (point e1) < p_x (point e2)) events ->
+(* sorted (fun e1 e2=> p_x (point e1) < p_x (point e2)) events -> *)
bottom <| top ->
(* TODO: rephrase this statement in a statement that easier to understand. *)
open_cell_side_limit_ok (start_open_cell bottom top) ->
@@ -5110,7 +5122,7 @@ Lemma initial_intermediate bottom top s events :
pairwise (@edge_below _) (bottom :: [seq high c | c <- [:: op0]]) /\
sorted (@lexPtEv _) (behead events).
Proof.
-move=> ltev boxwf startok nocs' evin lexev evsub out_evs cle.
+move=> boxwf startok nocs' evin lexev evsub out_evs cle.
have nocs : {in bottom :: top :: s &, no_crossing R}.
by apply: inter_at_ext_no_crossing.
case evsq : events => [ | ev future_events]; [by [] | move=> _ /=].
@@ -5157,8 +5169,7 @@ do 15 (split; first by []).
by [].
Qed.
-Lemma initial_common_general_position_invariant bottom top s events:
- sorted (fun e1 e2=> p_x (point e1) < p_x (point e2)) events ->
+Lemma initial_common_invariant bottom top s events:
bottom <| top ->
(* TODO: rephrase this statement in a statement that easier to understand. *)
open_cell_side_limit_ok (start_open_cell bottom top) ->
@@ -5169,14 +5180,12 @@ Lemma initial_common_general_position_invariant bottom top s events:
{in events, forall ev, out_left_event ev} ->
close_edges_from_events events ->
events != [::] ->
- common_general_position_invariant bottom top s
- (initial_state bottom top events)
- (* (head (dummy_event _) events) *) (behead events).
+ common_invariant bottom top s
+ (initial_state bottom top events) (behead events).
Proof.
-move=> ltev boxwf startok nocs' evin lexev evsub out_evs cle evsn0.
+move=> boxwf startok nocs' evin lexev evsub out_evs cle evsn0.
have :=
- initial_intermediate ltev boxwf startok nocs' evin lexev evsub out_evs cle
- evsn0.
+ initial_intermediate boxwf startok nocs' evin lexev evsub out_evs cle evsn0.
case evsq : events evsn0 => [ | ev future_events]; [by [] | move=> _].
move=> [op0sok [cbtom0 [adj0 /=
[sval0 [rf0 [inbox0 [cle0 [oute0 [clae0 [vb
@@ -5230,15 +5239,10 @@ rewrite -cats1 in edges_sub1 sval'.
have lstx1op : lst_x _ _ state1 = left_limit (lst_open state1).
have := opening_cells_left oute vb vt; rewrite /opening_cells.
by rewrite oca_eq st1q => -> //=; rewrite mem_rcons inE eqxx.
-have sh1 : all (fun ev => lst_x _ _ state1 < p_x (point ev)) future_events &&
- sorted (fun e1 e2 => p_x (point e1) < p_x (point e2)) future_events.
- move: ltev; rewrite evsq /= path_sortedE /=; last first.
- by move=> x y z; apply: lt_trans.
- by rewrite st1q.
have he1q' : high (lst_open state1) = lst_high _ _ state1.
rewrite st1q /=.
by have := opening_cells_aux_high_last vb vt oute'; rewrite oca_eq.
-move: lstx1op he1q' sh1; rewrite st1q=> lstx1op he1q' sh1.
+move: lstx1op he1q'; rewrite st1q=> lstx1op he1q'.
have oks1 : all open_cell_side_limit_ok (nos ++ [:: lno]).
have := pin => /andP[] /andP[] /underWC pal puh _.
have := opening_cells_side_limit vb vt pal puh oute.
@@ -5246,6 +5250,121 @@ have oks1 : all open_cell_side_limit_ok (nos ++ [:: lno]).
by constructor.
Qed.
+Lemma initial_common_general_position_invariant bottom top s events:
+ sorted (fun e1 e2=> p_x (point e1) < p_x (point e2)) events ->
+ bottom <| top ->
+ (* TODO: rephrase this statement in a statement that easier to understand. *)
+ open_cell_side_limit_ok (start_open_cell bottom top) ->
+ {in bottom :: top :: s &, forall e1 e2, inter_at_ext e1 e2} ->
+ all (inside_box bottom top) [seq point e | e <- events] ->
+ sorted (@lexPtEv _) events ->
+ {subset flatten [seq outgoing e | e <- events] <= s} ->
+ {in events, forall ev, out_left_event ev} ->
+ close_edges_from_events events ->
+ events != [::] ->
+ common_general_position_invariant bottom top s
+ (initial_state bottom top events) (behead events).
+Proof.
+move=> ltev boxwf startok nocs' evin lexev evsub out_evs cle evsn0.
+have ici := initial_common_invariant boxwf startok nocs' evin lexev evsub
+ out_evs cle evsn0.
+constructor; first by exact: ici.
+case evsq : events => [ | ev1 evs] //.
+move: ltev; rewrite evsq /=.
+rewrite path_sortedE; last by move=> x y z; apply: lt_trans.
+move=> /andP[] + ->; rewrite andbT.
+rewrite /initial_state /=.
+by case oca_eq: (opening_cells_aux _ _ _ _).
+Qed.
+
+Lemma opening_cells_aux_event le he p gs nos lno :
+ valid_edge le p ->
+ valid_edge he p ->
+ p >>= le ->
+ p <<< he ->
+ {in gs, forall g, left_pt g == p} ->
+ opening_cells_aux p gs le he = (nos, lno) ->
+ (1 < size (left_pts lno))%N /\
+ nth dummy_pt (left_pts lno) 1 = p.
+Proof.
+move=> vle vhe; elim: gs le vle nos lno=>
+ [ | g1 gs Ih] le vle nos lno pal puh oute /=.
+ rewrite -/(vertical_intersection_point p le) (pvertE vle).
+ rewrite -/(vertical_intersection_point p he) (pvertE vhe).
+ case: ifP=> [/eqP abs1 | dif1 //]; last first.
+ case: ifP=> [/eqP abs2 | dif2 //]; last first.
+ by move=> [] _ <- /=.
+ by move=> [] _ <- /=; split; [ | rewrite -abs2].
+ move=> [] _.
+ rewrite (strict_under_pvert_y vhe) ltNge in puh.
+ move: puh => /negP; case.
+ by rewrite on_pvert // -abs1 pvert_on.
+case oca_eq : (opening_cells_aux p gs g1 he) => [no1 lno1].
+rewrite -/(vertical_intersection_point p le) (pvertE vle).
+have g1q : left_pt g1 = p.
+ have g1in : g1 \in g1 :: gs by rewrite inE eqxx.
+ by rewrite (eqP (oute g1 g1in)).
+have vg : valid_edge g1 p.
+ by rewrite -g1q valid_edge_left.
+case: ifP => [/eqP ponl | dif]; last first.
+ move=> [] A <-.
+ apply: (Ih g1 vg no1)=> //.
+ by rewrite -g1q; apply: left_pt_above.
+ by move=> g gin; apply: oute; rewrite inE gin orbT.
+move=> [] _ <-.
+apply: (Ih g1 vg no1)=> //.
+ by rewrite -g1q; apply: left_pt_above.
+by move=> g gin; apply: oute; rewrite inE gin orbT.
+Qed.
+
+Lemma sorted_cat_rcons [T : Type] (rel : rel T) s1 e s2 :
+ sorted rel ((rcons s1 e) ++ s2) =
+ sorted rel (rcons s1 e) && path rel e s2.
+Proof.
+elim: s1 => [ | e1 s1 Ih] //.
+by rewrite /= cat_path last_rcons.
+Qed.
+
+Lemma initial_common_non_gp_invariant bottom top s events:
+ bottom <| top ->
+ (* TODO: rephrase this statement in a statement that easier to understand. *)
+ open_cell_side_limit_ok (start_open_cell bottom top) ->
+ {in bottom :: top :: s &, forall e1 e2, inter_at_ext e1 e2} ->
+ all (inside_box bottom top) [seq point e | e <- events] ->
+ sorted (@lexPtEv _) events ->
+ {subset flatten [seq outgoing e | e <- events] <= s} ->
+ {in events, forall ev, out_left_event ev} ->
+ close_edges_from_events events ->
+ events != [::] ->
+ common_non_gp_invariant bottom top s
+ (initial_state bottom top events) (behead events).
+Proof.
+move=> boxwf startok nocs' evin lexev evsub out_evs cle evsn0.
+have ici := initial_common_invariant boxwf startok nocs' evin lexev evsub
+ out_evs cle evsn0.
+constructor; first by exact: ici.
+case evsq : events evsn0 => [ | ev1 evs] //= _.
+case oca_eq: (opening_cells_aux _ _ _ _) => [nos lno].
+have oute1 : out_left_event ev1.
+ by apply: out_evs; rewrite evsq inE eqxx.
+have oute1' : {in sort (@edge_below _) (outgoing ev1), forall g,
+ left_pt g == point ev1}.
+ by move=> g; rewrite mem_sort; apply: oute1.
+have := sides_ok ici.
+rewrite /initial_state evsq oca_eq /state_open_seq/= all_cat /= andbT.
+move=> /andP[] _; rewrite /open_cell_side_limit_ok.
+move=> /andP[] _ /andP[] samex /andP[] srt _.
+have ev1in : inside_box bottom top (point ev1).
+ by apply: (allP evin); rewrite evsq map_f // inE eqxx.
+have [vb vt] : valid_edge bottom (point ev1) /\ valid_edge top (point ev1).
+ by rewrite !(inside_box_valid_bottom_top ev1in) // !inE eqxx ?orbT.
+move: (ev1in); rewrite /inside_box=> /andP[] /andP[] /underWC ev1a ev1u _.
+have [] := opening_cells_aux_event vb vt ev1a ev1u oute1' oca_eq.
+case lptsq : (left_pts lno) => [ | p1 [ | p2 ps]] //= _ p2q.
+rewrite p2q path_map.
+by move: lexev; rewrite evsq /=.
+Qed.
+
Lemma initial_disjoint_general_position_invariant
bottom top s events:
sorted (fun e1 e2=> p_x (point e1) < p_x (point e2)) events ->
@@ -5266,7 +5385,7 @@ Proof.
move=> ltev boxwf startok nocs' evin lexev evsub out_evs cle evsn0.
have := initial_common_general_position_invariant ltev boxwf startok
nocs' evin lexev evsub out_evs cle evsn0.
-have := initial_intermediate ltev boxwf startok nocs' evin lexev evsub
+have := initial_intermediate boxwf startok nocs' evin lexev evsub
out_evs cle evsn0.
move: evsn0; case evsq : events => [ | ev evs];[by [] | move=> _].
lazy zeta; rewrite [head _ _]/= [behead _]/=.
@@ -5275,7 +5394,7 @@ move=> -[] op0sok [cbtom0 [adj0 [sval0 [rf0 [inbox0
have evins : ev \in events by rewrite evsq inE eqxx.
rewrite /initial_state /state_open_seq/state_closed_seq/= => Cinv.
case oca_eq: (opening_cells_aux _ _ _ _) Cinv => [nos lno] Cinv.
-move: (Cinv)=> -[]; rewrite /state_open_seq/state_closed_seq/=.
+move: (Cinv)=> -[] []; rewrite /state_open_seq/state_closed_seq/=.
move=> inv1 pxe hlno edges_sub1 cle1 oute1 inbox1 lexevs sok1 gen_pos.
set op0 := start_open_cell bottom top.
have op0_cl0_dis : {in [:: op0] & [::], disjoint_open_closed_cells R} by [].
@@ -5323,7 +5442,7 @@ Lemma simple_step_common_general_position_invariant
evs.
Proof.
move=> boxwf nocs' inbox_s oe.
-move=> []; rewrite /state_open_seq/state_closed_seq/=.
+move=> [] []; rewrite /state_open_seq/state_closed_seq/=.
move=> inv lstxq lstheq sub_edges cle out_es /[dup] inbox0.
move=> /andP[] inbox_e inbox_es.
move=> lexev oks /andP[] lstxlt ltev'.
@@ -5404,7 +5523,7 @@ Proof.
move=> boxwf nocs' inbox_s oe.
move=> []; rewrite /state_open_seq/state_closed_seq/=.
move=> oc_dis c_dis Cinv pw rl.
-have := Cinv=> -[]; rewrite /state_open_seq/state_closed_seq/=.
+have := Cinv=> -[] []; rewrite /state_open_seq/state_closed_seq/=.
move=> inv1 lstxq lstheq sub_edges cle out_es inbox_es lexev oks gen_pos.
have := inv1 => -[] clae [] []; first by [].
move=> sval []adj []cbtom rfo.
@@ -5459,7 +5578,7 @@ Definition start :=
start R eq_op le +%R (fun x y => x - y) *%R (fun x y => x / y) 1 edge
(@unsafe_Bedge _) (@left_pt _) (@right_pt _).
-Lemma start_eq_initial (bottom top : edge) (ev : event) :
+Lemma start_eq_initial (bottom top : edge) (ev : event') :
start ev bottom top = initial_state bottom top [:: ev].
Proof. by []. Qed.
@@ -5526,7 +5645,7 @@ move=> {evs ltev evin lexev evsub out_evs cle evsn0}.
move=> [fop lsto lop cls lstc lsthe lstx].
case; set ops' := (state_open_seq _); set (cls' := state_closed_seq _).
rewrite /=.
-move=> dis_open_closed dis_cl /[dup] Cinv [] inv1 lstxq lstheq sub_edges.
+move=> dis_open_closed dis_cl /[dup] Cinv [] [] inv1 lstxq lstheq sub_edges.
move=> /[dup] cle /andP[cl_e_fut' cle'] out_fut'.
move=> /[dup] inbox_all_events' /andP[inbox_e inbox_all_events] lexevs oks.
move=> /andP[] /andP[] lstxlte lstx_fut' ltfut' edges_pairwise cl_at_left.
@@ -5551,8 +5670,8 @@ by apply.
Qed.
Record edge_covered_general_position_invariant (bottom top : edge)
- (edge_set : seq edge) (processed_set : seq event)
- (s : scan_state) (events : seq event) :=
+ (edge_set : seq edge) (processed_set : seq event')
+ (s : scan_state) (events : seq event') :=
{ edge_covered_ec : {in processed_set, forall e,
{in outgoing e, forall g,
edge_covered g (state_open_seq s) (state_closed_seq s)}};
@@ -5618,7 +5737,7 @@ Proof.
move=> gen_pos lexev wf cle startok nocs' n_inner inbox_es sub_es out_es
uniq_out_es evsn0.
rewrite /initial_state.
-have := initial_intermediate gen_pos wf startok nocs' inbox_es lexev sub_es
+have := initial_intermediate wf startok nocs' inbox_es lexev sub_es
out_es cle evsn0.
have := initial_common_general_position_invariant gen_pos wf startok nocs'
inbox_es lexev sub_es out_es cle evsn0.
@@ -5636,7 +5755,7 @@ have cle0 : close_edges_from_events (e :: evs) by rewrite -evsq.
move: inbox_es; rewrite evsq=> inbox_es.
move: Cinv; rewrite/initial_state oca_eq/state_open_seq/state_closed_seq/=.
move=> /[dup] Cinv; rewrite /state_open_seq/state_closed_seq /=.
-move=> -[]; rewrite /state_open_seq/state_closed_seq /=.
+move=> -[] []; rewrite /state_open_seq/state_closed_seq /=.
move=> inv1 px1 lstheq1 sub1 _ _ _ _ oks1 lexpt1.
have [clae1 [pre_sval [adj1 [cbtom1 rf1]]]] := inv1.
set op0 := start_open_cell bottom top.
@@ -5733,7 +5852,7 @@ have nocs : {in bottom :: top :: s &, no_crossing R}.
by apply: inter_at_ext_no_crossing.
set st := Bscan _ _ _ _ _ _ _.
move=> oe.
-move=> [] covered p_covered /[dup] Cinv [] /[dup] inv_s [] clae.
+move=> [] covered p_covered /[dup] Cinv [] [] /[dup] inv_s [] clae.
move=> - [] []; first by [].
rewrite /state_open_seq/state_closed_seq /= => sval [] adj [] cbtom rfo.
move=> lstxq lstheq sub_edges cle out_es.
@@ -5914,8 +6033,8 @@ by have := simple_step_edge_covered_general_position boxwf nocs'
Qed.
Record safe_side_general_position_invariant (bottom top : edge)
- (edge_set : seq edge) (processed_set : seq event)
- (s : scan_state) (events : seq event) :=
+ (edge_set : seq edge) (processed_set : seq event')
+ (s : scan_state) (events : seq event') :=
{ disjoint_ss :
disjoint_general_position_invariant bottom top edge_set s events;
covered_ss :
@@ -5959,7 +6078,7 @@ Record safe_side_general_position_invariant (bottom top : edge)
p != point e :> pt};
}.
-Lemma events_to_edges_rcons evs (e : event) :
+Lemma events_to_edges_rcons evs (e : event') :
events_to_edges (rcons evs e) = events_to_edges evs ++ outgoing e.
Proof. by rewrite /events_to_edges /= map_rcons flatten_rcons. Qed.
@@ -6021,7 +6140,7 @@ Lemma initial_safe_side_general_position bottom top s events:
Proof.
move=> gen_pos lexev wf cle startok nocs' n_inner inbox_es sub_es out_es
uniq_out_es evsn0.
-have := initial_intermediate gen_pos wf startok nocs' inbox_es lexev sub_es
+have := initial_intermediate wf startok nocs' inbox_es lexev sub_es
out_es cle evsn0.
have := initial_disjoint_general_position_invariant gen_pos wf startok
nocs' inbox_es lexev sub_es out_es cle evsn0.
@@ -6142,7 +6261,7 @@ have op_no_event : {in [:: ev] & nos ++ [:: lno],
have := opening_cells_in vb0 vt0 oute; rewrite /opening_cells oca_eq pev.
by apply.
have lt_p_ev :
- {in [:: ev] & evs, forall e1 e2 : event, p_x (point e1) < p_x (point e2)}.
+ {in [:: ev] & evs, forall e1 e2 : event', p_x (point e1) < p_x (point e2)}.
by move=> e1 e2; rewrite inE => /eqP ->; apply: lte.
have ll_o_b :
{in nos ++ [:: lno], forall c,
@@ -6253,7 +6372,7 @@ elim=> [ | {evsq oca_eq istate invss}ev {req}future_events Ih] op cl st p_set.
rewrite (eq_all_r (_ : lstc :: cls =i rcons cls lstc)) //.
by move=> c; rewrite mem_rcons.
(* TODO : find a place for this as a lemma. *)
- have [[] + + _ _ _ _ _ _ _ + _] := c_inv; rewrite /state_open_seq/=.
+ have [[] [] + + _ _ _ _ _ _ _ + _] := c_inv; rewrite /state_open_seq/=.
rewrite /state_open_seq/= /close_alive_edges => clae.
move=> [] _ [] adj [] cbtom rfo _.
have htop : {in fop ++ lsto :: lop, forall c, high c = top}.
@@ -6314,9 +6433,9 @@ rewrite -/(opening_cells_aux _ _ _ _).
case oca_eq : (opening_cells_aux _ _ _ _) => [{}nos {}lno].
rewrite -(cat_rcons ev).
apply: Ih.
-have [clae [pre_sval [adj [cbtom rfo]]]] := inv1 c_inv.
+have [clae [pre_sval [adj [cbtom rfo]]]] := inv1 (gcomm c_inv).
move: pre_sval=> [| sval]; first by[].
-have inbox_es := inbox_events c_inv.
+have inbox_es := inbox_events (gcomm c_inv).
have inbox_e : inside_box bottom top (point ev) by move: inbox_es=>/andP[].
move: (oe); rewrite (_ : fop ++ lsto :: lop = state_open_seq st); last first.
by rewrite stq.
@@ -6329,7 +6448,7 @@ have [{}pal {}puh vl vp nc]:=
decomposition_connect_properties rfo sval adj cbtom
(inside_box_between inbox_e) oe'.
have oute : out_left_event ev.
- by apply: (out_events c_inv); rewrite inE eqxx.
+ by apply: (out_events (gcomm c_inv)); rewrite inE eqxx.
have oute' :
{in (sort (@edge_below _) (outgoing ev)), forall g, left_pt g == point ev}.
by move=> g; rewrite mem_sort; apply: oute.
@@ -6371,7 +6490,7 @@ have subc' :
move=> g; rewrite /state_closed_seq/= -cats1 -catA /= -cat_rcons.
rewrite cell_edges_cat mem_cat=> /orP[gold | ].
by apply: subc; rewrite stq.
- have subo := edges_sub c_inv.
+ have subo := edges_sub (gcomm c_inv).
rewrite cats1 -map_rcons mem_cat=> /orP[] /mapP[c'] /mapP[c2 c2in ->] ->.
have [-> _ _] := close_cell_preserve_3sides (point ev) c2.
apply: subo; rewrite !mem_cat; apply/orP; left; apply/orP; left.
@@ -6382,7 +6501,7 @@ have subc' :
(* Proving that open cells have a left side that is smaller than any
event first coordinate. *)
have loplte : {in state_open_seq rstate & future_events,
- forall (c : cell) (e : event), left_limit c < p_x (point e)}.
+ forall (c : cell) (e : event'), left_limit c < p_x (point e)}.
move=> c e; rewrite /state_open_seq/= -catA -cat_rcons => cin ein.
move: cin; rewrite !mem_cat orbCA => /orP[ | cold ]; last first.
apply: lolt; first by rewrite ocd -cat_rcons !mem_cat orbCA cold orbT.
@@ -6418,16 +6537,16 @@ have clok' : all (@closed_cell_side_limit_ok _) (state_closed_seq rstate).
by rewrite ocd -cat_rcons !mem_cat c'in orbT.
have /(allP sval) /= /andP[vlc' vhc'] := c'in'.
have c'ok : open_cell_side_limit_ok c'.
- by apply: (allP (sides_ok c_inv)).
+ by apply: (allP (sides_ok (gcomm c_inv))).
by apply close_cell_ok.
(* proving a right_limit stronger invariant. *)
have rllte : {in state_closed_seq rstate & future_events,
- forall (c : cell) (e : event), right_limit c < p_x (point e)}.
+ forall (c : cell) (e : event'), right_limit c < p_x (point e)}.
rewrite /state_closed_seq/=.
move=> c e cin ein.
move: cin; rewrite -cats1 -catA /= -cat_rcons mem_cat=> /orP[cold | cnew].
by apply: rl; rewrite ?stq // inE ein orbT.
- have in_es := inbox_events c_inv.
+ have in_es := inbox_events (gcomm c_inv).
have := closing_cells_to_the_left in_es rfo cbtom adj sval.
rewrite stq=> /(_ _ _ _ _ _ _ oe)=> -[] main1 main2.
have eve : p_x (point ev) < p_x (point e).
@@ -6478,7 +6597,7 @@ have cl_safe_edge :
have cin' : c \in state_closed_seq st by rewrite stq.
have abs := rl _ _ cin' (mem_head _ _).
move=> /andP[] _ /andP[] + _.
- have := out_events c_inv (mem_head _ _) gnew=> /eqP ->.
+ have := out_events (gcomm c_inv) (mem_head _ _) gnew=> /eqP ->.
(* TODO : have the same condition, but for the right side of closed cells. *)
suff prl : p_x p <= right_limit c.
rewrite leNgt=> /negP; apply.
@@ -6544,7 +6663,8 @@ have cl_safe_edge :
by have [-> -> _] := close_cell_preserve_3sides (point ev) c' => ->.
have : p >>= low opc by move: cnt=> /andP[].
rewrite strict_nonAunder // negb_and negbK=> /orP[ | stricter]; last first.
- have := disoc adj pw (sides_ok c_inv)=> /(_ opc c' opco c'in') [ab' | ].
+ have := disoc adj pw (sides_ok (gcomm c_inv)).
+ move=> /(_ opc c' opco c'in') [ab' | ].
by move: puhc'; rewrite strict_nonAunder // -ab' opch abs.
move=> /(_ p) + ; move=>/negP.
rewrite inside_open'E stricter valid_open_limit //.
@@ -6574,13 +6694,14 @@ have cl_safe_edge :
by move: palc'=> /[swap] => ->.
have ldifh : low opc != high opc by apply: d_e; rewrite mem_cat opco.
have low_opc_s : low opc \in [:: bottom, top & s].
- by apply: (edges_sub c_inv); rewrite !mem_cat map_f.
+ by apply: (edges_sub (gcomm c_inv)); rewrite !mem_cat map_f.
have high_opc_s : high opc \in [:: bottom, top & s].
- by apply: (edges_sub c_inv); rewrite !mem_cat map_f ?orbT.
+ by apply: (edges_sub (gcomm c_inv)); rewrite !mem_cat map_f ?orbT.
have := nocs' (low opc) (high opc) low_opc_s high_opc_s.
move=> [Q | ]; first by rewrite Q eqxx in ldifh.
have ponh : p === high opc by rewrite opch.
- have opcok : open_cell_side_limit_ok opc by apply: (allP (sides_ok c_inv)).
+ have opcok : open_cell_side_limit_ok opc.
+ by apply: (allP (sides_ok (gcomm c_inv))).
move=> /(_ _ ponl ponh); rewrite !inE=> /orP[/eqP pleft | /eqP].
have : left_limit opc < p_x p.
by rewrite samex; apply: lolt; rewrite // inE eqxx.
@@ -6673,7 +6794,7 @@ have cl_safe_event :
by rewrite -abs pxq lt_irreflexive.
have op_safe_event :
{in rcons p_set ev & state_open_seq rstate,
- forall (e : event) (c : cell) (p : pt),
+ forall (e : event') (c : cell) (p : pt),
in_safe_side_left p c -> p != point e}.
move=> e c ein; rewrite /rstate/state_open_seq/=.
rewrite -catA -cat_rcons !mem_cat orbCA=> /orP[cnew | cold]; last first.
@@ -6709,7 +6830,7 @@ have rf_closed1 : {in state_closed_seq rstate, forall c, low c <| high c}.
by apply: rf_cl; rewrite /state_closed_seq stq/=.
rewrite cats1 -map_rcons=> /mapP[c' c'in ->].
have [-> -> _] := close_cell_preserve_3sides (point ev) c'.
- have [+ _ _ _ _ _ _ _ _ _] := c_inv.
+ have [[] + _ _ _ _ _ _ _ _ _] := c_inv.
move=> [] _ [] _ [] _ [] _ /allP; apply.
by rewrite ocd -cat_rcons !mem_cat c'in orbT.
have lo_lb' : {in state_open_seq rstate, forall c,
diff --git a/theories/generic_trajectories.v b/theories/generic_trajectories.v
index 4fc8c30..8ea815c 100644
--- a/theories/generic_trajectories.v
+++ b/theories/generic_trajectories.v
@@ -526,9 +526,9 @@ Definition one_door_neighbors
indexed_doors)
end.
-Definition left_limit (c : cell) := p_x (seq.last dummy_pt (left_pts c)).
+Definition left_limit (c : cell) := p_x (seq.head dummy_pt (left_pts c)).
-Definition right_limit c := p_x (seq.last dummy_pt (right_pts c)).
+Definition right_limit c := p_x (seq.head dummy_pt (right_pts c)).
Definition cmp_option := cmp_option _ R_ltb.
diff --git a/theories/safe_cells.v b/theories/safe_cells.v
index 1868198..d1acd96 100644
--- a/theories/safe_cells.v
+++ b/theories/safe_cells.v
@@ -212,6 +212,7 @@ elim: (right_pts c) => [| p2 rpts Ih] // rn0 p'1 pin srt.
move: pin; rewrite inE => /orP[/eqP -> | pin].
by rewrite p'1.
rewrite /= in srt.
+(* TODO : use rev_trans here. *)
have gt_trans : transitive (>%R : rel R).
by move=> x y z xy yz ; apply: (lt_trans yz xy).
move: (srt); rewrite (path_sortedE gt_trans)=> /andP[] srt' _.
@@ -308,6 +309,7 @@ rewrite le_eqVlt=> /orP[ /eqP pxq | ].
case psq : (right_pts c') => [ | p1 ps]; first by rewrite psq in rn0.
move: pc'r; rewrite psq inE=> /orP[/eqP -> | pps]; first by [].
apply: ltW.
+ (* TODO : use rev_trans here. *)
have gt_trans : transitive (>%R : rel R).
by move=> x y z xy yz; apply: (lt_trans yz xy).
move: (srt); rewrite psq /= (path_sortedE gt_trans)=> /andP[] + _.
From dde8ba269322ff5fd07807b4c58d833e4a914502 Mon Sep 17 00:00:00 2001
From: Yves Bertot
Date: Wed, 31 Jul 2024 16:17:16 +0200
Subject: [PATCH 38/43] adds information about publications
---
.github/workflows/docker-action.yml | 5 ++---
README.md | 9 ++++++---
meta.yml | 13 ++++++-------
3 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/.github/workflows/docker-action.yml b/.github/workflows/docker-action.yml
index 41f0932..052158a 100644
--- a/.github/workflows/docker-action.yml
+++ b/.github/workflows/docker-action.yml
@@ -17,17 +17,16 @@ jobs:
strategy:
matrix:
image:
- - 'mathcomp/mathcomp:2.2.0-coq-8.17'
- - 'mathcomp/mathcomp:2.2.0-coq-8.18'
- 'mathcomp/mathcomp:2.2.0-coq-8.19'
fail-fast: false
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- uses: coq-community/docker-coq-action@v1
with:
opam_file: 'coq-mathcomp-trajectories.opam'
custom_image: ${{ matrix.image }}
+
# See also:
# https://github.com/coq-community/docker-coq-action#readme
# https://github.com/erikmd/docker-coq-github-action-demo
diff --git a/README.md b/README.md
index b3c41bb..06103b0 100644
--- a/README.md
+++ b/README.md
@@ -6,8 +6,8 @@ Follow the instructions on https://github.com/coq-community/templates to regener
[![Docker CI][docker-action-shield]][docker-action-link]
-[docker-action-shield]: https://github.com/math-comp/trajectories/workflows/Docker%20CI/badge.svg?branch=master
-[docker-action-link]: https://github.com/math-comp/trajectories/actions?query=workflow:"Docker%20CI"
+[docker-action-shield]: https://github.com/math-comp/trajectories/actions/workflows/docker-action.yml/badge.svg?branch=master
+[docker-action-link]: https://github.com/math-comp/trajectories/actions/workflows/docker-action.yml
@@ -33,7 +33,7 @@ TODO
- [Infotheo 0.7.0 of later](https://github.com/affeldt-aist/infotheo)
- Coq namespace: `mathcomp.trajectories`
- Related publication(s):
- - [TODO](TODO) doi:[TODO](https://doi.org/TODO)
+ - [Safe Smooth Paths between Straight Line Obstacles](https://inria.hal.science/hal-04312815) doi:[https://doi.org/10.1007/978-3-031-61716-4_3](https://doi.org/https://doi.org/10.1007/978-3-031-61716-4_3)
## Building and installation instructions
@@ -70,6 +70,9 @@ references:
https://hal.inria.fr/inria-00503017v2/document
- Theorem of three circles in Coq (2013)
https://arxiv.org/abs/1306.0783
+- Safe Smooth Paths between straight line obstacles
+ https://inria.hal.science/hal-04312815
+ https://link.springer.com/chapter/10.1007/978-3-031-61716-4_3
## Development information
diff --git a/meta.yml b/meta.yml
index 7057cff..60a7716 100644
--- a/meta.yml
+++ b/meta.yml
@@ -31,10 +31,6 @@ supported_coq_versions:
opam: '{ (>= "8.17" & < "8.20~") | (= "dev") }'
tested_coq_opam_versions:
-- version: '2.2.0-coq-8.17'
- repo: 'mathcomp/mathcomp'
-- version: '2.2.0-coq-8.18'
- repo: 'mathcomp/mathcomp'
- version: '2.2.0-coq-8.19'
repo: 'mathcomp/mathcomp'
@@ -94,9 +90,9 @@ categories:
- name: Mathematics/Real Calculus and Topology
publications:
-- pub_url: TODO
- pub_title: TODO
- pub_doi: TODO
+- pub_url: https://inria.hal.science/hal-04312815
+ pub_title: Safe Smooth Paths between Straight Line Obstacles
+ pub_doi: https://doi.org/10.1007/978-3-031-61716-4_3
documentation: |-
## Disclaimer
@@ -114,6 +110,9 @@ documentation: |-
https://hal.inria.fr/inria-00503017v2/document
- Theorem of three circles in Coq (2013)
https://arxiv.org/abs/1306.0783
+ - Safe Smooth Paths between straight line obstacles
+ https://inria.hal.science/hal-04312815
+ https://link.springer.com/chapter/10.1007/978-3-031-61716-4_3
## Development information
From ec8991e68cfa618305e54f8fb228ad57087c372a Mon Sep 17 00:00:00 2001
From: Yves Bertot
Date: Mon, 21 Oct 2024 14:16:02 +0200
Subject: [PATCH 39/43] attempt with more notations
---
theories/safe_cells.v | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/theories/safe_cells.v b/theories/safe_cells.v
index d1acd96..f3aaf4b 100644
--- a/theories/safe_cells.v
+++ b/theories/safe_cells.v
@@ -29,7 +29,7 @@ Notation left_pts := (left_pts R edge).
Notation right_pts := (right_pts R edge).
Notation dummy_pt := (dummy_pt R 1).
Notation event := (@event R edge).
-Notation point := (@point R edge).
+Notation point' := (@point R edge).
Notation outgoing := (@point R edge).
Variables closed : seq cell.
@@ -630,6 +630,7 @@ move/hasP=> [e2 e2in /eqP ->].
by apply: (@allP pt _ _ inbox_es); rewrite map_f.
Qed.
+Notation event' := (generic_trajectories.event R edge).
Lemma start_yields_safe_cells evs bottom top (open closed : seq cell):
sorted (fun e1 e2 => p_x (point e1) < p_x (point e2)) evs ->
{in [:: bottom, top &
@@ -643,6 +644,9 @@ Lemma start_yields_safe_cells evs bottom top (open closed : seq cell):
{in closed & events_to_edges evs, forall c g p,
strict_inside_closed p c -> ~~(p === g)}.
Proof.
+set event' := generic_trajectories.event _ _.
+set p_x' := generic_trajectories.p_x R.
+set point' := generic_trajectories.point R edge.
have [ev0 | evsn0] := eqVneq evs [::].
rewrite /start /=; rewrite ev0 /=.
by move=> _ _ _ _ _ _ _ [] _ <-.
From 3b91293244d217ef154c2bf9b3eeafb201d8c6b8 Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Wed, 29 May 2024 16:27:06 +0200
Subject: [PATCH 40/43] last improvements before the talk
---
documents/FHG_slides.tex | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/documents/FHG_slides.tex b/documents/FHG_slides.tex
index c345de6..d9394f2 100644
--- a/documents/FHG_slides.tex
+++ b/documents/FHG_slides.tex
@@ -44,7 +44,7 @@
\item Decompose the space into simple cells
\item Each cell is convex
\item Each cell is free of obstacles
-\item Each cell may have neighbours where moving is safe
+\item Each cell may have safely reachable neighbors
\end{itemize}
\end{frame}
\begin{frame}
@@ -52,7 +52,7 @@
\includegraphics[trim={0 0 0 \topcrop}, clip, width=\textwidth]{cells_spiral.pdf}
\end{frame}
\begin{frame}
-\frametitle{Cell assumptions}
+\frametitle{Cell properties}
\begin{itemize}
\item Vertical edges are safe passages between two cells
\item Moving directly from a left-edge to a right-edge is safe
@@ -79,6 +79,7 @@
\item Easier to associate a distance between pairs of doors
\item Dijkstra shortest path algorithm
\end{itemize}
+\item In the end, a path from door to door
\end{itemize}
\end{frame}
\begin{frame}
@@ -165,7 +166,6 @@
\item Use of semi-closed vertical cells
\item Show disjoint property
\item Show that obstacles are covered by cell tops
-\item This proof is complete
\end{itemize}
\end{frame}
\begin{frame}
From 57b7a677791e15bc63bbd750fde22d39b5ab4f62 Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Mon, 21 Oct 2024 18:52:41 +0200
Subject: [PATCH 41/43] finished proving the common invariant for
update_open_cell
---
theories/cells.v | 11 +
theories/cells_alg.v | 518 ++++++++++++++++++++++++-------
theories/math_comp_complements.v | 20 ++
3 files changed, 441 insertions(+), 108 deletions(-)
diff --git a/theories/cells.v b/theories/cells.v
index 47d1bdd..a376596 100644
--- a/theories/cells.v
+++ b/theories/cells.v
@@ -107,11 +107,22 @@ Definition bottom_left_corner (c : cell) := last dummy_pt (left_pts c).
Definition bottom_left_cells_lex (open : seq cell) p :=
{in open, forall c, lexPt (bottom_left_corner c) p}.
+(* TODO: these should be at the head. *)
Definition left_limit (c : cell) :=
p_x (last dummy_pt (left_pts c)).
Definition right_limit c := p_x (last dummy_pt (right_pts c)).
+Lemma add_point_left_limit (c : cell) (p : pt) :
+ (1 < size (left_pts c))%N ->
+ left_limit (set_left_pts _ _ c
+ (head dummy_pt (left_pts c) :: p :: behead (left_pts c))) =
+ left_limit c.
+Proof.
+rewrite /left_limit.
+by case lptsq : (left_pts c) => [ | p1 [ | p2 ps]].
+Qed.
+
Definition inside_open_cell p c :=
[&& contains_point p c & left_limit c <= p_x p <= open_limit c].
diff --git a/theories/cells_alg.v b/theories/cells_alg.v
index 43c91f9..e91c01c 100644
--- a/theories/cells_alg.v
+++ b/theories/cells_alg.v
@@ -65,9 +65,13 @@ Notation left_pts := (left_pts R edge).
Notation right_pts := (right_pts R edge).
Notation Bcell := (Bcell R edge).
+(* TODO : these should probably be in cell.v *)
Lemma high_set_left_pts (c : cell) l : high (set_left_pts c l) = high c.
Proof. by case: c. Qed.
+Lemma low_set_left_pts (c : cell) l : low (set_left_pts c l) = low c.
+Proof. by case: c. Qed.
+
Definition set_pts := set_pts R edge.
(* This function is to be called only when the event is in the middle
@@ -75,7 +79,7 @@ Definition set_pts := set_pts R edge.
points of one of the newly created open cells, but the one that receives
the first segment of the last opening cells should keep its existing
left points.*)
-Definition update_open_cell :=
+Definition update_open_cell :=
update_open_cell R eq_op le +%R (fun x y => x - y) *%R (fun x y => x / y) 1
edge (@unsafe_Bedge R) (@left_pt R) (@right_pt R).
@@ -125,7 +129,7 @@ Proof.
case: s bottom => [ | c0 s] /= bottom; first by [].
rewrite /cells_bottom_top /cells_low_e_top=> /= /andP[] /eqP lc0 A lowhigh.
rewrite /cell_edges=> g; rewrite mem_cat.
-have main : [seq high c | c <- c0 :: s] =
+have main : [seq high c | c <- c0 :: s] =
rcons [seq low c | c <- s] (high (last c0 s)).
elim: s c0 lowhigh {lc0 A} => [ | c1 s Ih] c0 lowhigh; first by [].
rewrite /=.
@@ -251,7 +255,7 @@ repeat (split; first by []).
by rewrite qeq !mem_cat !map_f ?orbT //; case:(cc1) => [| a b] /=; subset_tac.
Qed.
-Lemma decomposition_connect_properties open_cells p
+Lemma decomposition_connect_properties open_cells p
first_cells contact last_contact last_cells low_f high_f:
s_right_form open_cells ->
seq_valid open_cells p ->
@@ -267,7 +271,7 @@ move=> rfo sval adj cbtom inbox_p oe.
have [w win ctw'] := exists_cell cbtom adj inbox_p.
have [ocd [ctpl [allct [allnct [nctlc [-> [-> _]]]]]]]:=
decomposition_main_properties oe (exists_cell cbtom adj inbox_p).
-have [A B C D E] :=
+have [A B C D E] :=
connect_properties cbtom adj rfo sval inbox_p ocd allnct allct ctpl nctlc.
by split => // c cin; apply/negP/E.
Qed.
@@ -831,8 +835,8 @@ Definition inv1_seq (s : seq cell) :=
Definition invariant1 (s : scan_state) :=
inv1_seq (state_open_seq s).
-Let val_between g (h : valid_edge g (point e)) :=
- valid_between_events elexp plexfut h inbox_p.
+(* Let val_between g (h : valid_edge g (point e)) :=
+ valid_between_events elexp plexfut h inbox_p. *)
#[clearbody]
Let subo : {subset outgoing e <= all_edges open (e :: future_events)}.
@@ -985,7 +989,7 @@ have tls : high (last dummy_cell (rcons cc lcc)) =
high (last dummy_cell (rcons nos nlsto)).
by rewrite !last_rcons.
split.
- move: cbtom';
+ move: cbtom';
rewrite (replacing_seq_cells_bottom_top _ _ _ _ on0 nn0) //.
by rewrite -catA cat_rcons.
rewrite -catA -cat_rcons.
@@ -1146,10 +1150,10 @@ Arguments pt_eqb : simpl never.
Lemma step_keeps_invariant1 :
invariant1 (step (Bscan fop lsto lop cls lstc lsthe lstx) e).
Proof.
-case step_eq : (step _ _) => [fop' lsto' lop' cls' lstc' lsthe' lstx'].
+case step_eq : (step _ _) => [fop' lsto' lop' cls' lstc' lsthe' lstx'].
rewrite /state_open_seq /=; move: step_eq.
rewrite /step/generic_trajectories.step -/open.
-have val_bet := valid_between_events elexp plexfut _ inbox_p.
+(* have val_bet := valid_between_events elexp plexfut _ inbox_p. *)
case: ifP=> [pxaway | /negbFE/eqP/[dup] pxhere /abovelstle palstol].
move: invariant1_default_case.
rewrite -/(open_cells_decomposition _ _).
@@ -1322,7 +1326,7 @@ have claef' : close_alive_edges (fop ++ fc') future_events.
- by apply/andP; apply: (allP svalf).
by apply/negP; rewrite contains_pointE (negbTE (above_h _ cin)) andbF.
apply/allP=> x; rewrite -f_eq => xin.
- by apply: (allP (head_not_end claef f_not_end)).
+ by apply: (allP (head_not_end claef f_not_end)).
have clael : close_alive_edges lc (e :: future_events).
by apply/allP=> x xin; apply: (allP clae); rewrite /open ocd; subset_tac.
have clael' : close_alive_edges lc future_events.
@@ -1483,9 +1487,9 @@ Lemma new_edges_above_first_old fc cc lcc lc le:
point e >>> le ->
point e <<< high lcc ->
valid_edge le (point e) ->
- allrel (@edge_below _)
+ allrel (@edge_below _)
[seq high c | c <- fc]
- [seq high c | c <-
+ [seq high c | c <-
opening_cells (point e) (outgoing e) le (high lcc)].
Proof.
move=> ocd.
@@ -1530,8 +1534,8 @@ Lemma new_edges_below_last_old fc cc lcc lc le:
point e >>= le ->
point e <<< high lcc ->
valid_edge le (point e) ->
- allrel (@edge_below _)
- [seq high c | c <-
+ allrel (@edge_below _)
+ [seq high c | c <-
opening_cells (point e) (outgoing e) le (high lcc)]
[seq high c | c <- lc].
Proof.
@@ -1564,10 +1568,10 @@ Qed.
Lemma step_keeps_pw_default :
let '(fc, cc, lcc, lc, le, he) :=
open_cells_decomposition open (point e) in
- let '(nos, lno) :=
+ let '(nos, lno) :=
opening_cells_aux (point e)
(sort (@edge_below _) (outgoing e)) le he in
- pairwise (@edge_below _)
+ pairwise (@edge_below _)
(bottom :: [seq high x | x <- fc ++ nos ++ lno :: lc]).
Proof.
case oe: (open_cells_decomposition open (point e)) =>
@@ -1588,7 +1592,7 @@ rewrite /=; apply/andP; split.
rewrite map_rcons all_rcons.
have := opening_cells_aux_high_last vle vhe oute'; rewrite oca_eq /= => ->.
have -> /= : bottom <| he.
- have lcco : lcc \in open by rewrite ocd !mem_cat inE eqxx !orbT.
+ have lcco : lcc \in open by rewrite ocd !mem_cat inE eqxx !orbT.
rewrite heq.
move: pwo=> /= /andP[] /allP /(_ (high lcc)) + _; rewrite map_f //.
by apply.
@@ -2086,7 +2090,7 @@ split.
have [/eqP c1c2 | c1nc2] := boolP(c1' == c2').
by left; rewrite c1eq c2eq c1c2.
right=> q; apply/negP=> /andP[inc1 inc2].
- case: (disjoint_open c1'open c2'open)=> [/eqP | /(_ q)].
+ case: (disjoint_open c1'open c2'open)=> [/eqP | /(_ q)].
by rewrite (negbTE c1nc2).
move=> /negP[].
rewrite c1eq in inc1; rewrite c2eq in inc2.
@@ -2132,7 +2136,7 @@ rewrite (cell_edges_sub_high cbtom adj) inE=> /orP[/eqP -> | /pwo' //].
by apply: edge_below_refl.
Qed.
-Definition state_closed_seq (s : scan_state) :=
+Definition state_closed_seq (s : scan_state) :=
rcons (sc_closed s) (lst_closed s).
Lemma adjacent_update_open_cell new_op new_lsto:
@@ -2245,11 +2249,11 @@ rewrite -/(opening_cells_aux _ _ _ _).
by case oca_eq : (opening_cells_aux _ _ _ _) => [[ | ? ?] ?] + [] <- <- /=.
Qed.
-Lemma update_open_cell_valid c nos lno :
+(* Lemma update_open_cell_valid c nos lno :
valid_edge (low c) (point e) ->
valid_edge (high c) (point e) ->
update_open_cell c e = (nos, lno) ->
- seq_valid (rcons nos lno) p =
+ seq_valid (rcons nos lno) p =
seq_valid (opening_cells (point e) (outgoing e) (low c) (high c)) p.
Proof.
move=> vlc vhc; rewrite /update_open_cell/generic_trajectories.update_open_cell.
@@ -2263,7 +2267,7 @@ have := opening_cells_aux_absurd_case vlc vhc onn oute; rewrite ogeq.
rewrite -/(opening_cells_aux _ _ _ _).
by case oca_eq : (opening_cells_aux _ _ _ _) => [[ | ? ?] ?] + [] <- <- /=.
Qed.
-
+*)
Lemma lex_left_pts_inf' :
let '(fc, _, _, lc, le, he) :=
open_cells_decomposition open (point e) in
@@ -2310,7 +2314,7 @@ Lemma step_keeps_btom_left_corners_default q :
opening_cells_aux (point e) (sort (@edge_below _) (outgoing e)) le he in
{in fc ++ nos ++ lno :: lc, forall c, lexPt (bottom_left_corner c) q}.
Proof.
-move=> lexq.
+move=> lexq.
case oe : (open_cells_decomposition _ _) => [[[[[fc cc] lcc] lc] le] he].
case oca_eq: (opening_cells_aux _ _ _ _) => [nos lno].
have := lex_left_pts_inf'; rewrite oe oca_eq => main.
@@ -2463,6 +2467,57 @@ rewrite /set_right_pts /=.
by rewrite /set_right_pts /= => <- //.
Qed.
+Definition update_pts_head (l : seq pt) (p : pt) :=
+ p :: behead l.
+
+Definition update_pts_single (l : seq pt) (p : pt) :=
+ head dummy_pt l :: p :: behead l.
+
+Lemma update_open_cell_outgoing_empty c (lo : seq cell * cell) :
+ valid_edge (low c) (point e) ->
+ valid_edge (high c) (point e) ->
+ open_cell_side_limit_ok c ->
+ p_x (point e) = left_limit c ->
+ (1 < size (left_pts c))%N ->
+ point e >>> low c ->
+ point e <<< high c ->
+outgoing e = [::] ->
+ update_open_cell c e =
+ ([::], set_left_pts
+ c (update_pts_single (left_pts c) (point e))).
+Proof.
+intros vl vh okc xq lptsgt pal puh ogq.
+by rewrite /update_open_cell/generic_trajectories.update_open_cell ogq.
+Qed.
+
+Lemma update_open_cell_tail c (lo : seq cell * cell) :
+ valid_edge (low c) (point e) ->
+ valid_edge (high c) (point e) ->
+ open_cell_side_limit_ok c ->
+ p_x (point e) = left_limit c ->
+ (1 < size (left_pts c))%N ->
+ point e >>> low c ->
+ point e <<< high c ->
+ outgoing e != [::] ->
+ behead (rcons (update_open_cell c e).1
+ (update_open_cell c e).2) =
+ behead (opening_cells (point e) (outgoing e) (low c) (high c)).
+Proof.
+move=> vl vh cok at_x lgt1 pal puh on0.
+rewrite /update_open_cell/generic_trajectories.update_open_cell.
+case ogq : (outgoing e) => [ | fog ogs]; first by rewrite ogq in on0.
+case oca_eq : generic_trajectories.opening_cells_aux => [nos lno].
+have son0 : (fog :: ogs) != [::] by [].
+have oute2 : {in fog :: ogs,
+ forall g, left_pt g == point e}.
+ by rewrite -ogq.
+have := opening_cells_aux_absurd_case vl vh son0 oute2.
+rewrite /opening_cells_aux oca_eq /=.
+case nosq : nos => [ | fno nos']; first by [].
+move=> _ /=.
+by rewrite /opening_cells/opening_cells_aux oca_eq nosq.
+Qed.
+
Lemma update_open_cellE1 c c1 :
valid_edge (low c) (point e) ->
valid_edge (high c) (point e) ->
@@ -2472,7 +2527,7 @@ Lemma update_open_cellE1 c c1 :
point e >>> low c ->
point e <<< high c ->
c1 \in (update_open_cell c e).1 ->
- exists2 c', c' \in (opening_cells_aux (point e)
+ exists2 c', c' \in (opening_cells_aux (point e)
(sort (@edge_below _) (outgoing e)) (low c)
(high c)).1 &
c1 = c' \/
@@ -2624,8 +2679,8 @@ case: ifP => [ebelow_st {ebelow} | eonlsthe].
have lstcin : lstc \in rcons cls lstc by rewrite mem_rcons inE eqxx.
have in' c : c \in cls -> c \in rcons cls lstc.
by move=> cin; rewrite mem_rcons inE cin orbT.
- have main c1 q:
- c_disjoint c1 lstc ->
+ have main c1 q:
+ c_disjoint c1 lstc ->
c_disjoint c1 (update_closed_cell lstc q).
by move=> /[swap] q1 /(_ q1); rewrite -inside_closed'_update.
move=> c1 c2; rewrite !mem_rcons !inE !(orbC _ (_ \in cls)).
@@ -2636,7 +2691,7 @@ case: ifP => [ebelow_st {ebelow} | eonlsthe].
apply: c_disjoint_eC; right; apply: main.
case: (disjoint_closed (in' _ c2in) lstcin)=> //.
by move: lstcn=> /[swap] <-; rewrite c2in.
- have main c :
+ have main c :
oc_disjoint c lstc ->
oc_disjoint c (update_closed_cell lstc (point e)).
by rewrite /oc_disjoint=> /[swap] q /(_ q); rewrite -inside_closed'_update.
@@ -2651,7 +2706,7 @@ case: ifP => [ebelow_st {ebelow} | eonlsthe].
rewrite uoc_eq /=.
have := update_open_cellE2 vlo vho lstok pxo slpts palstol puh.
rewrite uoc_eq /=.
- rewrite oe.
+ rewrite oe.
case oca_eq : (opening_cells_aux _ _ _ _) => [nos' lno'] /= helper2 helper1.
move=> [] _ helper3.
move=> c1 c2 c1in; rewrite mem_rcons inE => /orP[/eqP -> | ].
@@ -2670,7 +2725,7 @@ case: ifP => [ebelow_st {ebelow} | eonlsthe].
rewrite inE=> /orP[/eqP -> | ].
case: helper2=> [ -> | -> ].
by apply: helper3; rewrite !mem_cat ?mem_rcons !inE !eqxx ?orbT.
- set W := (set_left_pts _ _).
+ set W := (set_left_pts _ _).
move=> q.
suff -> : inside_open' q W = inside_open' q lsto.
by apply: disjoint_open_closed;
@@ -2686,7 +2741,7 @@ case: ifP => [ebelow_st {ebelow} | eonlsthe].
by apply: disjoint_open_closed;
rewrite ?mem_cat ?mem_rcons ?inE ?c1f ?eqxx ?c2in ?orbT.
move=> /orP[/helper1 [c1' c1no'] |].
- move=> [-> | [l lq -> q] ].
+ move=> [-> | [l lq -> q] ].
by apply: helper3; rewrite !(mem_rcons, mem_cat, inE) ?c1no' ?c2in ?orbT.
suff -> : inside_open' q (set_left_pts c1' l) = inside_open' q c1'.
by apply: helper3;
@@ -2695,7 +2750,7 @@ case: ifP => [ebelow_st {ebelow} | eonlsthe].
rewrite inE=> /orP[/eqP -> | ].
move: helper2=> [-> | ->].
by apply: helper3; rewrite !(mem_cat, mem_rcons, inE) ?eqxx ?c2in ?orbT.
- set W := (set_left_pts _ _).
+ set W := (set_left_pts _ _).
move=> q.
suff -> : inside_open' q W = inside_open' q lsto.
by apply: disjoint_open_closed;
@@ -2739,7 +2794,7 @@ case ogq : (outgoing e) => [ | fog og]; last first.
rewrite /state_open_seq /state_closed_seq /=.
have := step_keeps_disjoint_default'; rewrite oe' ogq lelow oca_eq /=.
move=> [] clsdisj ocdisj.
- split.
+ split.
move=> x y xin yin; apply: clsdisj.
move: xin; rewrite !(mem_rcons, inE, mem_cat).
move=>/orP[-> | /orP[ | /orP[ ->| ->]]]; rewrite ?orbT //.
@@ -2851,6 +2906,19 @@ apply/eqP; apply: same_pvert_y; first by case/andP: one.
by rewrite pxhere sx.
Qed.
+Lemma opening_cells_subset' p' (le he : edge) (s sup : seq edge) :
+ le \in sup -> he \in sup -> {subset s <= sup} ->
+ valid_edge le p' -> valid_edge he p' ->
+ {in s, forall g, left_pt g == p'} ->
+ {subset cell_edges (opening_cells p' s le he) <= sup}.
+Proof.
+move=> lein hein ssub vl vh outp' /= g.
+have ocs := opening_cells_subset vl vh outp'.
+rewrite mem_cat=> /orP[] /mapP [/= c /[swap] + /ocs +] => <-.
+ by move=> /andP[] + _; rewrite inE=> /orP[/eqP -> // | ]; apply: ssub.
+by move=> /andP[] _; rewrite inE=> /orP[/eqP -> // | ]; apply: ssub.
+Qed.
+
Lemma step_keeps_injective_high_default :
let '(fc, cc, lcc, lc, le, he) :=
open_cells_decomposition open (point e) in
@@ -2940,7 +3008,7 @@ rewrite /= => /andP[].
case: ifP => [/eqP -> | _ _ /Ih -> //].
by rewrite mem_cat inE eqxx orbT.
Qed.
-
+
Lemma index_map_in (T1 T2 : eqType) (f : T1 -> T2) (s : seq T1) :
{in s &, injective f} ->
{in s, forall x, index (f x) [seq f i | i <- s] = index x s}.
@@ -3002,7 +3070,7 @@ have : nth (high dummy_cell) [seq high c | c <- l2'] j1 = high x1.
by rewrite (nth_map dummy_cell) // j1q.
have : nth (high dummy_cell) [seq high c | c <- l2'] j2 = high x1.
by rewrite hx1x2 (nth_map dummy_cell) // j2q.
-move=> <-; rewrite -eqh.
+move=> <-; rewrite -eqh.
move: uh=> /uniqP => /(_ dummy_edge); rewrite [X in size X]eqh size_map.
move=> /(_ j1 j2); rewrite !inE => /(_ j1lt j2lt) /[apply].
by rewrite -j1q -j2q => ->.
@@ -3010,7 +3078,7 @@ Qed.
Lemma step_keeps_uniq_default fc cc lcc lc le he nos lno:
open_cells_decomposition open (point e) = (fc, cc, lcc, lc, le, he) ->
- opening_cells_aux (point e)
+ opening_cells_aux (point e)
(sort (@edge_below _) (outgoing e)) le he = (nos, lno) ->
uniq (fc ++ nos ++ lno :: lc).
Proof.
@@ -3504,7 +3572,7 @@ Lemma opening_cells_aux_cover_outgoing le he nos lno:
valid_edge le (point e) ->
opening_cells_aux (point e) (sort (@edge_below _) (outgoing e)) le he =
(nos, lno) ->
- {in (outgoing e), forall g,
+ {in (outgoing e), forall g,
exists c, c \in nos /\ high c = g /\ left_limit c = p_x (left_pt g)}.
Proof.
move=> + + g go.
@@ -3559,8 +3627,8 @@ move=> g [go | gn]; last first.
split; first by [].
split; last by [].
by rewrite !mem_cat cin !orbT.
-case: go => [[opc [pcc [pccsub opcP]]] |
- [ pcc [pccn0 [pccsub pccP]]]]; last first.
+case: go => [[opc [pcc [pccsub opcP]]] |
+ [ pcc [pccn0 [pccsub pccP]]]]; last first.
right; exists pcc.
split;[exact pccn0 | split; [ | exact pccP]].
by move=> g1 /pccsub; rewrite mem_cat=> ->.
@@ -3691,7 +3759,7 @@ rewrite !mem_cat !inE=> /orP[ -> | /orP [ | -> ]]; rewrite ?orbT //.
by move: cnopc=> /[swap]; rewrite eq_sym=> ->.
Qed.
-Lemma update_closed_cell_keep_left_limit c pt :
+Lemma update_closed_cell_keep_left_limit c pt :
left_limit (update_closed_cell c pt) = left_limit c.
Proof. by move: c => [? ? ? ?]. Qed.
@@ -3703,7 +3771,7 @@ move=> ll rr; elim: l => [ | a [ | b l] Ih] /=; first by [].
by case: ifP.
move=> /[dup] conn /andP[ab conn'].
have conn0 : path (fun c1 c2 => right_limit c1 == left_limit c2) a (b :: l).
- by exact: conn.
+ by exact: conn.
have /Ih : sorted (fun c1 c2 => right_limit c1 == left_limit c2) (b :: l).
by apply: (path_sorted conn0).
case: ifP=> [/eqP ac | anc].
@@ -3750,7 +3818,7 @@ case: ecg => [[oc [pcc [ocP1 [hP [cP [ocin conn]]]]]] | ].
rewrite /=; case: ifP=> [ac | anc].
rewrite inE=> /orP[/eqP -> | ]; last by [].
have: high c = g by apply: hP; rewrite inE eq_sym ac.
- by case: (c).
+ by case: (c).
rewrite inE=> /orP[/eqP -> | ]; last by [].
by apply: hP; rewrite inE eqxx.
split.
@@ -4047,7 +4115,7 @@ rewrite ccq inE -orbA => /orP[/eqP oclsto | ].
right; exists pcc.
split.
by rewrite pccq.
- split.
+ split.
move=> x /P1; rewrite !(mem_rcons, mem_cat, inE).
by move=> /orP[] -> ; rewrite ?orbT.
split.
@@ -4086,7 +4154,7 @@ rewrite ccq inE -orbA => /orP[/eqP oclsto | ].
rewrite -ogq.
rewrite -/(opening_cells_aux _ _ _ _).
case oca_eq: opening_cells_aux => [ [ | fno nos'] lno'] [] _ <-;
- have := opening_cells_left oute vlo vhe;
+ have := opening_cells_left oute vlo vhe;
rewrite /opening_cells oca_eq=> /(_ lno');
by rewrite mem_rcons inE eqxx=> /(_ isT).
have vlcc : valid_cell lcc (point e).
@@ -4110,7 +4178,7 @@ rewrite ccq inE -orbA => /orP[/eqP oclsto | ].
move: P3; rewrite pccq connect_limits_rcons // => /andP[] -> /=.
move=> /eqP ->; rewrite /left_limit (eqP oclcc).
by have [_ _ ->] := close_cell_preserve_3sides (point e) lcc.
- split; first by rewrite !mem_cat inE eqxx !orbT.
+ split; first by rewrite !mem_cat inE eqxx !orbT.
rewrite /head_cell !head_rcons.
move: P5; rewrite (eqP oclcc) => <-.
case: (pcc) => [ /= | ? ?]; last by [].
@@ -4180,7 +4248,7 @@ rewrite map_rcons=> -> g'; rewrite !mem_rcons !inE mem_sort; congr (_ || _).
by have := opening_cells_aux_high_last vl vp oute'; rewrite oca_eq /= => ->.
Qed.
-Lemma step_keeps_subset :
+Lemma step_keeps_subset :
let s' := step (Bscan fop lsto lop cls lstc lsthe lstx) e in
{subset [seq high c | c <- state_open_seq s'] <=
[seq high c | c <- open] ++ outgoing e}.
@@ -4294,10 +4362,10 @@ Lemma step_keeps_left_limit_has_right_limit_default :
open_cells_decomposition open (point e) in
let '(nos, lno) := opening_cells_aux (point e)
(sort (@edge_below _) (outgoing e)) le he in
- {in fc ++ nos ++ lno :: lc,
+ {in fc ++ nos ++ lno :: lc,
forall c p, inside_box p -> left_limit c = p_x p ->
contains_point' p c ->
- has (inside_closed' p)
+ has (inside_closed' p)
(cls ++ lstc :: rcons (closing_cells (point e) cc)
(close_cell (point e) lcc))}.
Proof.
@@ -4313,7 +4381,7 @@ remember (fc ++ nos ++ lno :: lc) as open' eqn:openeq.
remember (cls ++ lstc :: rcons (closing_cells (point e) cc)
(close_cell (point e) lcc)) as closed' eqn:closeeq.
have := invariant1_default_case.
- rewrite oe oca_eq => - [] clae' [] sval' [] adj' []cbtom' rfo'.
+ rewrite oe oca_eq => - [] clae' [] sval' [] adj' []cbtom' rfo'.
move=> c cin pt' inboxp lbnd pin.
move: cin; rewrite openeq -cat_rcons !mem_cat orbCA orbC=> /orP[cold | cnew].
rewrite closeeq -cat_rcons has_cat; apply/orP; left.
@@ -4340,7 +4408,7 @@ have highnew : [seq high i | i <- opening_cells (point e)(outgoing e) le he]=
rcons (sort (@edge_below _) (outgoing e)) he.
by rewrite (opening_cells_high vl vp).
have allval : all (fun g => valid_edge g pt')
- (head dummy_edge [seq low i | i <- opening_cells (point e)
+ (head dummy_edge [seq low i | i <- opening_cells (point e)
(outgoing e) le he] ::
[seq high i | i <- opening_cells (point e) (outgoing e) le he]).
apply/allP=> x; rewrite inE=> xin.
@@ -4522,7 +4590,7 @@ remember (fc ++ nos ++ lno :: lc) as open' eqn:openeq.
remember (cls ++ lstc :: rcons (closing_cells (point e) cc)
(close_cell (point e) lcc)) as closed' eqn:closeeq.
have := invariant1_default_case.
-rewrite oe oca_eq => - [] clae' [] sval' [] adj' []cbtom' rfo'.
+rewrite oe oca_eq => - [] clae' [] sval' [] adj' []cbtom' rfo'.
have := step_keeps_left_limit_has_right_limit_default.
have := step_keeps_btom_left_corners_default.
rewrite oe oca_eq -openeq.
@@ -4686,7 +4754,7 @@ move=> /orP[/hasP[opc opcin qinopc] | keptopen].
apply/orP; right; apply/hasP.
by exists it=> //; rewrite closeeq !(inE, mem_cat, mem_rcons) it1 ?orbT.
apply/orP; right; apply/hasP; exists (close_cell (point e) lcc).
- by rewrite closeeq !(mem_cat, inE, mem_rcons) eqxx ?orbT.
+ by rewrite closeeq !(mem_cat, inE, mem_rcons) eqxx ?orbT.
by apply: inclosel; rewrite -(eqP opclcc).
apply/orP; left; apply/hasP.
move: keptopen; rewrite -has_cat=>/hasP[it + it2].
@@ -4698,7 +4766,7 @@ Lemma step_keeps_right_limit_closed_default :
open_cells_decomposition open (point e) in
let '(nos, lno) := opening_cells_aux (point e)
(sort (@edge_below _) (outgoing e)) le he in
- {in rcons(cls ++
+ {in rcons(cls ++
lstc :: closing_cells (point e) cc) (close_cell (point e) lcc) &
future_events, forall c e, right_limit c <= p_x (point e)}.
Proof.
@@ -4968,14 +5036,14 @@ have [pal puh vle vhe nc]:=
(inside_box_between inbox_e) oe.
have [ogq | ogq] := eqVneq (outgoing e) [::].
rewrite (single_opening_cell_side_char pp vle vhe pal puh ogq).
- case ccq : cc => [ | cc1 cc'].
+ case ccq : cc => [ | cc1 cc'].
move: (oe); rewrite ccq=> oe'.
by rewrite /= (single_closing_side_char pp oe') orbF.
move: (oe); rewrite ccq=> oe'.
rewrite /= has_rcons.
rewrite (first_closing_side_char pp oe').
rewrite (negbTE (middle_closing_side_char _ oe')) orbF.
- rewrite (last_closing_side_char pp oe'); last by [].
+ rewrite (last_closing_side_char pp oe'); last by [].
by rewrite (andbC (pp >>> le)) (andbC (pp <<< he)).
rewrite /opening_cells; case oca_eq : (opening_cells_aux _ _ _ _) => [nos lno].
have oeq : opening_cells (point e) (outgoing e) le he = rcons nos lno.
@@ -4988,15 +5056,15 @@ rewrite (first_opening_cells_side_char pp ogq vle vhe pal oute oeq).
rewrite [in X in _ == X]has_rcons.
rewrite (last_opening_cells_side_char pp ogq vle vhe puh oute oeq).
rewrite (negbTE (middle_opening_cells_side_char pp ogq vle vhe oute oeq)) orbF.
-case ccq : cc => [ | cc1 cc'].
+case ccq : cc => [ | cc1 cc'].
move: (oe); rewrite ccq=> oe'.
rewrite /= (single_closing_side_char pp oe') orbF.
by rewrite (andbC (_ >>> _)) (andbC (_ <<< _)).
move: (oe); rewrite ccq=> oe'.
-rewrite /= has_rcons.
+rewrite /= has_rcons.
rewrite (first_closing_side_char pp oe').
rewrite (negbTE (middle_closing_side_char _ oe')) orbF.
-by rewrite (last_closing_side_char pp oe'); last by [].
+by rewrite (last_closing_side_char pp oe'); last by [].
Qed.
End step.
@@ -5044,7 +5112,7 @@ Record common_general_position_invariant bottom top edge_set s
Record common_non_gp_invariant bottom top edge_set s (events : seq event') :=
{ ngcomm : common_invariant bottom top edge_set s events;
- lst_side_lex :
+ lst_side_lex :
(1 < size (left_pts (lst_open s)))%N &&
path (@lexPt _) (nth dummy_pt (left_pts (lst_open s)) 1)
[seq point e | e <- events]}.
@@ -5188,7 +5256,7 @@ have :=
initial_intermediate boxwf startok nocs' evin lexev evsub out_evs cle evsn0.
case evsq : events evsn0 => [ | ev future_events]; [by [] | move=> _].
move=> [op0sok [cbtom0 [adj0 /=
- [sval0 [rf0 [inbox0 [cle0 [oute0 [clae0 [vb
+ [sval0 [rf0 [inbox0 [cle0 [oute0 [clae0 [vb
[vt [oe [nocs [noc0 [pw0 lexev0]]]]]]]]]]]]]]].
have evins : ev \in events by rewrite evsq inE eqxx.
set op0 := start_open_cell bottom top.
@@ -5295,7 +5363,7 @@ move=> vle vhe; elim: gs le vle nos lno=>
case: ifP=> [/eqP abs2 | dif2 //]; last first.
by move=> [] _ <- /=.
by move=> [] _ <- /=; split; [ | rewrite -abs2].
- move=> [] _.
+ move=> [] _.
rewrite (strict_under_pvert_y vhe) ltNge in puh.
move: puh => /negP; case.
by rewrite on_pvert // -abs1 pvert_on.
@@ -5389,7 +5457,7 @@ have := initial_intermediate boxwf startok nocs' evin lexev evsub
out_evs cle evsn0.
move: evsn0; case evsq : events => [ | ev evs];[by [] | move=> _].
lazy zeta; rewrite [head _ _]/= [behead _]/=.
-move=> -[] op0sok [cbtom0 [adj0 [sval0 [rf0 [inbox0
+move=> -[] op0sok [cbtom0 [adj0 [sval0 [rf0 [inbox0
[cle0 [oute0 [clae0 [vb [vt [oe [nocs [noc0 [pw0 lexev0]]]]]]]]]]]]]].
have evins : ev \in events by rewrite evsq inE eqxx.
rewrite /initial_state /state_open_seq/state_closed_seq/= => Cinv.
@@ -5414,7 +5482,7 @@ have pw1 : pairwise (@edge_below _)
by rewrite oe oca_eq.
have rl_closed1 : {in [:: close_cell (point ev) op0] & evs,
forall c e, right_limit c <= p_x (point e)}.
- have vho : valid_edge (high op0) (point ev) by [].
+ have vho : valid_edge (high op0) (point ev) by [].
have vlo : valid_edge (low op0) (point ev) by [].
have := right_limit_close_cell vlo vho=> rlcl0 c e.
rewrite inE=> /eqP ->.
@@ -5425,7 +5493,7 @@ have rl_closed1 : {in [:: close_cell (point ev) op0] & evs,
by constructor.
Qed.
-Lemma simple_step_common_general_position_invariant
+Lemma simple_step_common_invariant
bottom top s fop lsto lop fc cc lcc lc le he cls lstc ev
lsthe lstx evs :
bottom <| top ->
@@ -5434,18 +5502,18 @@ Lemma simple_step_common_general_position_invariant
inside_box bottom top (right_pt g)} ->
open_cells_decomposition (fop ++ lsto :: lop) (point ev) =
(fc, cc, lcc, lc, le, he) ->
- common_general_position_invariant bottom top s
+ common_invariant bottom top s
(Bscan fop lsto lop cls lstc lsthe lstx)
(ev :: evs) ->
- common_general_position_invariant bottom top s
+ common_invariant bottom top s
(simple_step fc cc lc lcc le he cls lstc ev)
evs.
Proof.
move=> boxwf nocs' inbox_s oe.
-move=> [] []; rewrite /state_open_seq/state_closed_seq/=.
-move=> inv lstxq lstheq sub_edges cle out_es /[dup] inbox0.
+move=> []; rewrite /state_open_seq/state_closed_seq/=.
+move=> inv lstxq lstheq sub_edges cle out_es /[dup] inbox0.
move=> /andP[] inbox_e inbox_es.
-move=> lexev oks /andP[] lstxlt ltev'.
+move=> lexev oks.
move: (inv)=> [] clae [] []; first by [].
move=> sval [] adj [] cbtom rfo.
have oute : out_left_event ev.
@@ -5475,7 +5543,7 @@ have [{}pal {}puh vl vp nc]:=
have /esym left_last : left_limit lno = p_x (point ev).
apply: (opening_cells_left oute vl vp).
by rewrite /opening_cells oca_eq mem_rcons inE eqxx.
-have heqo : high lno = he.
+have heqo : high lno = he.
by have := opening_cells_aux_high_last vl vp oute'; rewrite oca_eq.
have sub_edges' : {subset all_edges ((fc ++ nos) ++ lno :: lc) evs <=
[:: bottom, top & s]}.
@@ -5485,7 +5553,7 @@ have sub_edges' : {subset all_edges ((fc ++ nos) ++ lno :: lc) evs <=
apply: sub_edges; rewrite mem_cat; apply/orP; right.
by rewrite events_to_edges_cons mem_cat gin orbT.
rewrite (cell_edges_sub_high cbtom' adj') inE=> /orP[/eqP -> | /main].
- by rewrite inE eqxx.
+ by rewrite inE eqxx.
rewrite mem_cat=> /orP[] gin; apply: sub_edges; last first.
by rewrite mem_cat events_to_edges_cons orbC mem_cat gin.
by rewrite mem_cat mem_cat gin orbT.
@@ -5497,13 +5565,247 @@ have oks' : all open_cell_side_limit_ok ((fc ++ nos) ++ lno :: lc).
have := step_keeps_open_side_limit_default inbox0 oute rfo
cbtom adj sval oks; rewrite oe oca_eq.
by [].
-have ltev1 : all (fun e => p_x (point ev) < p_x (point e)) evs &&
+by constructor.
+Qed.
+
+Lemma simple_step_common_general_position_invariant
+ bottom top s fop lsto lop fc cc lcc lc le he cls lstc ev
+ lsthe lstx evs :
+ bottom <| top ->
+ {in bottom :: top :: s &, forall e1 e2, inter_at_ext e1 e2} ->
+ {in s, forall g, inside_box bottom top (left_pt g) &&
+ inside_box bottom top (right_pt g)} ->
+ open_cells_decomposition (fop ++ lsto :: lop) (point ev) =
+ (fc, cc, lcc, lc, le, he) ->
+ common_general_position_invariant bottom top s
+ (Bscan fop lsto lop cls lstc lsthe lstx)
+ (ev :: evs) ->
+ common_general_position_invariant bottom top s
+ (simple_step fc cc lc lcc le he cls lstc ev)
+ evs.
+Proof.
+move=> boxwf nocs' inbox_s oe.
+move=> [] comi /andP[] lstxlt ltev'.
+have comi' := (simple_step_common_invariant boxwf nocs' inbox_s oe comi).
+have ltev1 : all (fun e =>
+ lst_x _ _ (simple_step fc cc lc lcc le he cls lstc ev) <
+ p_x (point e)) evs &&
sorted (fun e1 e2 => p_x (point e1) < p_x (point e2)) evs.
- move: ltev'; rewrite path_sortedE //.
+ rewrite (lstx_eq comi').
+ have oute : out_left_event ev by apply: (out_events comi); rewrite inE eqxx.
+ have [_ [sval' [adj [cbtom rfo]]]] := inv1 comi.
+ have /= /andP[inbox_e inbox_es] := inbox_events comi.
+ have sval : seq_valid
+ (state_open_seq (Bscan fop lsto lop cls lstc lsthe lstx))
+ (point ev).
+ by case sval'; first done.
+ have [{}pal {}puh vl vp nc]:=
+ decomposition_connect_properties rfo sval adj cbtom
+ (inside_box_between inbox_e) oe.
+ have := opening_cells_left oute vl vp.
+ rewrite /opening_cells/simple_step/generic_trajectories.simple_step.
+ rewrite -/(opening_cells_aux (point ev) (sort (@edge_below _) (outgoing ev))
+ le he).
+ case oca_eq : opening_cells_aux => [nos lno] /=.
+ have lnoin : lno \in rcons nos lno by rewrite mem_rcons inE eqxx.
+ move => /(_ _ lnoin) ->.
+ move: ltev'; rewrite /= path_sortedE //.
by move=> x y z; apply: lt_trans.
by constructor.
Qed.
+Lemma update_open_cell_common_invariant
+ bottom top s fop lsto lop cls lstc ev
+ lsthe lstx evs :
+ bottom <| top ->
+ {in bottom :: top :: s &, forall e1 e2, inter_at_ext e1 e2} ->
+ {in s, forall g, inside_box bottom top (left_pt g) &&
+ inside_box bottom top (right_pt g)} ->
+ lstx = p_x (point ev) ->
+ (point ev) <<< lsthe ->
+ common_non_gp_invariant bottom top s
+ (Bscan fop lsto lop cls lstc lsthe lstx)
+ (ev :: evs) ->
+ common_invariant bottom top s
+ (step (Bscan fop lsto lop cls lstc lsthe lstx) ev)
+ evs.
+Proof.
+move=> bxwf nocs' inbox_s at_lstx under_lsthe comng.
+have comi := ngcomm comng.
+rewrite /step/generic_trajectories.step.
+rewrite /same_x at_lstx eqxx /=.
+rewrite -/(point_under_edge _ _) underW /=; last by [].
+rewrite -/(point ev <<< lsthe) under_lsthe.
+have oute : out_left_event ev.
+ by apply: (out_events comi); rewrite inE eqxx.
+have oute' : {in sort (@edge_below _) (outgoing ev),
+ forall g, left_pt g == point ev}.
+ by move=> g; rewrite mem_sort; apply: oute.
+have [clae [sval' [adj [cbtom rfo]]]] := inv1 comi.
+have sval : seq_valid (state_open_seq (Bscan fop lsto lop cls lstc lsthe lstx))
+ (point ev).
+ by case: sval'.
+have lstx_ll : lstx = left_limit lsto.
+ rewrite -[lstx]/(lst_x _ _ (Bscan fop lsto lop cls lstc lsthe lstx)).
+ by rewrite (lstx_eq comi).
+have pal : (point ev) >>> low lsto.
+ have := lst_side_lex comng.
+ set W := (X in size X); rewrite -/W.
+ have : open_cell_side_limit_ok lsto.
+ by apply: (allP (sides_ok comi)); rewrite mem_cat inE eqxx orbT.
+ rewrite /open_cell_side_limit_ok => /andP[] _ /andP[] + /andP[] + /andP[].
+ move=> + + _ +.
+ rewrite -/W.
+ case wq : W => [ | p1 [ | p2 ps]] //= A /andP[] _ higherps + /andP[] ll _.
+ move: A => /andP[] _ /andP[] p2x allx.
+ have lx : p_x (last p2 ps) == left_limit lsto.
+ case : (ps) allx => [ | p3 pst] // /allP; apply=> /=.
+ by rewrite mem_last.
+ have samex : p_x (point ev) = p_x (last p2 ps).
+ by rewrite -at_lstx lstx_ll (eqP lx).
+ have cmpy : p_y (last p2 ps) <= p_y p2.
+ case psq : ps => [ | p3 pst] //.
+ apply ltW.
+ rewrite (path_sortedE (rev_trans lt_trans)) psq in higherps.
+ move: higherps=> /andP[] /allP /(_ (p_y (last p3 pst))) + _.
+ rewrite map_f; last by rewrite mem_last.
+ by move=> /(_ isT).
+ move=> /(under_edge_lower_y samex) ->.
+ rewrite -ltNge.
+ apply: (le_lt_trans cmpy).
+ move: ll; rewrite /lexPt.
+ by rewrite lt_neqAle samex (eqP p2x) eq_sym lx /=.
+have abovelow : p_x (point ev) = lstx -> (point ev) >>> low lsto by [].
+have noc : {in all_edges (fop ++ lsto :: lop) (ev :: evs) &,
+ no_crossing R}.
+ apply: inter_at_ext_no_crossing.
+ by apply: (sub_in2 (edges_sub comi) nocs').
+have lstoin : lsto \in (fop ++ lsto :: lop).
+ by rewrite mem_cat inE eqxx orbT.
+have sok : open_cell_side_limit_ok lsto.
+ by apply: (allP (sides_ok comi)); exact: lstoin.
+have xev_llo : p_x (point ev) = left_limit lsto.
+ by rewrite -at_lstx -(lstx_eq comi).
+have puho : point ev <<< high lsto.
+ move: under_lsthe.
+ rewrite -[lsthe]/(lst_high _ _ (Bscan fop lsto lop cls lstc lsthe lstx)).
+ by rewrite -(high_lsto_eq comi).
+have [vl vh] := (andP (allP sval lsto lstoin)).
+have sll : (1 < size (left_pts lsto))%N.
+ by apply: (size_left_lsto sval lstx_ll (sides_ok comi) (esym at_lstx) pal
+ (underW puho)).
+have ogsub : {subset (outgoing ev) <= [:: bottom, top & s]}.
+ move=> g gin; apply: (edges_sub comi); rewrite /all_edges mem_cat.
+ by apply/orP; right; rewrite events_to_edges_cons mem_cat gin.
+constructor.
+- have := step_keeps_invariant1 cls lstc (inbox_events comi) oute rfo cbtom adj
+ sval
+ (closed_events comi) clae (esym (high_lsto_eq comi)) abovelow noc
+ (lex_events comi).
+ rewrite /step /generic_trajectories.step/same_x -at_lstx eqxx /=.
+ rewrite -/(point_under_edge _ _) underW /=; last by [].
+ by rewrite -/(point ev <<< lsthe) under_lsthe.
+- rewrite -/(update_open_cell lsto ev).
+case uoc_eq : update_open_cell => [nos lno] /=.
+ have [case1 | case2]:= update_open_cellE2 oute vl vh sok xev_llo sll pal puho.
+ apply/esym.
+ have := opening_cells_left oute vl vh.
+ rewrite /opening_cells; move: case1; case: opening_cells_aux=> [nos' lno'].
+ rewrite uoc_eq /= => <- /(_ lno).
+ by apply; rewrite mem_rcons inE eqxx.
+ move: case2; rewrite uoc_eq /= => ->.
+ by rewrite (add_point_left_limit _ sll).
+- rewrite -/(update_open_cell lsto ev).
+ case uoc_eq : update_open_cell => [nos lno] /=.
+ have [case1 | case2]:= update_open_cellE2 oute vl vh sok xev_llo sll pal puho.
+ rewrite uoc_eq /= in case1; rewrite case1.
+ have := opening_cells_aux_high_last vl vh oute'.
+ case: opening_cells_aux => [lno' nos'] /= => ->.
+ by apply: (high_lsto_eq comi).
+ rewrite uoc_eq /= in case2; rewrite case2.
+ rewrite high_set_left_pts.
+ by apply: (high_lsto_eq comi).
+have llin : low lsto \in [:: bottom, top & s].
+ apply: (edges_sub comi); rewrite /all_edges mem_cat /state_open_seq /=.
+ by rewrite cell_edges_cat mem_cat cell_edges_cons inE eqxx !orbT.
+have hlin : high lsto \in [:: bottom, top & s].
+ apply: (edges_sub comi); rewrite /all_edges mem_cat /state_open_seq /=.
+ by rewrite cell_edges_cat mem_cat cell_edges_cons !inE eqxx !orbT.
+- rewrite -/(update_open_cell lsto ev).
+ case uoc_eq : update_open_cell => [nos lno].
+ rewrite /all_edges /state_open_seq /=.
+ apply: subset_catl; last first.
+ move=> g gin; apply: (edges_sub comi); rewrite /all_edges.
+ by rewrite mem_cat orbC events_to_edges_cons mem_cat gin orbT.
+ move=> g; rewrite cell_edges_cat mem_cat cell_edges_cons 2!inE.
+ rewrite cell_edges_cat mem_cat -!orbA=> /orP[gin | ] .
+ apply: (edges_sub comi); rewrite /state_open_seq /= /all_edges mem_cat.
+ by rewrite cell_edges_cat mem_cat gin.
+ move=> /orP[gin | ].
+ have [c cin gq] : exists2 c, c \in nos & g = high c \/ g = low c.
+ move: gin; rewrite mem_cat=> /orP[] /mapP[c cin gq]; exists c=> //.
+ by right.
+ by left.
+ have := update_open_cellE1 oute vl vh sok xev_llo sll pal puho.
+ rewrite uoc_eq /= => /(_ _ cin) [c' c'in Pc].
+ have /andP [lc'in hc'in] : (low c' \in [:: bottom, top & s]) &&
+ (high c' \in [:: bottom, top & s]).
+ have := opening_cells_subset' llin hlin ogsub vl vh oute.
+ rewrite /opening_cells.
+ move: c'in; case : opening_cells_aux => [nos' lno'] /= c'in main.
+ by rewrite !main // mem_cat map_f ?orbT // mem_rcons inE c'in ?orbT.
+ move: Pc gq=> [-> | [l lv ->]].
+ by move=> [] ->.
+ rewrite high_set_left_pts low_set_left_pts.
+ by move=> [] ->.
+- rewrite orbA=> /orP[ | gin]; last first.
+ apply: (edges_sub comi); rewrite /all_edges mem_cat /state_open_seq /=.
+ by rewrite cell_edges_cat mem_cat cell_edges_cons !inE gin !orbT.
+ have := update_open_cellE2 oute vl vh sok xev_llo sll pal puho.
+ rewrite uoc_eq /=.
+ have := opening_cells_subset' llin hlin ogsub vl vh oute.
+ rewrite /opening_cells.
+ move: opening_cells_aux => [nos' lno'] /= main.
+ move=> [] -> /orP gin.
+ apply: main; rewrite mem_cat; move: gin.
+ by move=> [] /eqP ->; rewrite map_f ?orbT //; rewrite mem_rcons inE eqxx.
+ move: gin; rewrite low_set_left_pts high_set_left_pts=> gin.
+ apply: (edges_sub comi); rewrite /all_edges/state_open_seq /=.
+ rewrite mem_cat cell_edges_cat mem_cat cell_edges_cons !inE.
+ by move: gin=> [] ->; rewrite ?orbT.
+- by move: (closed_events comi)=> /andP[].
+- by move=> e1 e1in; apply: (out_events comi); rewrite inE e1in orbT.
+- by move: (inbox_events comi)=> /andP[].
+- move: (lex_events comi)=> /=.
+ rewrite path_sortedE; last by apply:lexPtEv_trans.
+ by move=> /andP[].
+have xev_ll : p_x (point ev) = left_limit lsto.
+ by rewrite -at_lstx lstx_ll.
+case uocq : (generic_trajectories.update_open_cell _ _ _ _
+ _ _ _ _ _ _ _ _ lsto ev) => [new_opens last_new_open].
+rewrite /state_open_seq/=.
+rewrite -catA -cat_rcons 2!all_cat andbCA.
+move: (sides_ok comi).
+rewrite !all_cat /= andbCA => /andP[] lstook ->; rewrite andbT.
+have sz_lptso := size_left_lsto sval lstx_ll
+ (sides_ok comi) (esym at_lstx) pal (underW puho)
+ => /=.
+have lxlftpts : all (fun x => lexPt x (point ev)) (behead (left_pts lsto)).
+ have := lst_side_lex comng => /=.
+ case lptsq : (left_pts lsto) => [ | p1 [ | p2 ps]] //= /andP[] p2lex _.
+ rewrite p2lex /=.
+ apply/allP => px pxin.
+ apply: (lexPt_trans _ p2lex).
+ move: (sides_ok comi)=> /allP /(_ _ lstoin) /andP[] _.
+ rewrite lptsq /= => /andP[] /andP[] _ /andP[] p2ll /allP psll.
+ move=> /andP[] /andP[] _ + _.
+ rewrite (path_sortedE (rev_trans (lt_trans)))=> /andP[] /allP cmpy _.
+ rewrite /lexPt (eqP p2ll) (esym (eqP (psll _ pxin))) eqxx.
+ by rewrite (cmpy (p_y px)) ?orbT // map_f.
+apply: (update_open_cell_side_limit_ok oute sval
+ (sides_ok comi) lxlftpts uocq xev_ll puho pal).
+Qed.
+
Lemma simple_step_disjoint_general_position_invariant
bottom top s fop lsto lop fc cc lcc lc le he cls lstc ev
lsthe lstx evs :
@@ -5565,7 +5867,7 @@ have := step_keeps_pw_default inbox_es oute rfo cbtom adj sval
noc pw.
by rewrite oe oca_eq -catA.
have right_limit_closed' :
- {in rcons(cls ++
+ {in rcons(cls ++
lstc :: closing_cells (point ev) cc) (close_cell (point ev) lcc) &
evs, forall c e, right_limit c <= p_x (point e)}.
have:= step_keeps_right_limit_closed_default inbox_es cbtom adj
@@ -5680,12 +5982,12 @@ Record edge_covered_general_position_invariant (bottom top : edge)
point e \in (right_pts c : seq pt) /\ point e >>> low c} ;
common_inv_ec : common_general_position_invariant bottom top edge_set
s events;
- non_in_ec :
+ non_in_ec :
{in edge_set & events, forall g e, non_inner g (point e)};
uniq_ec : {in events, forall e, uniq (outgoing e)};
inj_high : {in state_open_seq s &, injective high};
- bot_left_cells :
- {in state_open_seq s & events,
+ bot_left_cells :
+ {in state_open_seq s & events,
forall c e, lexPt (bottom_left_corner c) (point e)};
}.
@@ -5695,7 +5997,7 @@ Proof.
by elim: s => [ | c0 s Ih] //=; rewrite cell_edges_cons !inE !orbA Ih.
Qed.
-Lemma bottom_left_start bottom top p :
+Lemma bottom_left_start bottom top p :
inside_box bottom top p ->
open_cell_side_limit_ok (start_open_cell bottom top) ->
bottom_left_cells_lex [:: start_open_cell bottom top] p.
@@ -5865,9 +6167,9 @@ have noc : {in all_edges (state_open_seq st) (ev :: evs) &, no_crossing R}.
simple_step. *)
have lstxneq : p_x (point ev) != lstx.
by move: lstxlt; rewrite lt_neqAle eq_sym=> /andP[] /andP[].
-case oca_eq :
+case oca_eq :
(opening_cells_aux (point ev) (sort (@edge_below _) (outgoing ev)) le he) =>
- [nos lno].
+ [nos lno].
have Cinv' :=
simple_step_common_general_position_invariant boxwf nocs' inbox_s oe Cinv.
have btm_left_lex_e : {in (state_open_seq st), forall c,
@@ -5882,8 +6184,8 @@ have n_inner2 : {in state_open_seq st,
by move: inbox0 => /andP[].
rewrite !inE => /orP[/eqP -> | /orP [/eqP -> | hcin ]] //.
by apply: n_inner; rewrite // inE eqxx.
-have cov' : {in rcons cov_set ev,forall e',
- {in outgoing e', forall g, edge_covered g (state_open_seq
+have cov' : {in rcons cov_set ev,forall e',
+ {in outgoing e', forall g, edge_covered g (state_open_seq
(simple_step fc cc lc lcc le he cls lstc ev))
(state_closed_seq
(simple_step fc cc lc lcc le he cls lstc ev))}}.
@@ -5910,7 +6212,7 @@ have n_inner' : {in s & evs, forall g e, non_inner g (point e)}.
have uniq' : {in evs, forall e, uniq (outgoing e)}.
by move=> g gin; apply: uniq_evs; rewrite inE gin orbT.
have uniq_ev : uniq (outgoing ev) by apply: uniq_evs; rewrite inE eqxx.
-have inj_high' :
+have inj_high' :
{in state_open_seq (simple_step fc cc lc lcc le he cls lstc ev) &,
injective high}.
have := step_keeps_injective_high_default inbox0 out_e rfo cbtom adj sval
@@ -5927,7 +6229,7 @@ have btm_left_lex' :
rewrite /simple_step/= /= oe oca_eq /= /state_open_seq /=.
rewrite catA=> main.
move=> c e cin ein; apply: main=> //=.
- move: lexev; rewrite path_sortedE; last by apply: lexPtEv_trans.
+ move: lexev; rewrite path_sortedE; last by apply: lexPtEv_trans.
by move=> /andP[] /allP /(_ e ein).
move: cin; rewrite /generic_trajectories.simple_step.
by rewrite -/(opening_cells_aux _ _ _ _) oca_eq.
@@ -5981,7 +6283,7 @@ Lemma start_edge_covered_general_position bottom top s closed open evs :
{in evs, forall e, uniq (outgoing e)} ->
main_process bottom top evs = (open, closed) ->
{in events_to_edges evs, forall g, edge_covered g open closed} /\
- {in evs, forall e, exists2 c, c \in closed &
+ {in evs, forall e, exists2 c, c \in closed &
point e \in (right_pts c : seq pt) /\ point e >>> low c}.
Proof.
move=> ltev boxwf startok nocs' inbox_s evin lexev evsub out_evs cle
@@ -5999,7 +6301,7 @@ rewrite /initial_state evsq /=.
case oca_eq : (opening_cells_aux _ _ _ _) => [nos lno].
set istate := Bscan _ _ _ _ _ _ _.
move=> istateP req.
-suff main : forall events op cl st cov_set,
+suff main : forall events op cl st cov_set,
edge_covered_general_position_invariant bottom top s cov_set st events ->
scan events st = (op, cl) ->
({in events_to_edges (cov_set ++ events), forall g, edge_covered g op cl} /\
@@ -6049,18 +6351,18 @@ Record safe_side_general_position_invariant (bottom top : edge)
{subset cell_edges (state_closed_seq s) <= bottom :: top :: edge_set};
(* TODO : move this to the common invariant. *)
left_o_lt :
- {in state_open_seq s & events,
+ {in state_open_seq s & events,
forall c e, left_limit c < p_x (point e)};
left_o_b :
- {in state_open_seq s, forall c, left_limit c <
+ {in state_open_seq s, forall c, left_limit c <
min (p_x (right_pt bottom)) (p_x (right_pt top))};
- closed_lt :
+ closed_lt :
{in state_closed_seq s, forall c, left_limit c < right_limit c};
closed_ok :
all (@closed_cell_side_limit_ok R) (state_closed_seq s);
(* TODO : move this to the disjoint invariant. *)
cl_at_left_ss :
- {in state_closed_seq s & events,
+ {in state_closed_seq s & events,
forall c e, right_limit c < p_x (point e)};
safe_side_closed_edges :
{in events_to_edges processed_set & state_closed_seq s, forall g c p,
@@ -6070,7 +6372,7 @@ Record safe_side_general_position_invariant (bottom top : edge)
in_safe_side_left p c -> ~p === g};
safe_side_closed_points :
{in processed_set & state_closed_seq s, forall e c p,
- in_safe_side_left p c || in_safe_side_right p c ->
+ in_safe_side_left p c || in_safe_side_right p c ->
p != point e :> pt};
safe_side_open_points :
{in processed_set & state_open_seq s, forall e c p,
@@ -6138,7 +6440,7 @@ Lemma initial_safe_side_general_position bottom top s events:
[::(head dummy_event events)]
(initial_state bottom top events) (behead events).
Proof.
-move=> gen_pos lexev wf cle startok nocs' n_inner inbox_es sub_es out_es
+move=> gen_pos lexev wf cle startok nocs' n_inner inbox_es sub_es out_es
uniq_out_es evsn0.
have := initial_intermediate wf startok nocs' inbox_es lexev sub_es
out_es cle evsn0.
@@ -6146,7 +6448,7 @@ have := initial_disjoint_general_position_invariant gen_pos wf startok
nocs' inbox_es lexev sub_es out_es cle evsn0.
have := initial_edge_covering_general_position gen_pos lexev wf cle
startok nocs' n_inner inbox_es sub_es out_es uniq_out_es evsn0.
-case evsq: events evsn0=> [ | ev evs]; [by [] | move=> evsn0].
+case evsq: events evsn0=> [ | ev evs]; [by [] | move=> evsn0].
rewrite /initial_state.
case oca_eq : (opening_cells_aux _ _ _ _) => [nos lno].
move=> e_inv d_inv.
@@ -6172,7 +6474,7 @@ have dif1 : {in (nos ++ [:: lno]) ++
by rewrite /opening_cells oca_eq; apply.
rewrite inE /close_cell (pvertE vb0) (pvertE vt0) => /eqP -> /=.
by apply/negP=> /eqP abs; move: pab; rewrite abs (underW put).
-have subc1 : {subset cell_edges [:: close_cell (point ev) op0] <=
+have subc1 : {subset cell_edges [:: close_cell (point ev) op0] <=
bottom :: top :: s}.
move=> c; rewrite !mem_cat !inE=> /orP[] /eqP ->.
have [-> _ _] := close_cell_preserve_3sides (point ev) op0.
@@ -6192,7 +6494,7 @@ have llop0ltev : left_limit op0 < p_x (point ev).
rewrite (leftmost_points_max startok).
have := inbox_e=> /andP[] _ /andP[] /andP[] + _ /andP[] + _.
by case: (lerP (p_x (left_pt bottom)) (p_x (left_pt top))).
-have lltr : {in [:: close_cell (point ev) op0],
+have lltr : {in [:: close_cell (point ev) op0],
forall c, left_limit c < right_limit c}.
move=> c; rewrite inE=> /eqP ->.
rewrite (@right_limit_close_cell _ (point ev) op0 vb0 vt0).
@@ -6263,8 +6565,8 @@ have op_no_event : {in [:: ev] & nos ++ [:: lno],
have lt_p_ev :
{in [:: ev] & evs, forall e1 e2 : event', p_x (point e1) < p_x (point e2)}.
by move=> e1 e2; rewrite inE => /eqP ->; apply: lte.
-have ll_o_b :
- {in nos ++ [:: lno], forall c,
+have ll_o_b :
+ {in nos ++ [:: lno], forall c,
left_limit c < min (p_x (right_pt bottom)) (p_x (right_pt top))}.
move=> c cin.
have := opening_cells_left oute vb0 vt0; rewrite /opening_cells oca_eq.
@@ -6323,7 +6625,7 @@ have : safe_side_general_position_invariant bottom top s [:: ev]
nocs' n_inner evin evsub out_evs uniq_edges evsn0.
by rewrite evsq /= oca_eq.
move=> invss req.
-suff main: forall events op cl st processed_set,
+suff main: forall events op cl st processed_set,
safe_side_general_position_invariant bottom top s processed_set st events ->
scan events st = (op, cl) ->
{in cl, forall c,
@@ -6453,7 +6755,7 @@ have oute' :
{in (sort (@edge_below _) (outgoing ev)), forall g, left_pt g == point ev}.
by move=> g; rewrite mem_sort; apply: oute.
set rstate := Bscan _ _ _ _ _ _ _.
-have d_inv':
+have d_inv':
disjoint_general_position_invariant bottom top s rstate future_events.
move: (d_inv); rewrite stq=> d_inv'.
have := simple_step_disjoint_general_position_invariant boxwf nocs'
@@ -6633,7 +6935,7 @@ have cl_safe_edge :
by rewrite /closing_cells -map_rcons map_f // => /(_ isT).
move: gin=> /flatten_mapP[e' e'in gin].
have := edge_covered_ec e_inv e'in gin=> -[]; last first.
- move=> [[ | pcc0 pcc] []]; first by [].
+ move=> [[ | pcc0 pcc] []]; first by [].
move=> _ /= [pccsub [pcchigh [_ [_ rlpcc]]]] /andP[] _ /andP[] _.
rewrite leNgt=> /negP; apply.
rewrite samex -rlpcc; apply:rl; last by rewrite inE eqxx.
@@ -6755,10 +7057,10 @@ have op_safe_edge :
rewrite ltNge=> /negP; apply.
by move: pong; rewrite (eqP (oute _ gnew)).
move=> p pin.
- have : has (in_safe_side_left p)
+ have : has (in_safe_side_left p)
(opening_cells (point ev) (outgoing ev) le he).
by apply/hasP; exists c; rewrite // /opening_cells oca_eq.
- have := sides_equiv inbox_es oute rfo cbtom adj sval; rewrite stq /=.
+ have := sides_equiv inbox_es oute rfo cbtom adj sval; rewrite stq /=.
move=> /(_ _ _ _ _ _ _ oe p) /eqP <- => /hasP[] c' c'in pin'.
have := cl_safe_edge _ c' gin; apply.
by rewrite /rstate /state_closed_seq/= rcons_cat /= mem_cat inE c'in ?orbT.
@@ -6807,10 +7109,10 @@ have op_safe_event :
apply/eqP=> pev.
by move: llt; rewrite -pll pev lt_irreflexive.
move=> p pin.
- have : has (in_safe_side_left p)
+ have : has (in_safe_side_left p)
(opening_cells (point ev) (outgoing ev) le he).
by apply/hasP; exists c; rewrite // /opening_cells oca_eq.
- have := sides_equiv inbox_es oute rfo cbtom adj sval; rewrite stq /=.
+ have := sides_equiv inbox_es oute rfo cbtom adj sval; rewrite stq /=.
move=> /(_ _ _ _ _ _ _ oe p) /eqP <- => /hasP[] c' c'in pin'.
have := cl_safe_event _ c' ein; apply.
by rewrite /rstate /state_closed_seq/= rcons_cat /= mem_cat inE c'in ?orbT.
@@ -6843,8 +7145,8 @@ have lo_lb' : {in state_open_seq rstate, forall c,
by apply: inside_box_lt_min_right.
by constructor.
Qed.
-
-(*
+
+(*
Lemma start_cover (bottom top : edge) (s : seq edge) closed open :
bottom <| top ->
@@ -6887,7 +7189,7 @@ have evsin0 : all (inside_box bottom top)
have : {subset [seq left_pt g | g <- s] <= inside_box bottom top}.
by apply/allP: leftin.
by apply: edges_to_events_subset.
-have btm_left0 : {in [seq point e | e <- evs],
+have btm_left0 : {in [seq point e | e <- evs],
forall e, bottom_left_cells_lex op0 e}.
move=> ev /[dup] /(allP evsin0) /andP[_ /andP[valb valt]] evin c.
rewrite /op0 inE /lexPt /bottom_left_corner=> /eqP -> /=.
@@ -7003,7 +7305,7 @@ have cbtomr : cells_bottom_top bottom top op'.
have sortev' : sorted (@lexPt R) [seq point x | x <- evs'].
by move: sortev; rewrite /= => /path_sorted.
have llim' : {in op', forall c p, inside_box bottom top p ->
- left_limit c = p_x p ->
+ left_limit c = p_x p ->
contains_point' p c -> has (inside_closed' p) cl'}.
by apply: (step_keeps_cover_left_border cbtom
adj inbox_e sval' oute' rfo clae
@@ -7049,7 +7351,7 @@ have higfc : fc != nil -> high (last dummy_cell fc) = low (head lcc cc).
move=> le_cnct.
move=> he_cnct.
have adjnew : adjacent_cells (fc ++ nos ++ lno :: lc).
- rewrite (_ : fc ++ nos ++ lno :: lc =
+ rewrite (_ : fc ++ nos ++ lno :: lc =
fc ++ (rcons nos lno) ++ lc);last first.
by rewrite -cats1 -!catA.
a d m i t.
diff --git a/theories/math_comp_complements.v b/theories/math_comp_complements.v
index fdc5a5b..a65e6de 100644
--- a/theories/math_comp_complements.v
+++ b/theories/math_comp_complements.v
@@ -269,3 +269,23 @@ Ltac subset_tac :=
| |- is_true (_ \in (_ ++ _)) => rewrite mem_cat; apply/orP;
(solve [left; subset_tac] || (right; subset_tac))
end.
+
+Section mapi.
+
+(* TODO: This might be useful one day, because it is used intensively in the
+ trajectory computation, but not so much in cell decomposition. *)
+Definition mapi [T U : Type] (f : T -> Datatypes.nat -> U) (s : seq T) :=
+ map (fun p => f p.1 p.2) (zip s (iota 0 (size s))).
+
+Lemma nth_mapi [T U : Type] (f : T -> Datatypes.nat -> U) (s : seq T) n d d' :
+ (n < size s)%N ->
+ nth d' (mapi f s) n = f (nth d s n) n.
+Proof.
+rewrite /mapi.
+rewrite -[X in f _ X]addn0.
+elim: s n 0%N => [ | el s Ih] [ | n] m //=.
+ rewrite ltnS=> nlt.
+by rewrite addSn -addnS; apply: Ih.
+Qed.
+
+End mapi.
From 21f975d046c524b129742a0f8bcd1160558d9933 Mon Sep 17 00:00:00 2001
From: "Yves Bertot (he)"
Date: Sun, 27 Oct 2024 08:40:34 +0100
Subject: [PATCH 42/43] proved that update_open_cell satisfies the
common_non_gp_invariant
---
theories/cells_alg.v | 141 +++++++++++++++++++++++++++++++--------
theories/opening_cells.v | 38 ++++++++++-
2 files changed, 150 insertions(+), 29 deletions(-)
diff --git a/theories/cells_alg.v b/theories/cells_alg.v
index e91c01c..d6dbd89 100644
--- a/theories/cells_alg.v
+++ b/theories/cells_alg.v
@@ -5054,7 +5054,7 @@ move: oeq; rewrite nosq=> oeq.
rewrite /=.
rewrite (first_opening_cells_side_char pp ogq vle vhe pal oute oeq).
rewrite [in X in _ == X]has_rcons.
-rewrite (last_opening_cells_side_char pp ogq vle vhe puh oute oeq).
+rewrite (last_opening_cells_safe_side_char pp ogq vle vhe puh oute oeq).
rewrite (negbTE (middle_opening_cells_side_char pp ogq vle vhe oute oeq)) orbF.
case ccq : cc => [ | cc1 cc'].
move: (oe); rewrite ccq=> oe'.
@@ -5614,6 +5614,46 @@ have ltev1 : all (fun e =>
by constructor.
Qed.
+Lemma same_x_point_above_low_lsto bottom top s fop lsto lop cls lstc
+ ev lsthe lstx evs :
+ lstx = p_x (point ev) ->
+ common_non_gp_invariant bottom top s
+ (Bscan fop lsto lop cls lstc lsthe lstx) (ev :: evs) ->
+ point ev >>> low lsto.
+Proof.
+move=> at_lstx comng.
+have comi := ngcomm comng.
+have lstx_ll : lstx = left_limit lsto.
+ rewrite -[lstx]/(lst_x _ _ (Bscan fop lsto lop cls lstc lsthe lstx)).
+ by rewrite (lstx_eq comi).
+have := lst_side_lex comng.
+set W := (X in size X); rewrite -/W.
+have : open_cell_side_limit_ok lsto.
+ by apply: (allP (sides_ok comi)); rewrite mem_cat inE eqxx orbT.
+rewrite /open_cell_side_limit_ok => /andP[] _ /andP[] + /andP[] + /andP[].
+move=> + + _ +.
+rewrite -/W.
+ case wq : W => [ | p1 [ | p2 ps]] //= A /andP[] _ higherps + /andP[] ll _.
+ move: A => /andP[] _ /andP[] p2x allx.
+ have lx : p_x (last p2 ps) == left_limit lsto.
+ case : (ps) allx => [ | p3 pst] // /allP; apply=> /=.
+ by rewrite mem_last.
+ have samex : p_x (point ev) = p_x (last p2 ps).
+ by rewrite -at_lstx lstx_ll (eqP lx).
+ have cmpy : p_y (last p2 ps) <= p_y p2.
+ case psq : ps => [ | p3 pst] //.
+ apply ltW.
+ rewrite (path_sortedE (rev_trans lt_trans)) psq in higherps.
+ move: higherps=> /andP[] /allP /(_ (p_y (last p3 pst))) + _.
+ rewrite map_f; last by rewrite mem_last.
+ by move=> /(_ isT).
+ move=> /(under_edge_lower_y samex) ->.
+ rewrite -ltNge.
+ apply: (le_lt_trans cmpy).
+ move: ll; rewrite /lexPt.
+ by rewrite lt_neqAle samex (eqP p2x) eq_sym lx /=.
+Qed.
+
Lemma update_open_cell_common_invariant
bottom top s fop lsto lop cls lstc ev
lsthe lstx evs :
@@ -5649,32 +5689,7 @@ have lstx_ll : lstx = left_limit lsto.
rewrite -[lstx]/(lst_x _ _ (Bscan fop lsto lop cls lstc lsthe lstx)).
by rewrite (lstx_eq comi).
have pal : (point ev) >>> low lsto.
- have := lst_side_lex comng.
- set W := (X in size X); rewrite -/W.
- have : open_cell_side_limit_ok lsto.
- by apply: (allP (sides_ok comi)); rewrite mem_cat inE eqxx orbT.
- rewrite /open_cell_side_limit_ok => /andP[] _ /andP[] + /andP[] + /andP[].
- move=> + + _ +.
- rewrite -/W.
- case wq : W => [ | p1 [ | p2 ps]] //= A /andP[] _ higherps + /andP[] ll _.
- move: A => /andP[] _ /andP[] p2x allx.
- have lx : p_x (last p2 ps) == left_limit lsto.
- case : (ps) allx => [ | p3 pst] // /allP; apply=> /=.
- by rewrite mem_last.
- have samex : p_x (point ev) = p_x (last p2 ps).
- by rewrite -at_lstx lstx_ll (eqP lx).
- have cmpy : p_y (last p2 ps) <= p_y p2.
- case psq : ps => [ | p3 pst] //.
- apply ltW.
- rewrite (path_sortedE (rev_trans lt_trans)) psq in higherps.
- move: higherps=> /andP[] /allP /(_ (p_y (last p3 pst))) + _.
- rewrite map_f; last by rewrite mem_last.
- by move=> /(_ isT).
- move=> /(under_edge_lower_y samex) ->.
- rewrite -ltNge.
- apply: (le_lt_trans cmpy).
- move: ll; rewrite /lexPt.
- by rewrite lt_neqAle samex (eqP p2x) eq_sym lx /=.
+ by exact: (same_x_point_above_low_lsto at_lstx comng).
have abovelow : p_x (point ev) = lstx -> (point ev) >>> low lsto by [].
have noc : {in all_edges (fop ++ lsto :: lop) (ev :: evs) &,
no_crossing R}.
@@ -5706,7 +5721,7 @@ constructor.
rewrite -/(point_under_edge _ _) underW /=; last by [].
by rewrite -/(point ev <<< lsthe) under_lsthe.
- rewrite -/(update_open_cell lsto ev).
-case uoc_eq : update_open_cell => [nos lno] /=.
+ case uoc_eq : update_open_cell => [nos lno] /=.
have [case1 | case2]:= update_open_cellE2 oute vl vh sok xev_llo sll pal puho.
apply/esym.
have := opening_cells_left oute vl vh.
@@ -5806,6 +5821,76 @@ apply: (update_open_cell_side_limit_ok oute sval
(sides_ok comi) lxlftpts uocq xev_ll puho pal).
Qed.
+Lemma update_open_cell_common_non_gp_invariant
+ bottom top s fop lsto lop cls lstc ev
+ lsthe lstx evs :
+ bottom <| top ->
+ {in bottom :: top :: s &, forall e1 e2, inter_at_ext e1 e2} ->
+ {in s, forall g, inside_box bottom top (left_pt g) &&
+ inside_box bottom top (right_pt g)} ->
+ lstx = p_x (point ev) ->
+ (point ev) <<< lsthe ->
+ common_non_gp_invariant bottom top s
+ (Bscan fop lsto lop cls lstc lsthe lstx)
+ (ev :: evs) ->
+ common_non_gp_invariant bottom top s
+ (step (Bscan fop lsto lop cls lstc lsthe lstx) ev)
+ evs.
+Proof.
+move=> bxwf nocs' inbox_s at_lstx under_lsthe comng.
+have comi := ngcomm comng.
+constructor.
+ now apply: update_open_cell_common_invariant.
+rewrite /step/generic_trajectories.step.
+rewrite /same_x at_lstx eqxx /=.
+rewrite -/(point_under_edge _ _) underW /=; last by [].
+rewrite -/(point ev <<< lsthe) under_lsthe.
+case uocq : (generic_trajectories.update_open_cell _ _ _ _ _ _
+ _ _ _ _ _ _ lsto ev) => [nos lno] /=.
+have oute : out_left_event ev.
+ by apply: (out_events comi); rewrite inE eqxx.
+have [clae [sval' [adj [cbtom rfo]]]] := inv1 comi.
+have sval : seq_valid (state_open_seq (Bscan fop lsto lop cls lstc lsthe lstx))
+ (point ev).
+ by case: sval'.
+have lstoin : lsto \in (fop ++ lsto :: lop).
+ by rewrite mem_cat inE eqxx orbT.
+have [vl vh] := (andP (allP sval lsto lstoin)).
+have sok : open_cell_side_limit_ok lsto.
+ by apply: (allP (sides_ok comi)); exact: lstoin.
+have xev_llo : p_x (point ev) = left_limit lsto.
+ by rewrite -at_lstx -(lstx_eq comi).
+have puho : point ev <<< high lsto.
+ move: under_lsthe.
+ rewrite -[lsthe]/(lst_high _ _ (Bscan fop lsto lop cls lstc lsthe lstx)).
+ by rewrite -(high_lsto_eq comi).
+have pal : (point ev) >>> low lsto.
+ by exact: (same_x_point_above_low_lsto at_lstx comng).
+have lstx_ll : lstx = left_limit lsto.
+ rewrite -[lstx]/(lst_x _ _ (Bscan fop lsto lop cls lstc lsthe lstx)).
+ by rewrite (lstx_eq comi).
+have sll : (1 < size (left_pts lsto))%N.
+ by apply: (size_left_lsto sval lstx_ll (sides_ok comi) (esym at_lstx) pal
+ (underW puho)).
+have [case1 | case2]:= update_open_cellE2 oute vl vh sok xev_llo sll pal puho.
+ rewrite /update_open_cell uocq /= in case1.
+ rewrite case1.
+ case oca_eq : (opening_cells_aux _ _ _ _) => [nos1 lno1] /=.
+ have [sz prf]:= last_opening_cells_left_pts_prefix vl vh puho oute oca_eq.
+ rewrite sz /=.
+ set thenth := nth _ _ _.
+ suff -> : thenth = point ev.
+ rewrite (@path_map _ _ (@point) (@lexPt R) ev evs).
+ exact: (lex_events comi).
+ have := take_nth dummy_pt sz; rewrite prf /thenth.
+ case lpts1 : (left_pts lno1) sz => [ | a [ | b tl]] //= _.
+ by move=> [] _ /esym.
+rewrite /update_open_cell uocq /= in case2.
+rewrite case2 /=.
+rewrite (@path_map _ _ (@point) (@lexPt R) ev evs).
+exact: (lex_events comi).
+Qed.
+
Lemma simple_step_disjoint_general_position_invariant
bottom top s fop lsto lop fc cc lcc lc le he cls lstc ev
lsthe lstx evs :
diff --git a/theories/opening_cells.v b/theories/opening_cells.v
index fb4f971..9a70026 100644
--- a/theories/opening_cells.v
+++ b/theories/opening_cells.v
@@ -940,7 +940,43 @@ rewrite -[pt_eqb _ _ _ _]/(_ == _ :> pt).
by move=> /eqP <-; rewrite (@mem_head pt).
Qed.
-Lemma last_opening_cells_side_char e le he pp nos lno :
+Lemma last_opening_cells_left_pts_prefix e le he nos lno :
+ valid_edge le (point e) ->
+ valid_edge he (point e) ->
+ point e <<< he ->
+ out_left_event e ->
+ opening_cells_aux (point e) (sort (@edge_below _) (outgoing e)) le he =
+ (nos, lno) ->
+ (1 < size (left_pts lno))%N /\
+ take 2 (left_pts lno) =
+ [:: Bpt (p_x (point e)) (pvert_y (point e) he); (point e)] .
+Proof.
+move=> + vh puh oute.
+have := outleft_event_sort oute.
+elim: (sort _ _) nos lno le => [ | g s Ih] nos lno le /= oute' vl.
+ do 2 rewrite -/(vertical_intersection_point _ _).
+ rewrite (pvertE vl) (pvertE vh) => -[nosq lnoq].
+ rewrite -lnoq /=.
+ rewrite -/(_ == point e) -/(point e == _).
+ set ph := (X in X == point e); set pl := (X in point e == X).
+ rewrite -/ph -/pl.
+ have /negbTE -> : ph != point e.
+ rewrite pt_eqE negb_and /ph /= eqxx /=.
+ move: puh.
+ by rewrite (strict_under_pvert_y vh) lt_neqAle eq_sym=> /andP[].
+ split; first by case: (_ == _).
+ by have [-> | enqpl] := eqVneq (point e) pl.
+rewrite -/(vertical_intersection_point _ _).
+rewrite (pvertE vl).
+case oca_eq : (opening_cells_aux _ _ _ _) => [nos1 lno1] [_ <-].
+have oute1 : forall ed, ed \in s -> left_pt ed == point e.
+ by move=> ed edin; apply: oute'; rewrite inE edin orbT.
+have vg : valid_edge g (point e).
+ by rewrite -(eqP (oute' g _)) ?valid_edge_left // inE eqxx.
+by apply: (Ih nos1 lno1 g oute1 vg oca_eq).
+Qed.
+
+Lemma last_opening_cells_safe_side_char e le he pp nos lno :
outgoing e != [::] ->
valid_edge le (point e) ->
valid_edge he (point e) ->
From ef307d317b60bbc2c69c830e74737842b284ae1a Mon Sep 17 00:00:00 2001
From: Yves Bertot
Date: Wed, 30 Oct 2024 15:40:46 +0100
Subject: [PATCH 43/43] replace seq_subst by an implementation based on map
---
theories/cells_alg.v | 4 ++--
theories/math_comp_complements.v | 23 ++++++++++++-----------
2 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/theories/cells_alg.v b/theories/cells_alg.v
index d6dbd89..7ec4699 100644
--- a/theories/cells_alg.v
+++ b/theories/cells_alg.v
@@ -3768,7 +3768,7 @@ Lemma connect_limits_seq_subst (l : seq cell) c c' :
connect_limits l -> connect_limits (seq_subst l c c').
Proof.
move=> ll rr; elim: l => [ | a [ | b l] Ih] /=; first by [].
- by case: ifP.
+ by [].
move=> /[dup] conn /andP[ab conn'].
have conn0 : path (fun c1 c2 => right_limit c1 == left_limit c2) a (b :: l).
by exact: conn.
@@ -3826,7 +3826,7 @@ case: ecg => [[oc [pcc [ocP1 [hP [cP [ocin conn]]]]]] | ].
rewrite connect_limits_rcons; last by apply/eqP/rcons_neq0.
move=> /andP[] cP cc.
rewrite connect_limits_rcons; last first.
- by case: (pcc')=> /= [ | ? ?]; case: ifP.
+ by case: (pcc')=> /= [ | ? ?].
apply/andP; split; last first.
rewrite -cats1 seq_subst_cat /=.
move: cc; rewrite last_rcons=> /eqP <-.
diff --git a/theories/math_comp_complements.v b/theories/math_comp_complements.v
index a65e6de..7e5e32a 100644
--- a/theories/math_comp_complements.v
+++ b/theories/math_comp_complements.v
@@ -10,12 +10,8 @@ Import Order.TTheory GRing.Theory Num.Theory Num.ExtraDef Num.
Open Scope ring_scope.
-Fixpoint seq_subst {A : eqType}(l : seq A) (b c : A) : seq A :=
- match l with
- | nil => nil
- | a :: tl =>
- if a == b then (c :: seq_subst tl b c) else (a :: seq_subst tl b c)
- end.
+Definition seq_subst {A : eqType} (l : seq A) (b c : A) : seq A :=
+ map [eta id with b |-> c] l.
Lemma mem_seq_subst {A : eqType} (l : seq A) b c x :
x \in (seq_subst l b c) -> (x \in l) || (x == c).
@@ -25,16 +21,21 @@ rewrite /=.
by case: ifP => [] ?; rewrite !inE=> /orP[ | /Ih /orP[] ] ->; rewrite ?orbT.
Qed.
+Lemma map_nilp {A B : Type} (f : A -> B) (l : seq A) :
+ nilp [seq f x | x <- l] = nilp l.
+Proof. by case: l. Qed.
+
+Lemma map_eq0 {A B : eqType} (f : A -> B) (l : seq A) :
+ ([seq f x | x <- l] == [::]) = (l == [::]).
+Proof. by case: l. Qed.
+
Lemma seq_subst_eq0 {A : eqType} (l : seq A) b c :
(seq_subst l b c == [::]) = (l == [::]).
-Proof. by case : l => [ | a l] //=; case: ifP. Qed.
+Proof. exact: map_eq0. Qed.
Lemma seq_subst_cat {A : eqType} (l1 l2 : seq A) b c :
seq_subst (l1 ++ l2) b c = seq_subst l1 b c ++ seq_subst l2 b c.
-Proof.
-elim: l1 => [ // | a l1 Ih] /=.
-by case: ifP=> [ab | anb]; rewrite Ih.
-Qed.
+Proof. exact: map_cat. Qed.
Lemma last_in_not_nil (A : eqType) (e : A) (s : seq A) :
s != [::] -> last e s \in s.