diff options
| author | Georges Gonthier | 2019-11-22 10:02:04 +0100 |
|---|---|---|
| committer | Assia Mahboubi | 2019-11-22 10:02:04 +0100 |
| commit | 317267c618ecff861ec6539a2d6063cef298d720 (patch) | |
| tree | 8b9f3af02879faf1bba3ee9e7befcb52f44107ed /mathcomp/fingroup/perm.v | |
| parent | b1ca6a9be6861f6c369db642bc194cf78795a66f (diff) | |
New generalised induction idiom (#434)
Replaced the legacy generalised induction idiom with a more robust one
that does not rely on the `{-2}` numerical occurrence selector, using
either new helper lemmas `ubnP` and `ltnSE` or a specific `nat`
induction principle `ltn_ind`.
Added (non-strict in)equality induction helper lemmas
Added `ubnP[lg]?eq` helper lemmas that abstract an integer expression
along with some (in)equality, in preparation for some generalised
induction. Note that while `ubnPleq` is very similar to `ubnP` (indeed
`ubnP M` is basically `ubnPleq M.+1`), `ubnPgeq` is used to remember
that the inductive value remains below the initial one.
Used the change log to give notice to users to update the generalised
induction idioms in their proofs to one of the new forms before
Mathcomp 1.11.
Diffstat (limited to 'mathcomp/fingroup/perm.v')
| -rw-r--r-- | mathcomp/fingroup/perm.v | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/mathcomp/fingroup/perm.v b/mathcomp/fingroup/perm.v index f1ff532..b35ab1d 100644 --- a/mathcomp/fingroup/perm.v +++ b/mathcomp/fingroup/perm.v @@ -465,18 +465,18 @@ Arguments dpair {eT}. Lemma prod_tpermP s : {ts : seq (T * T) | s = \prod_(t <- ts) tperm t.1 t.2 & all dpair ts}. Proof. -elim: {s}_.+1 {-2}s (ltnSn #|[pred x | s x != x]|) => // n IHn s. -rewrite ltnS => le_s_n; case: (pickP (fun x => s x != x)) => [x s_x | s_id]. - have [|ts def_s ne_ts] := IHn (tperm x (s^-1 x) * s). - rewrite (cardD1 x) !inE s_x in le_s_n; apply: leq_ltn_trans le_s_n. - apply: subset_leq_card; apply/subsetP=> y. - rewrite !inE permM permE /= -(canF_eq (permK _)). - have [-> | ne_yx] := altP (y =P x); first by rewrite permKV eqxx. - by case: (s y =P x) => // -> _; rewrite eq_sym. +have [n] := ubnP #|[pred x | s x != x]|; elim: n s => // n IHn s /ltnSE-le_s_n. +case: (pickP (fun x => s x != x)) => [x s_x | s_id]; last first. + exists nil; rewrite // big_nil; apply/permP=> x. + by apply/eqP/idPn; rewrite perm1 s_id. +have [|ts def_s ne_ts] := IHn (tperm x (s^-1 x) * s); last first. exists ((x, s^-1 x) :: ts); last by rewrite /= -(canF_eq (permK _)) s_x. by rewrite big_cons -def_s mulgA tperm2 mul1g. -exists nil; rewrite // big_nil; apply/permP=> x. -by apply/eqP/idPn; rewrite perm1 s_id. +rewrite (cardD1 x) !inE s_x in le_s_n; apply: leq_ltn_trans le_s_n. +apply: subset_leq_card; apply/subsetP=> y. +rewrite !inE permM permE /= -(canF_eq (permK _)). +have [-> | ne_yx] := altP (y =P x); first by rewrite permKV eqxx. +by case: (s y =P x) => // -> _; rewrite eq_sym. Qed. Lemma odd_perm_prod ts : |
