-- Mathlib/Analysis/Convex/SpecificFunctions/Pow.lean
lemma strictConcaveOn_rpow {p : ℝ} (hp₀ : 0 < p) (hp₁ : p < 1) :
    StrictConcaveOn ℝ (Set.Ici 0) fun x : ℝ ↦ x ^ p

Proof state:
case a
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
b' : ℝ≥0 := ⟨b, ⋯⟩
hxy' : x' ≠ y'
⊢ ↑(a' + b') = ↑1

Tactic:
simp [a', b', hab]

Result:
no goals

Proof state:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Tactic:
let x' : ℝ≥0 := ⟨x, hx⟩

Result:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Proof state:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
b' : ℝ≥0 := ⟨b, ⋯⟩
hxy' : x' ≠ y'
⊢ a' + b' = 1

Tactic:
ext

Result:
case a
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
b' : ℝ≥0 := ⟨b, ⋯⟩
hxy' : x' ≠ y'
⊢ ↑(a' + b') = ↑1

Proof state:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
b' : ℝ≥0 := ⟨b, ⋯⟩
hxy' : x' ≠ y'
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Tactic:
have hab' : a' + b' = 1 := by ext; simp [a', b', hab]

Result:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
b' : ℝ≥0 := ⟨b, ⋯⟩
hxy' : x' ≠ y'
hab' : a' + b' = 1
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Proof state:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
b' : ℝ≥0 := ⟨b, ⋯⟩
hxy' : x' ≠ y'
hab' : a' + b' = 1
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Tactic:
exact_mod_cast (NNReal.strictConcaveOn_rpow hp₀ hp₁).2 (Set.mem_univ x') (Set.mem_univ y')
  hxy' (mod_cast ha) (mod_cast hb) hab'

Result:
no goals

Proof state:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
b' : ℝ≥0 := ⟨b, ⋯⟩
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Tactic:
have hxy' : x' ≠ y' := Subtype.coe_ne_coe.1 hxy

Result:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
b' : ℝ≥0 := ⟨b, ⋯⟩
hxy' : x' ≠ y'
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Proof state:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
⊢ StrictConcaveOn ℝ (Ici 0) fun x => x ^ p

Tactic:
refine ⟨convex_Ici _, fun x hx y hy hxy a b ha hb hab => ?_⟩

Result:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Proof state:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Tactic:
let a' : ℝ≥0 := ⟨a, ha.le⟩

Result:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Proof state:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Tactic:
let y' : ℝ≥0 := ⟨y, hy⟩

Result:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Proof state:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)

Tactic:
let b' : ℝ≥0 := ⟨b, hb.le⟩

Result:
p : ℝ
hp₀ : 0 < p
hp₁ : p < 1
x : ℝ
hx : x ∈ Ici 0
y : ℝ
hy : y ∈ Ici 0
hxy : x ≠ y
a b : ℝ
ha : 0 < a
hb : 0 < b
hab : a + b = 1
x' : ℝ≥0 := ⟨x, hx⟩
y' : ℝ≥0 := ⟨y, hy⟩
a' : ℝ≥0 := ⟨a, ⋯⟩
b' : ℝ≥0 := ⟨b, ⋯⟩
⊢ a • (fun x => x ^ p) x + b • (fun x => x ^ p) y < (fun x => x ^ p) (a • x + b • y)