Skip to content

Commit 925c6ab

Browse files
YaelDillieseric-wieseralexjbest
committed
feat: positivity extensions for Finset.card, Fintype.card (#10610)
Leverage the new `proveFinsetNonempty` prover to write a `positivity` extension about `Finset.card`. Also write the corresponding `positivity` extension for `Fintype.card`. I put the two new extensions in a new file rather than `Tactic.Positivity.Basic` or `Data.Fintype.Card` because the former doesn't import any finiteness and the latter doesn't import linearly ordered fields. But I don't really mind where the extensions end up. From LeanAPAP Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Alex J Best <alex.j.best@gmail.com>
1 parent 2f2096e commit 925c6ab

File tree

4 files changed

+52
-0
lines changed

4 files changed

+52
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3579,6 +3579,7 @@ import Mathlib.Tactic.Polyrith
35793579
import Mathlib.Tactic.Positivity
35803580
import Mathlib.Tactic.Positivity.Basic
35813581
import Mathlib.Tactic.Positivity.Core
3582+
import Mathlib.Tactic.Positivity.Finset
35823583
import Mathlib.Tactic.ProdAssoc
35833584
import Mathlib.Tactic.ProjectionNotation
35843585
import Mathlib.Tactic.Propose

Mathlib/Tactic.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ import Mathlib.Tactic.Polyrith
137137
import Mathlib.Tactic.Positivity
138138
import Mathlib.Tactic.Positivity.Basic
139139
import Mathlib.Tactic.Positivity.Core
140+
import Mathlib.Tactic.Positivity.Finset
140141
import Mathlib.Tactic.ProdAssoc
141142
import Mathlib.Tactic.ProjectionNotation
142143
import Mathlib.Tactic.Propose
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/-
2+
Copyright (c) 2023 Yaël Dillies. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yaël Dillies
5+
-/
6+
import Mathlib.Data.Fintype.Card
7+
import Mathlib.Tactic.Positivity.Core
8+
9+
/-!
10+
# Positivity extensions for finsets
11+
12+
This file provides a few `positivity` extensions that cannot be in either the finset files (because
13+
they don't know about ordered fields) or in `Tactic.Positivity.Basic` (because it doesn't want to
14+
know about finiteness).
15+
-/
16+
17+
namespace Mathlib.Meta.Positivity
18+
19+
open Qq Lean Meta Finset
20+
21+
/-- Extension for `Finset.card`. `s.card` is positive if `s` is nonempty.
22+
23+
It calls `Mathlib.Meta.proveFinsetNonempty` to attempt proving that the finset is nonempty. -/
24+
@[positivity Finset.card _]
25+
def evalFinsetCard : PositivityExt where eval {u α} _ _ e := do
26+
match u, α, e with
27+
| 0, ~q(ℕ), ~q(Finset.card $s) =>
28+
let some ps ← proveFinsetNonempty s | return .none
29+
assertInstancesCommute
30+
return .positive q(Finset.Nonempty.card_pos $ps)
31+
| _ => throwError "not Finset.card"
32+
33+
/-- Extension for `Fintype.card`. `Fintype.card α` is positive if `α` is nonempty. -/
34+
@[positivity Fintype.card _]
35+
def evalFintypeCard : PositivityExt where eval {u α} _ _ e := do
36+
match u, α, e with
37+
| 0, ~q(ℕ), ~q(@Fintype.card $β $instβ) =>
38+
let instβno ← synthInstanceQ q(Nonempty $β)
39+
assumeInstancesCommute
40+
return .positive q(@Fintype.card_pos $β $instβ $instβno)
41+
| _ => throwError "not Fintype.card"
42+
43+
example {α : Type*} {s : Finset α} (hs : s.Nonempty) : 0 < s.card := by positivity
44+
example {α : Type*} {s : Finset α} : 0 ≤ s.card := by positivity
45+
example {α : Type*} [Fintype α] [Nonempty α] : 0 < (univ : Finset α).card := by positivity
46+
example {α : Type*} [Fintype α] [Nonempty α] : 0 < Fintype.card α := by positivity
47+
example {α : Type*} [Fintype α] : 0 ≤ Fintype.card α := by positivity
48+
49+
end Mathlib.Meta.Positivity

scripts/noshake.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@
216216
["Mathlib.Data.ZMod.Basic", "Mathlib.RingTheory.Polynomial.Basic"],
217217
"Mathlib.Tactic.ProxyType": ["Mathlib.Logic.Equiv.Defs"],
218218
"Mathlib.Tactic.ProdAssoc": ["Mathlib.Logic.Equiv.Defs"],
219+
"Mathlib.Tactic.Positivity.Finset": ["Mathlib.Data.Fintype.Card"],
219220
"Mathlib.Tactic.Positivity.Basic":
220221
["Mathlib.Data.Int.CharZero", "Mathlib.Data.Nat.Factorial.Basic"],
221222
"Mathlib.Tactic.NormNum.Ineq":

0 commit comments

Comments
 (0)