From 81473bf8b4b805463b316e4c6638283106ed7d66 Mon Sep 17 00:00:00 2001 From: MathisBD <mathis.bouverot@ens.psl.eu> Date: Sun, 18 Feb 2024 23:20:05 +0100 Subject: [PATCH] proof of weber_aligned_spec_weak --- CaseStudies/Gathering/InR2/Weber/Utils.v | 22 +++- .../Gathering/InR2/Weber/Weber_point.v | 105 +++++++++++++++++- 2 files changed, 118 insertions(+), 9 deletions(-) diff --git a/CaseStudies/Gathering/InR2/Weber/Utils.v b/CaseStudies/Gathering/InR2/Weber/Utils.v index 9744c6ce..2161064a 100644 --- a/CaseStudies/Gathering/InR2/Weber/Utils.v +++ b/CaseStudies/Gathering/InR2/Weber/Utils.v @@ -735,7 +735,21 @@ Ltac pos_R := | _ => pos_R_close end. -Ltac simp_fct := +Ltac simpl_R := repeat first + [ rewrite Rmult_0_l + | rewrite Rmult_0_r + | rewrite Rmult_1_l + | rewrite Rmult_1_r + | rewrite Rplus_0_l + | rewrite Rplus_0_r + | rewrite Rminus_0_l + | rewrite Rminus_0_r + | rewrite Ropp_0 + | rewrite sqrt_0 + | rewrite Rsqr_0 + ]. + +Ltac simpl_fct := cbv [fct_cte Ranalysis1.id Ranalysis1.comp plus_fct mult_fct inv_fct div_fct]. Local Instance derivable_pt_lim_compat : Proper ((equiv ==> equiv) ==> equiv ==> equiv ==> iff) derivable_pt_lim. @@ -761,9 +775,9 @@ assert (Hdiv := derivable_pt_lim_div (fct_cte 1%R) f x 0%R l). feed_n 3 Hdiv. { assumption. } { lra. } revert Hdiv. apply derivable_pt_lim_compat. -+ intros x1 x2 Hx. simp_fct. simpl. rewrite Hx. lra. ++ intros x1 x2 Hx. simpl_fct. simpl. rewrite Hx. lra. + reflexivity. -+ cbv [fct_cte]. simpl. lra. ++ cbv [fct_cte]. now simpl_R. Qed. (* Simplify a goal of the form [derivable_pt_lim f x d], assuming @@ -801,5 +815,5 @@ Ltac prove_derivable_pt_lim := evar (l_evar : R) ; replace l with l_evar ; [simp_derivable | unfold l_evar] ; - simp_fct + simpl_fct end. \ No newline at end of file diff --git a/CaseStudies/Gathering/InR2/Weber/Weber_point.v b/CaseStudies/Gathering/InR2/Weber/Weber_point.v index 3820e386..b79e0221 100644 --- a/CaseStudies/Gathering/InR2/Weber/Weber_point.v +++ b/CaseStudies/Gathering/InR2/Weber/Weber_point.v @@ -1625,6 +1625,95 @@ split. rewrite deriv_neg_iff. apply not_weber_deriv_neg. assumption. Qed. +Lemma u_aligned_left L x : + line_contains L w -> + line_contains L x -> + (L^P x < L^P w)%R -> + (u x = -unitary (line_dir L))%VS. +Proof. +intros Hw Hx Hleft. unfold u. rewrite <-Hw, <-Hx. unfold line_proj_inv. +rewrite opp_distr_add, (add_comm (line_org L)). rewrite add_assoc. +rewrite <-(add_assoc _ (line_org L)), add_opp, add_origin_r. +rewrite <-minus_morph, add_morph. rewrite <-opp_opp. f_equal. +rewrite <-unitary_opp, <-minus_morph. rewrite unitary_mul. ++ reflexivity. ++ rewrite <-Ropp_div, <-Rdiv_plus_distr, <-Ropp_div. + enough (0 <> norm (line_dir L))%R by pos_R. + symmetry. rewrite norm_defined. + intros Hnull. unfold line_proj in Hleft. + rewrite Hnull, inner_product_origin_r, inner_product_origin_r in Hleft. + lra. +Qed. + +Lemma u_aligned_right L x : + line_contains L w -> + line_contains L x -> + (L^P x > L^P w)%R -> + (u x = unitary (line_dir L))%VS. +Proof. +intros Hw Hx Hright. unfold u. rewrite <-Hw, <-Hx. unfold line_proj_inv. +rewrite opp_distr_add, (add_comm (line_org L)). rewrite add_assoc. +rewrite <-(add_assoc _ (line_org L)), add_opp, add_origin_r. +rewrite <-minus_morph, add_morph. rewrite unitary_mul. ++ reflexivity. ++ rewrite <-Ropp_div, <-Rdiv_plus_distr. + enough (0 <> norm (line_dir L))%R by pos_R. + symmetry. rewrite norm_defined. + intros Hnull. unfold line_proj in Hright. + rewrite Hnull, inner_product_origin_r, inner_product_origin_r in Hright. + lra. +Qed. + +Lemma aligned_sum_us L : + aligned_on L (w :: ps) -> + (list_sumVS (map u ps) = (INR (length (L^right w ps)) - INR (length (L^left w ps))) * unitary (line_dir L))%VS. +Proof. +intros Halign. rewrite aligned_on_cons_iff in Halign. destruct Halign as [Hw Halign]. +rewrite (line_left_on_right_partition L w ps) at 1. +do 2 rewrite map_app, list_sumVS_app. +induction ps as [| p ps' IH]. ++ simpl. now simpl_R. ++ rewrite aligned_on_cons_iff in Halign. destruct Halign as [Hp Halign]. + specialize (IH Halign). + unfold line_left, line_right, line_on. cbn [filter map list_sumVS]. + case (Rtotal_order (L^P p) (L^P w)) as [Hpw | [Hpw | Hpw]]. + - pose proof (Hrw := Hpw). rewrite <-Rltb_true in Hrw. rewrite Hrw ; clear Hrw. + assert (Hrw : ~(L^P w == L^P p)) by (change (L^P w <> L^P p) ; lra). + rewrite <-eqb_false_iff in Hrw. rewrite Hrw ; clear Hrw. + assert (Hrw : ~(L^P w < L^P p)%R) by lra. rewrite <-Rltb_false in Hrw. + rewrite Hrw ; clear Hrw. + cbn [map list_sumVS length]. rewrite <-add_assoc. + unfold line_on, line_right, line_left in IH. rewrite IH. clear IH. + enough (Hu : (u p = (-1) * unitary (line_dir L))%VS). + { rewrite Hu. rewrite add_morph. f_equal. rewrite S_INR. lra. } + change (-1)%R with (Ropp 1%R). rewrite minus_morph, mul_1. + apply u_aligned_left ; assumption. + - assert (Hrw : L^P w == L^P p) by now simpl. rewrite <-eqb_true_iff in Hrw. + rewrite Hrw ; clear Hrw. + assert (Hrw : ~(L^P w < L^P p)%R) by lra. rewrite <-Rltb_false in Hrw. + rewrite Hrw ; clear Hrw. + assert (Hrw : ~(L^P p < L^P w)%R) by lra. rewrite <-Rltb_false in Hrw. + rewrite Hrw ; clear Hrw. + cbn [map list_sumVS length]. repeat rewrite add_assoc. rewrite (add_comm _ (u p)). + repeat rewrite <-add_assoc. + unfold line_on, line_right, line_left in IH. rewrite IH. clear IH. + enough (Heq : p == w). + { unfold u. rewrite Heq, add_opp, unitary_origin, add_origin_l. reflexivity. } + rewrite <-Hw, <-Hp, Hpw. reflexivity. + - assert (Hrw : ~(L^P w == L^P p)) by (change (L^P w <> L^P p) ; lra). rewrite <-eqb_false_iff in Hrw. + rewrite Hrw ; clear Hrw. + assert (Hrw : (L^P w < L^P p)%R) by lra. rewrite <-Rltb_true in Hrw. + rewrite Hrw ; clear Hrw. + assert (Hrw : ~(L^P p < L^P w)%R) by lra. rewrite <-Rltb_false in Hrw. + rewrite Hrw ; clear Hrw. + cbn [map list_sumVS length]. rewrite (add_comm (u p)). + repeat rewrite add_assoc. repeat rewrite add_assoc in IH. + unfold line_on, line_right, line_left in IH. rewrite IH. clear IH. + enough (Hu : (u p = 1 * unitary (line_dir L))%VS). + { rewrite Hu. rewrite add_morph. f_equal. rewrite S_INR. lra. } + rewrite mul_1. apply u_aligned_right ; assumption. +Qed. + End WeberFirstOrder. @@ -1655,19 +1744,25 @@ Qed. Lemma weber_majority ps w : countA_occ equiv R2_EqDec w ps > (Nat.div2 (length ps + 1)) -> OnlyWeber ps w. -Proof. Admitted. - +Proof. Admitted. (* This is the first order condition for weber points, * in the special case of aligned points. *) Lemma weber_aligned_spec_weak L ps w : - aligned_on L ps -> + line_dir L =/= 0%VS -> + aligned_on L (w :: ps) -> Weber ps w <-> (Rabs (INR (length (L^left w ps)) - INR (length (L^right w ps))) <= INR (length (L^on w ps)))%R. -Proof. Admitted. +Proof. +intros Hdir Halign. +rewrite weber_first_order. rewrite (aligned_sum_us Halign). +rewrite norm_mul, norm_unitary, Rmult_1_r by assumption. +rewrite <-(line_on_length_aligned L _ _ Halign). +f_equiv. rewrite <-Rabs_Ropp. f_equiv. lra. +Qed. Lemma weber_aligned_spec L ps w : - aligned_on L ps -> + aligned_on L (w :: ps) -> OnlyWeber ps w <-> (Rabs (INR (length (L^left w ps)) - INR (length (L^right w ps))) < INR (length (L^on w ps)))%R. Proof. Admitted. -- GitLab