diff --git a/FEM/Algebra/AffineSpace.v b/FEM/Algebra/AffineSpace.v index f1dd7f32f463e87af462a3e4a93124ebb35c76df..3c54e44b4009d0d0752204da9f642f65947d63f5 100644 --- a/FEM/Algebra/AffineSpace.v +++ b/FEM/Algebra/AffineSpace.v @@ -1604,11 +1604,11 @@ exists (unfun0F f L1); repeat split; try easy. apply unfun0F_ub; easy. apply barycenter_correct_equiv; try easy; unfold is_comb_aff. rewrite -comb_lin_filter_n0F_l filter_n0F_unfun0F. -pose (Hp1 := proj1 (proj2_sig (injF_restr_bij_EX Hf'))); fold Hp1. -pose (q1 := f_inv Hp1); pose (Hq1 := f_inv_inj Hp1); - fold q1 Hq1; fold q1 in Hp1, Hq1. +pose (q1 := proj1_sig (injF_restr_bij_EX Hf')); fold q1. +pose (Hq1a := proj1 (proj2_sig (injF_restr_bij_EX Hf'))); fold q1 in Hq1a. +pose (Hq1b := bij_inj Hq1a). rewrite 2!comb_lin_castF_l. -rewrite -(comb_lin_permutF Hq1) -comb_lin_filter_n0F_l in HG1. +rewrite -(comb_lin_permutF Hq1b) -comb_lin_filter_n0F_l in HG1. rewrite -HG1; f_equal; rewrite -castF_sym_equiv. apply sym_eq; rewrite -castF_sym_equiv. rewrite filter_n0F_gen_unfun0F_l; repeat f_equal. diff --git a/FEM/Algebra/Finite_family.v b/FEM/Algebra/Finite_family.v index 46fd0207315e64f1153c15c5ac0f2dedc9fb0d7c..83da1b867c895b982c3ff2ca74989c4a95d5e7b3 100644 --- a/FEM/Algebra/Finite_family.v +++ b/FEM/Algebra/Finite_family.v @@ -1490,35 +1490,27 @@ Qed. Definition incrF {n1 n2} (f : 'I_{n1,n2}) : Prop := forall (i1 j1 : 'I_n1), (i1 < j1)%coq_nat -> (f i1 < f j1)%coq_nat. -Lemma injF_restr_bij_EX : +Lemma incrF_inj : forall {n1 n2} {f : 'I_{n1,n2}}, incrF f -> injective f. +Proof. +move=>> Hf i1 j1; apply contra_equiv; + move=> /ord_neq_compat /not_eq [H1 | H1]; [| apply not_eq_sym]; + apply ord_neq, Nat.lt_neq, Hf, H1. +Qed. + +Lemma injF_restr_bij_EX' : forall {n1 n2} {f : 'I_{n1,n2}} (Hf : injective f), { p1 : 'I_[n1] | bijective p1 /\ exists (g : 'I_{n1,n2}), incrF g /\ f = g \o p1 }. (* g := f \o f_inv Hp1 *) Proof. (* Hint: pas besoin d'induction! p1^-1 est la permutation permettant de trier f 'I_n1 et q = f o p1^-1. *) -intros n1 n2 f Hf; apply constructive_indefinite_description; - induction n1 as [|n1 Hn1]. -(* *) -exists id; split; [apply bij_id |]. -destruct n2 as [|n2]; [exists id | exists (fun=> ord0)]; - (split; [| apply fun_ext]); intros [i Hi]; easy. -(* *) -pose (f' := fun i1 => f (widen_S i1)). -assert (Hf' : injective f') by now move=> i1 j1 /Hf /widen_ord_inj. -destruct (Hn1 _ Hf') as [p' [Hp' [g' [Hg' H']]]]; clear Hn1. -pose (p'1 := f_inv Hp'). -(* -pose (nn1 := widen_ord (inj_ord_leq Hf) ord_max). -pose (p := fun i2 => transp_ord (p' nn1) (f ord_max) (p' i2)). -exists p; repeat split. -*) - - - - - +Admitted. +Lemma injF_restr_bij_EX : + forall {n1 n2} {f : 'I_{n1,n2}} (Hf : injective f), + { q1 : 'I_[n1] | bijective q1 /\ incrF (f \o q1) }. +Proof. +(* Hint: pas besoin d'induction, q1 est la permutation permettant de trier f 'I_n1. *) Admitted. End Fun_ord. @@ -1724,6 +1716,30 @@ move=>> Hp i; left; exists (f_inv (injF_bij Hp) i); split; [| unfold permutF]; rewrite f_inv_correct_r; easy. Qed. +Lemma extendPF_incrF : + forall {n1 n2} {f : 'I_{n1,n2}} (Hf : injective f) + {P1 : 'Prop^n1} {P2 : 'Prop^n2} (HP : extendPF f P1 P2), + let q1 := proj1_sig (injF_restr_bij_EX Hf) in + extendPF (f \o q1) (permutF q1 P1) P2. +Proof. +intros n1 n2 f Hf P1 P2 HP q1. +pose (Hq1a := proj1 (proj2_sig (injF_restr_bij_EX Hf))). +pose (Hq1b := proj2 (proj2_sig (injF_restr_bij_EX Hf))). +pose (p1 := f_inv Hq1a); fold q1 in Hq1a, Hq1b. +apply extendPF_unfunF_equiv; [apply (incrF_inj Hq1b) |]. +rewrite (extendPF_unfunF_rev Hf HP); apply extF; intros i2. +destruct (im_dec f i2) as [[k1 ->] | Hi2]. +(* *) +unfold permutF. +rewrite -{2}(f_inv_correct_r Hq1a k1) -(comp_correct q1 f); fold p1. +rewrite (unfunF_correct_l _ k1)// + (unfunF_correct_l _ (p1 k1) _ (incrF_inj Hq1b))//. +unfold p1; rewrite f_inv_correct_r; easy. +(* *) +rewrite !unfunF_correct_r//; intros k1; contradict Hi2. +rewrite not_all_not_ex_equiv; exists (q1 k1); auto. +Qed. + End ExtendPF_Facts. @@ -4599,6 +4615,29 @@ destruct j1 as [j1 Hj1]; simpl in Hj. move: (leq_addr j n1); rewrite Hj leqNgt; contradict Hj1; apply /negP; easy. Qed. +Lemma filterP_ord_incrF : + forall {n1 n2} {g : 'I_{n1,n2}} (Hg : incrF g) {P1 : 'Prop^n1} + {P2 : 'Prop^n2} (HP : extendPF g P1 P2) {j1 : 'I_(lenPF P1)}, + g (filterP_ord j1) = + filterP_ord (cast_ord (lenPF_extendPF (incrF_inj Hg) HP) j1). +Proof. +intros n1 n2 g Hg P1 P2 HP j1. + + +Admitted. + +Lemma filterP_f_ord_incrF : + forall {n1 n2} {g : 'I_{n1,n2}} (Hg : incrF g) + {P1 : 'Prop^n1} {P2 : 'Prop^n2} (HP : extendPF g P1 P2) + {i1} (HP2 : P2 (g i1)) {j1 : 'I_(lenPF P1)}, + filterP_f_ord g HP2 j1 = cast_ord (lenPF_extendPF (incrF_inj Hg) HP) j1. +Proof. +intros n1 n2 g Hg P1 P2 HP i1 HP2 j1. +move: (extendPF_unfunF_rev (incrF_inj Hg) HP) => HP2'; subst. +apply filterP_ord_inj; rewrite (filterP_f_ord_correct _ (incrF_inj Hg) HP). +apply filterP_ord_incrF. +Qed. + (* Was: Lemma filterPF_funF : forall {F : Type} {n1 n2} {f : 'I_{n1,n2}} {P1 : 'Prop^n1} {P2 : 'Prop^n2} @@ -4669,51 +4708,31 @@ rewrite HA2; [ apply maskPF_correct_r; rewrite -Rg_compl_equiv |]; rewrite Rg_compl; easy. Qed. -Lemma filterP_f_ord_incr : - forall {n1 n2} {g : 'I_{n1,n2}} {P1 : 'Prop^n1} {P2 : 'Prop^n2} - {i1} (HP2 : P2 (g i1)) (H : lenPF P1 = lenPF P2) {j1 : 'I_(lenPF P1)}, - incrF g -> filterP_f_ord g HP2 j1 = cast_ord H j1. -Proof. -intros n1 n2 g P1 P2 i1 HP2 H j1 Hg; unfold filterP_f_ord. - - - - -Admitted. - Lemma filterPF_unfunF : forall {F : Type} {n1 n2} {f : 'I_{n1,n2}} (Hf : injective f) {P1 : 'I_n1 -> Prop} {P2 : 'I_n2 -> Prop} (HP : extendPF f P1 P2) {A1 : 'F^n1} x0 i1, P1 i1 -> - let Hp1 := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in - let q1 := f_inv Hp1 in - let Hq1 := f_inv_inj Hp1 in + let q1 := proj1_sig (injF_restr_bij_EX Hf) in + let Hq1a := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in + let Hq1b := bij_inj Hq1a in filterPF P2 (unfunF f A1 x0) = - castF (lenPF_extendPF Hf HP) (castF (lenPF_permutF Hq1) + castF (lenPF_extendPF Hf HP) (castF (lenPF_permutF Hq1b) (filterPF (permutF q1 P1) (permutF q1 A1))). Proof. -intros F n1 n2 f Hf P1 P2 HP A1 x0 i1 HP1 Hp1 q1 Hq1; fold q1 in Hq1. -pose (p1 := proj1_sig (injF_restr_bij_EX Hf)); pose (Hp1' := bij_inj Hp1). -destruct (proj2 (proj2_sig (injF_restr_bij_EX Hf))) as [g [Hg1 Hg2]]. -fold p1 in Hp1, Hp1', Hg2. -assert (Hg2' : forall k1, f k1 = g (p1 k1)) by now intros; rewrite Hg2. -assert (Hg3 : g = f \o q1). - rewrite Hg2; unfold q1; apply fun_ext; intro. - rewrite !comp_correct f_inv_correct_r; easy. -assert (Hg3' : forall k1, g k1 = f (q1 k1)) by now intros; rewrite Hg3. -assert (HP1' : P1 (q1 (p1 i1))) by now unfold q1; rewrite f_inv_correct_l. +intros F n1 n2 f Hf P1 P2 HP A1 x0 i1 HP1 q1 Hq1a Hq1b. +pose (Hq1c := proj2 (proj2_sig (injF_restr_bij_EX Hf))); + pose (p1 := f_inv Hq1a); fold q1 in Hq1a, Hq1b, Hq1c. +assert (HP1' : P1 (q1 (p1 i1))) by now unfold p1; rewrite f_inv_correct_r. assert (HP2 : P2 (f i1)) by now rewrite (extendPF_unfunF_rev Hf HP) (unfunF_correct_l _ i1). -assert (HP2' : P2 (g (p1 i1))) by now rewrite -Hg2'. -subst g. +assert (HP2' : P2 (f (q1 (p1 i1)))) by now rewrite f_inv_correct_r. (* *) -rewrite (filterPF_permutF HP1' Hq1) -{2}(funF_unfunF x0 Hf A1). +rewrite (filterPF_permutF HP1' Hq1b) -{2}(funF_unfunF x0 Hf A1). rewrite (filterPF_funF HP2' Hf HP). -apply extF; intros j2; unfold castF, funF, filterP_f_ord_n; f_equal. -rewrite -(filterP_f_ord_comp_l HP1' Hq1). -rewrite (filterP_f_ord_incr HP2' - (eq_trans (lenPF_permutF Hq1) (lenPF_extendPF Hf HP)) Hg1). +apply extF; intros j2; unfold castF, funF; f_equal. +rewrite -(filterP_f_ord_comp_l HP1' Hq1b). +rewrite (filterP_f_ord_incrF Hq1c (extendPF_incrF Hf HP)). rewrite 2!cast_ord_comp cast_ord_id; easy. Qed. @@ -4727,14 +4746,14 @@ Qed. Lemma filter_neqF_gen_unfunF : forall {F : Type} {n1 n2} {f : 'I_{n1,n2}} (Hf : injective f) (A1 : 'E^n1) x0 (B1 : 'F^n1) y0, - let Hp1 := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in - let q1 := f_inv Hp1 in - let Hq1 := f_inv_inj Hp1 in + let q1 := proj1_sig (injF_restr_bij_EX Hf) in + let Hq1a := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in + let Hq1b := bij_inj Hq1a in filter_neqF_gen (unfunF f A1 x0) x0 (unfunF f B1 y0) = - castF (len_neqF_unfunF Hf) (castF (lenPF_permutF Hq1) + castF (len_neqF_unfunF Hf) (castF (lenPF_permutF Hq1b) (filter_neqF_gen (permutF q1 A1) x0 (permutF q1 B1))). Proof. -intros F n1 n2 f Hf A1 x0 B1 y0 Hp1 q1 Hq1. +intros F n1 n2 f Hf A1 x0 B1 y0 q1 Hq1a Hq1b. destruct (excluded_middle_informative (forall i1, A1 i1 = x0)) as [HA1 | HA1]. apply eqAF_nil; left; apply lenPF0_alt; intuition. move: HA1 => /not_all_ex_not_equiv [i0 Hi0]. @@ -4746,14 +4765,14 @@ Qed. Lemma filter_neqF_gen_unfunF_l : forall {F : Type} (HF : inhabited F) {n1 n2} {f : 'I_{n1,n2}} (Hf : injective f) (A1 : 'E^n1) x0 (B2 : 'F^n2), - let Hp1 := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in - let q1 := f_inv Hp1 in - let Hq1 := f_inv_inj Hp1 in + let q1 := proj1_sig (injF_restr_bij_EX Hf) in + let Hq1a := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in + let Hq1b := bij_inj Hq1a in filter_neqF_gen (unfunF f A1 x0) x0 B2 = - castF (len_neqF_unfunF Hf) (castF (lenPF_permutF Hq1) + castF (len_neqF_unfunF Hf) (castF (lenPF_permutF Hq1b) (filter_neqF_gen (permutF q1 A1) x0 (permutF q1 (funF f B2)))). Proof. -intros F [y0] n1 n2 f Hf A1 x0 B2 Hp1 q1 Hq1. +intros F [y0] n1 n2 f Hf A1 x0 B2 q1 Hq1a Hq1b. rewrite -(filter_neqF_gen_unfunF _ _ _ _ y0); apply filterPF_ext_r; intro. move=> /(proj1 contra_equiv (unfunF_correct_r _ _)) /not_all_not_ex [i1 ->]. rewrite unfunF_funF// maskPF_correct_l//. @@ -4761,11 +4780,11 @@ Qed. Lemma filter_neqF_unfunF : forall {n1 n2} {f : 'I_{n1,n2}} (Hf : injective f) (A1 : 'E^n1) x0, - let Hp1 := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in - let q1 := f_inv Hp1 in - let Hq1 := f_inv_inj Hp1 in + let q1 := proj1_sig (injF_restr_bij_EX Hf) in + let Hq1a := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in + let Hq1b := bij_inj Hq1a in filter_neqF (unfunF f A1 x0) x0 = - castF (len_neqF_unfunF Hf) (castF (lenPF_permutF Hq1) + castF (len_neqF_unfunF Hf) (castF (lenPF_permutF Hq1b) (filter_neqF (permutF q1 A1) x0)). Proof. intros; unfold filter_neqF; rewrite filter_neqF_gen_unfunF_l; diff --git a/FEM/Algebra/Monoid_compl.v b/FEM/Algebra/Monoid_compl.v index 6a0a7610d8b756e6d02cd3828b65aaac8a35d7c8..d327b691e1f97ba5e958ae4e1d29f4d4d9010051 100644 --- a/FEM/Algebra/Monoid_compl.v +++ b/FEM/Algebra/Monoid_compl.v @@ -580,11 +580,11 @@ Proof. move=>>; apply len_neqF_unfunF. Qed. Lemma filter_n0F_gen_unfun0F : forall {H : AbelianMonoid} {n1 n2} {f : 'I_{n1,n2}} (Hf : injective f) (u1 : 'G^n1) (v1 : 'H^n1), - let Hp1 := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in - let q1 := f_inv Hp1 in - let Hq1 := f_inv_inj Hp1 in + let q1 := proj1_sig (injF_restr_bij_EX Hf) in + let Hq1a := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in + let Hq1b := bij_inj Hq1a in filter_n0F_gen (unfun0F f u1) (unfun0F f v1) = - castF (len_n0F_unfun0F Hf) (castF (lenPF_permutF Hq1) + castF (len_n0F_unfun0F Hf) (castF (lenPF_permutF Hq1b) (filter_n0F_gen (permutF q1 u1) (permutF q1 v1))). Proof. intros; unfold filter_n0F_gen; @@ -594,11 +594,11 @@ Qed. Lemma filter_n0F_gen_unfun0F_l : forall {H : AbelianMonoid} {n1 n2} {f : 'I_{n1,n2}} (Hf : injective f) (u1 : 'G^n1) (u2 : 'H^n2), - let Hp1 := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in - let q1 := f_inv Hp1 in - let Hq1 := f_inv_inj Hp1 in + let q1 := proj1_sig (injF_restr_bij_EX Hf) in + let Hq1a := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in + let Hq1b := bij_inj Hq1a in filter_n0F_gen (unfun0F f u1) u2 = - castF (len_n0F_unfun0F Hf) (castF (lenPF_permutF Hq1) + castF (len_n0F_unfun0F Hf) (castF (lenPF_permutF Hq1b) (filter_n0F_gen (permutF q1 u1) (permutF q1 (funF f u2)))). Proof. intros; unfold filter_n0F_gen; rewrite filter_neqF_gen_unfunF_l; @@ -607,11 +607,11 @@ Qed. Lemma filter_n0F_unfun0F : forall {n1 n2} {f : 'I_{n1,n2}} (Hf : injective f) (u1 : 'G^n1), - let Hp1 := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in - let q1 := f_inv Hp1 in - let Hq1 := f_inv_inj Hp1 in + let q1 := proj1_sig (injF_restr_bij_EX Hf) in + let Hq1a := proj1 (proj2_sig (injF_restr_bij_EX Hf)) in + let Hq1b := bij_inj Hq1a in filter_n0F (unfun0F f u1) = - castF (len_n0F_unfun0F Hf) (castF (lenPF_permutF Hq1) + castF (len_n0F_unfun0F Hf) (castF (lenPF_permutF Hq1b) (filter_n0F (permutF q1 u1))). Proof. intros; unfold filter_n0F; rewrite filter_neqF_unfunF; apply castF_eq_l. diff --git a/FEM/Compl/Function_compl.v b/FEM/Compl/Function_compl.v index 4c697dc3c3e0ee23daa2004e51352e14bfc0bd82..9ff4ffa4b45f8180e88bc28cf8ae4b68cfafef9c 100644 --- a/FEM/Compl/Function_compl.v +++ b/FEM/Compl/Function_compl.v @@ -57,7 +57,7 @@ End Function_Facts1. Section Function_Facts2. Lemma comp_correct : - forall {U V W : Type} {f : U -> V} {g : V -> W} {x}, (g \o f) x = g (f x). + forall {U V W : Type} (f : U -> V) (g : V -> W) x, (g \o f) x = g (f x). Proof. easy. Qed. Lemma comp_assoc :