Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+🖱️to focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2022 Mario Carneiro, Heather Macbeth. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Mario Carneiro, Heather Macbeth, Yaël Dillies
-/
import Std.Lean.Parser
import Mathlib.Data.Int.Order.Basic
import Mathlib.Data.Nat.Factorial.Basic
import Mathlib.Tactic.Positivity.Core
import Mathlib.Algebra.GroupPower.Order
import Mathlib.Algebra.Order.Field.Basic
import Qq

/-!
## `positivity` core extensions

This file sets up the basic `positivity` extensions tagged with the `@[positivity]` attribute.
-/

namespace Mathlib.Meta.Positivity
open Lean Meta Qq Function

section LinearOrder
variable [
LinearOrder: Type ?u.21 → Type ?u.21
LinearOrder
R: ?m.4
R
] {
a: R
a
b: R
b
c: R
c
:
R: ?m.4
R
} private lemma
le_min_of_lt_of_le: a < ba ca min b c
le_min_of_lt_of_le
(
ha: a < b
ha
:
a: R
a
<
b: R
b
) (
hb: a c
hb
:
a: R
a
c: R
c
) :
a: R
a
min: {α : Type ?u.657} → [self : Min α] → ααα
min
b: R
b
c: R
c
:=
le_min: ∀ {α : Type ?u.740} [inst : LinearOrder α] {a b c : α}, c ac bc min a b
le_min
ha: a < b
ha
.
le: ∀ {α : Type ?u.790} [inst : Preorder α] {a b : α}, a < ba b
le
hb: a c
hb
private lemma
le_min_of_le_of_lt: ∀ {R : Type u_1} [inst : LinearOrder R] {a b c : R}, a ba < ca min b c
le_min_of_le_of_lt
(
ha: a b
ha
:
a: R
a
b: R
b
) (
hb: a < c
hb
:
a: R
a
<
c: R
c
) :
a: R
a
min: {α : Type ?u.1798} → [self : Min α] → ααα
min
b: R
b
c: R
c
:=
le_min: ∀ {α : Type ?u.1881} [inst : LinearOrder α] {a b c : α}, c ac bc min a b
le_min
ha: a b
ha
hb: a < c
hb
.
le: ∀ {α : Type ?u.1935} [inst : Preorder α] {a b : α}, a < ba b
le
private lemma
min_ne: ∀ {R : Type u_1} [inst : LinearOrder R] {a b c : R}, a cb cmin a b c
min_ne
(
ha: a c
ha
:
a: R
a
c: R
c
) (
hb: b c
hb
:
b: R
b
c: R
c
) :
min: {α : Type ?u.2322} → [self : Min α] → ααα
min
a: R
a
b: R
b
c: R
c
:=

Goals accomplished! 🐙
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


min a b c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


min a b c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


(if a b then a else b) c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


(if a b then a else b) c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


(if a b then a else b) c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


min a b c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c

h✝: a b


inl
a c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c

h✝: ¬a b


inr
b c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


(if a b then a else b) c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c

h✝: a b


inl
a c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c

h✝: ¬a b


inr
b c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


(if a b then a else b) c

Goals accomplished! 🐙
private lemma
min_ne_of_ne_of_lt: a cc < bmin a b c
min_ne_of_ne_of_lt
(
ha: a c
ha
:
a: R
a
c: R
c
) (
hb: c < b
hb
:
c: R
c
<
b: R
b
) :
min: {α : Type ?u.3242} → [self : Min α] → ααα
min
a: R
a
b: R
b
c: R
c
:=
min_ne: ∀ {R : Type ?u.3335} [inst : LinearOrder R] {a b c : R}, a cb cmin a b c
min_ne
ha: a c
ha
hb: c < b
hb
.
ne': ∀ {α : Type ?u.3380} [inst : Preorder α] {x y : α}, x < yy x
ne'
private lemma
min_ne_of_lt_of_ne: ∀ {R : Type u_1} [inst : LinearOrder R] {a b c : R}, c < ab cmin a b c
min_ne_of_lt_of_ne
(
ha: c < a
ha
:
c: R
c
<
a: R
a
) (
hb: b c
hb
:
b: R
b
c: R
c
) :
min: {α : Type ?u.4119} → [self : Min α] → ααα
min
a: R
a
b: R
b
c: R
c
:=
min_ne: ∀ {R : Type ?u.4212} [inst : LinearOrder R] {a b c : R}, a cb cmin a b c
min_ne
ha: c < a
ha
.
ne': ∀ {α : Type ?u.4256} [inst : Preorder α] {x y : α}, x < yy x
ne'
hb: b c
hb
private lemma
max_ne: ∀ {R : Type u_1} [inst : LinearOrder R] {a b c : R}, a cb cmax a b c
max_ne
(
ha: a c
ha
:
a: R
a
c: R
c
) (
hb: b c
hb
:
b: R
b
c: R
c
) :
max: {α : Type ?u.4647} → [self : Max α] → ααα
max
a: R
a
b: R
b
c: R
c
:=

Goals accomplished! 🐙
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


max a b c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


max a b c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


(if a b then b else a) c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


(if a b then b else a) c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


(if a b then b else a) c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


max a b c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c

h✝: a b


inl
b c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c

h✝: ¬a b


inr
a c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


(if a b then b else a) c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c

h✝: a b


inl
b c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c

h✝: ¬a b


inr
a c
R: Type u_1

inst✝: LinearOrder R

a, b, c: R

ha: a c

hb: b c


(if a b then b else a) c

Goals accomplished! 🐙
end LinearOrder /-- The `positivity` extension which identifies expressions of the form `min a b`, such that `positivity` successfully recognises both `a` and `b`. -/ @[positivity
min: {α : Type ?u.15863} → [self : Min α] → ααα
min
_: ?m.15864
_
_: ?m.15864
_
] def
evalMin: PositivityExt
evalMin
:
PositivityExt: Type
PositivityExt
where eval {
u: ?m.5135
u
α: ?m.5138
α
}
: ?m.5141
: ?m.5144
e: ?m.5147
e
:= do let
.app: ExprExprExpr
.app
(
.app: ExprExprExpr
.app
(
f: Q(«$α»«$α»«$α»)
f
: Q($α → $α → $α)) (
a: Q(«$α»)
a
: Q($α))) (
b: Q(«$α»)
b
: Q($α)) ←
withReducible: {n : TypeType ?u.5210} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withReducible
(
whnf: ExprMetaM Expr
whnf
e: ?m.5147
e
) |
throwError "not min": ?m.8674 ?m.8675
throwError
throwError "not min": ?m.8674 ?m.8675
"not min"
let
_e_eq: «$e» =Q «$f» «$a» «$b»
_e_eq
: $
e: «$α»
e
=Q $
f: «$α»«$α»«$α»
f
$
a: «$α»
a
$
b: «$α»
b
:=
⟨⟩: «$e» =Q «$f» «$a» «$b»
⟨⟩
let
_a: ?m.5462
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
LinearOrder: Type ?u.5448 → Type ?u.5448
LinearOrder
LinearOrder $α: ?m.5135
$
α: Type u
α
) : Q(
Type u: ?m.5135
Type u
)) assumeInstancesCommute let
_f_eq: «$f» =Q min
_f_eq
⟩ ←
withDefault: {n : TypeType ?u.7073} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withDefault
<|
withNewMCtxDepth: {n : TypeType ?u.7119} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αoptParam Bool falsen α
withNewMCtxDepth
<|
assertDefEqQ: {u : Level} → {α : let u := u; Q(Sort u)} → (a b : Q(«$α»)) → MetaM (PLift («$a» =Q «$b»))
assertDefEqQ
(u :=
u: ?m.5135
u
.
succ: LevelLevel
succ
)
f: Q(«$α»«$α»«$α»)
f
q(
min: ?m.5135
min
) match
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.5141
: ?m.5144
a: Q(«$α»)
a
, ←
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.5141
: ?m.5144
b: Q(«$α»)
b
with |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=>
pure: {f : Type ?u.7440 → Type ?u.7439} → [self : Pure f] → {α : Type ?u.7440} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
q(
lt_min: ∀ {α : Type ?u.7471} [inst : LinearOrder α] {a b c : α}, a < ba < ca < min b c
lt_min
lt_min $pa $pb: ?m.5135
$
pa: 0 < «$a»
pa
lt_min $pa $pb: ?m.5135
$
pb: 0 < «$b»
pb
)) |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=>
pure: {f : Type ?u.7579 → Type ?u.7578} → [self : Pure f] → {α : Type ?u.7579} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
le_min_of_lt_of_le: ∀ {R : Type ?u.7610} [inst : LinearOrder R] {a b c : R}, a < ba ca min b c
le_min_of_lt_of_le
le_min_of_lt_of_le $pa $pb: ?m.5135
$
pa: 0 < «$a»
pa
le_min_of_lt_of_le $pa $pb: ?m.5135
$
pb: 0 «$b»
pb
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=>
pure: {f : Type ?u.7686 → Type ?u.7685} → [self : Pure f] → {α : Type ?u.7686} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
le_min_of_le_of_lt: ∀ {R : Type ?u.7717} [inst : LinearOrder R] {a b c : R}, a ba < ca min b c
le_min_of_le_of_lt
le_min_of_le_of_lt $pa $pb: ?m.5135
$
pa: 0 «$a»
pa
le_min_of_le_of_lt $pa $pb: ?m.5135
$
pb: 0 < «$b»
pb
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
,
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=>
pure: {f : Type ?u.7783 → Type ?u.7782} → [self : Pure f] → {α : Type ?u.7783} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
le_min: ∀ {α : Type ?u.7814} [inst : LinearOrder α] {a b c : α}, c ac bc min a b
le_min
le_min $pa $pb: ?m.5135
$
pa: 0 «$a»
pa
le_min $pa $pb: ?m.5135
$
pb: 0 «$b»
pb
)) |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pb: Q(«$b» 0)
pb
=>
pure: {f : Type ?u.7882 → Type ?u.7881} → [self : Pure f] → {α : Type ?u.7882} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
q(
min_ne_of_lt_of_ne: ∀ {R : Type ?u.7913} [inst : LinearOrder R] {a b c : R}, c < ab cmin a b c
min_ne_of_lt_of_ne
min_ne_of_lt_of_ne $pa $pb: ?m.5135
$
pa: 0 < «$a»
pa
min_ne_of_lt_of_ne $pa $pb: ?m.5135
$
pb: «$b» 0
pb
)) |
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pa: Q(«$a» 0)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=>
pure: {f : Type ?u.7979 → Type ?u.7978} → [self : Pure f] → {α : Type ?u.7979} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
q(
min_ne_of_ne_of_lt: ∀ {R : Type ?u.8010} [inst : LinearOrder R] {a b c : R}, a cc < bmin a b c
min_ne_of_ne_of_lt
min_ne_of_ne_of_lt $pa $pb: ?m.5135
$
pa: «$a» 0
pa
min_ne_of_ne_of_lt $pa $pb: ?m.5135
$
pb: 0 < «$b»
pb
)) |
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pa: Q(«$a» 0)
pa
,
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pb: Q(«$b» 0)
pb
=>
pure: {f : Type ?u.8073 → Type ?u.8072} → [self : Pure f] → {α : Type ?u.8073} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
q(
min_ne: ∀ {R : Type ?u.8104} [inst : LinearOrder R] {a b c : R}, a cb cmin a b c
min_ne
min_ne $pa $pb: ?m.5135
$
pa: «$a» 0
pa
min_ne $pa $pb: ?m.5135
$
pb: «$b» 0
pb
)) | _, _ =>
pure: {f : Type ?u.8154 → Type ?u.8153} → [self : Pure f] → {α : Type ?u.8154} → αf α
pure
.none: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Strictness e
.none
/-- Extension for the `max` operator. The `max` of two numbers is nonnegative if at least one is nonnegative, strictly positive if at least one is positive, and nonzero if both are nonzero. -/ @[positivity
max: {α : Type ?u.25669} → [self : Max α] → ααα
max
_: ?m.25670
_
_: ?m.25670
_
] def
evalMax: PositivityExt
evalMax
:
PositivityExt: Type
PositivityExt
where eval {
u: ?m.15887
u
α: ?m.15890
α
}
: ?m.15893
: ?m.15896
e: ?m.15899
e
:= do let
.app: ExprExprExpr
.app
(
.app: ExprExprExpr
.app
(
f: Q(«$α»«$α»«$α»)
f
: Q($α → $α → $α)) (
a: Q(«$α»)
a
: Q($α))) (
b: Q(«$α»)
b
: Q($α)) ←
withReducible: {n : TypeType ?u.15962} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withReducible
(
whnf: ExprMetaM Expr
whnf
e: ?m.15899
e
) |
throwError "not max": ?m.19545 ?m.19546
throwError
throwError "not max": ?m.19545 ?m.19546
"not max"
let
_e_eq: «$e» =Q «$f» «$a» «$b»
_e_eq
: $
e: «$α»
e
=Q $
f: «$α»«$α»«$α»
f
$
a: «$α»
a
$
b: «$α»
b
:=
⟨⟩: «$e» =Q «$f» «$a» «$b»
⟨⟩
let
_a: ?m.16214
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
LinearOrder: Type ?u.16200 → Type ?u.16200
LinearOrder
LinearOrder $α: ?m.15887
$
α: Type u
α
) : Q(
Type u: Type (u+1)
Type u
)) assumeInstancesCommute let
_f_eq: «$f» =Q max
_f_eq
⟩ ←
withDefault: {n : TypeType ?u.17825} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withDefault
<|
withNewMCtxDepth: {n : TypeType ?u.17871} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αoptParam Bool falsen α
withNewMCtxDepth
<|
assertDefEqQ: {u : Level} → {α : let u := u; Q(Sort u)} → (a b : Q(«$α»)) → MetaM (PLift («$a» =Q «$b»))
assertDefEqQ
(u :=
u: ?m.15887
u
.
succ: LevelLevel
succ
)
f: Q(«$α»«$α»«$α»)
f
q(
max: ?m.15887
max
) let
result: Strictness e
result
:
Strictness: {u : Level} → {α : Q(Type u)} → Q(Zero «$α»)Q(PartialOrder «$α»)Q(«$α»)Type
Strictness
: ?m.15893
: ?m.15896
e: ?m.15899
e
catchNone: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → MetaM (Strictness e)MetaM (Strictness e)
catchNone
do let
ra: ?m.18167
ra
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.15893
: ?m.15896
a: Q(«$α»)
a
match
ra: ?m.18167
ra
with |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
=>
pure: {f : Type ?u.18184 → Type ?u.18183} → [self : Pure f] → {α : Type ?u.18184} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
q(
lt_max_of_lt_left: ∀ {α : Type ?u.18215} [inst : LinearOrder α] {a b c : α}, a < ba < max b c
lt_max_of_lt_left
lt_max_of_lt_left $pa: ?m.15887
$
pa: 0 < «$a»
pa
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
=>
pure: {f : Type ?u.18309 → Type ?u.18308} → [self : Pure f] → {α : Type ?u.18309} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
le_max_of_le_left: ∀ {α : Type ?u.18340} [inst : LinearOrder α] {a b c : α}, a ba max b c
le_max_of_le_left
le_max_of_le_left $pa: ?m.15887
$
pa: 0 «$a»
pa
)) -- If `a ≠ 0`, we might prove `max a b ≠ 0` if `b ≠ 0` but we don't want to evaluate -- `b` before having ruled out `0 < a`, for performance. So we do that in the second branch -- of the `orElse'`. | _ =>
pure: {f : Type ?u.18393 → Type ?u.18392} → [self : Pure f] → {α : Type ?u.18393} → αf α
pure
.none: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Strictness e
.none
orElse: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Strictness eMetaM (Strictness e)MetaM (Strictness e)
orElse
result: Strictness e
result
do let
rb: ?m.18649
rb
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.15893
: ?m.15896
b: Q(«$α»)
b
match
rb: ?m.18649
rb
with |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=>
pure: {f : Type ?u.18666 → Type ?u.18665} → [self : Pure f] → {α : Type ?u.18666} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
q(
lt_max_of_lt_right: ∀ {α : Type ?u.18699} [inst : LinearOrder α] {a b c : α}, a < ca < max b c
lt_max_of_lt_right
lt_max_of_lt_right $pb: ?m.15887
$
pb: 0 < «$b»
pb
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=>
pure: {f : Type ?u.18810 → Type ?u.18809} → [self : Pure f] → {α : Type ?u.18810} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
le_max_of_le_right: ∀ {α : Type ?u.18841} [inst : LinearOrder α] {a b c : α}, a ca max b c
le_max_of_le_right
le_max_of_le_right $pb: ?m.15887
$
pb: 0 «$b»
pb
)) |
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pb: Q(«$b» 0)
pb
=> do match
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.15893
: ?m.15896
a: Q(«$α»)
a
with |
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pa: Q(«$a» 0)
pa
=>
pure: {f : Type ?u.18967 → Type ?u.18966} → [self : Pure f] → {α : Type ?u.18967} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
q(
max_ne: ∀ {R : Type ?u.18998} [inst : LinearOrder R] {a b c : R}, a cb cmax a b c
max_ne
max_ne $pa $pb: ?m.15887
$
pa: «$a» 0
pa
max_ne $pa $pb: ?m.15887
$
pb: «$b» 0
pb
)) | _ =>
pure: {f : Type ?u.19044 → Type ?u.19043} → [self : Pure f] → {α : Type ?u.19044} → αf α
pure
.none: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Strictness e
.none
| _ =>
pure: {f : Type ?u.19210 → Type ?u.19209} → [self : Pure f] → {α : Type ?u.19210} → αf α
pure
.none: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Strictness e
.none
/-- The `positivity` extension which identifies expressions of the form `a + b`, such that `positivity` successfully recognises both `a` and `b`. -/ @[positivity
_: ?m.37274
_
+
_: ?m.37277
_
,
Add.add: {α : Type ?u.37295} → [self : Add α] → ααα
Add.add
_: ?m.37296
_
_: ?m.37296
_
] def
evalAdd: PositivityExt
evalAdd
:
PositivityExt: Type
PositivityExt
where eval {
u: ?m.25693
u
α: ?m.25696
α
}
: ?m.25699
: ?m.25702
e: ?m.25705
e
:= do let
.app: ExprExprExpr
.app
(
.app: ExprExprExpr
.app
(
f: Q(«$α»«$α»«$α»)
f
: Q($α → $α → $α)) (
a: Q(«$α»)
a
: Q($α))) (
b: Q(«$α»)
b
: Q($α)) ←
withReducible: {n : TypeType ?u.25768} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withReducible
(
whnf: ExprMetaM Expr
whnf
e: ?m.25705
e
) |
throwError "not +": ?m.30239 ?m.30240
throwError
throwError "not +": ?m.30239 ?m.30240
"not +"
let
_e_eq: «$e» =Q «$f» «$a» «$b»
_e_eq
: $
e: «$α»
e
=Q $
f: «$α»«$α»«$α»
f
$
a: «$α»
a
$
b: «$α»
b
:=
⟨⟩: «$e» =Q «$f» «$a» «$b»
⟨⟩
let
_a: ?m.26020
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
AddZeroClass: Type ?u.26006 → Type ?u.26006
AddZeroClass
AddZeroClass $α: ?m.25693
$
α: Type u
α
) : Q(
Type u: ?m.25693
Type u
)) assumeInstancesCommute let
_f_eq: «$f» =Q HAdd.hAdd
_f_eq
⟩ ←
withDefault: {n : TypeType ?u.27404} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withDefault
<|
withNewMCtxDepth: {n : TypeType ?u.27450} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αoptParam Bool falsen α
withNewMCtxDepth
<|
assertDefEqQ: {u : Level} → {α : let u := u; Q(Sort u)} → (a b : Q(«$α»)) → MetaM (PLift («$a» =Q «$b»))
assertDefEqQ
(u :=
u: ?m.25693
u
.
succ: LevelLevel
succ
)
f: Q(«$α»«$α»«$α»)
f
q(
HAdd.hAdd: ?m.25693
HAdd.hAdd
) let
ra: ?m.27825
ra
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.25699
: ?m.25702
a: Q(«$α»)
a
; let
rb: ?m.27877
rb
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.25699
: ?m.25702
b: Q(«$α»)
b
match
ra: ?m.27825
ra
,
rb: ?m.27877
rb
with |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=> let
_a: ?m.28237
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
CovariantClass: (M : Type ?u.27962) → (N : Type ?u.27961) → (MNN) → (NNProp) → Prop
CovariantClass
CovariantClass $α $α (·+·) (·<·): ?m.25693
$
α: Type u
α
CovariantClass $α $α (·+·) (·<·): ?m.25693
$
α: Type u
α
CovariantClass $α $α (·+·) (·<·): ?m.25693
(·+·): «$α»«$α»«$α»
(·+·)
CovariantClass $α $α (·+·) (·<·): ?m.25693
(·<·): «$α»«$α»Prop
(·<·)
) : Q(
Prop: Type
Prop
))
pure: {f : Type ?u.28240 → Type ?u.28239} → [self : Pure f] → {α : Type ?u.28240} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
q(
add_pos: ∀ {α : Type ?u.28271} [inst : AddZeroClass α] [inst_1 : Preorder α] [inst_2 : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1] {a b : α}, 0 < a0 < b0 < a + b
add_pos
add_pos $pa $pb: ?m.25693
$
pa: 0 < «$a»
pa
add_pos $pa $pb: ?m.25693
$
pb: 0 < «$b»
pb
)) |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=> let
_a: ?m.28755
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
CovariantClass: (M : Type ?u.28483) → (N : Type ?u.28482) → (MNN) → (NNProp) → Prop
CovariantClass
CovariantClass $α $α (swap (·+·)) (·<·): ?m.25693
$
α: Type u
α
CovariantClass $α $α (swap (·+·)) (·<·): ?m.25693
$
α: Type u
α
CovariantClass $α $α (swap (·+·)) (·<·): ?m.25693
(
swap: {α : Sort ?u.28486} → {β : Sort ?u.28485} → {φ : αβSort ?u.28484} → ((x : α) → (y : β) → φ x y) → (y : β) → (x : α) → φ x y
swap
CovariantClass $α $α (swap (·+·)) (·<·): ?m.25693
(·+·): «$α»«$α»«$α»
(·+·)
CovariantClass $α $α (swap (·+·)) (·<·): ?m.25693
)
(·<·): «$α»«$α»Prop
(·<·)
) : Q(
Prop: Type
Prop
))
pure: {f : Type ?u.28758 → Type ?u.28757} → [self : Pure f] → {α : Type ?u.28758} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
q(
lt_add_of_pos_of_le: ∀ {α : Type ?u.28789} [inst : AddZeroClass α] [inst_1 : Preorder α] [inst_2 : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1] {a b c : α}, 0 < ab cb < a + c
lt_add_of_pos_of_le
lt_add_of_pos_of_le $pa $pb: ?m.25693
$
pa: 0 < «$a»
pa
lt_add_of_pos_of_le $pa $pb: ?m.25693
$
pb: 0 «$b»
pb
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=> let
_a: ?m.29212
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
CovariantClass: (M : Type ?u.28962) → (N : Type ?u.28961) → (MNN) → (NNProp) → Prop
CovariantClass
CovariantClass $α $α (·+·) (·<·): ?m.25693
$
α: Type u
α
CovariantClass $α $α (·+·) (·<·): ?m.25693
$
α: Type u
α
CovariantClass $α $α (·+·) (·<·): ?m.25693
(·+·): «$α»«$α»«$α»
(·+·)
CovariantClass $α $α (·+·) (·<·): ?m.25693
(·<·): «$α»«$α»Prop
(·<·)
) : Q(
Prop: Type
Prop
))
pure: {f : Type ?u.29215 → Type ?u.29214} → [self : Pure f] → {α : Type ?u.29215} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
q(
lt_add_of_le_of_pos: ∀ {α : Type ?u.29246} [inst : AddZeroClass α] [inst_1 : Preorder α] [inst_2 : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1] {a b c : α}, b c0 < ab < c + a
lt_add_of_le_of_pos
lt_add_of_le_of_pos $pa $pb: ?m.25693
$
pa: 0 «$a»
pa
lt_add_of_le_of_pos $pa $pb: ?m.25693
$
pb: 0 < «$b»
pb
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
,
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=> let
_a: ?m.29682
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
CovariantClass: (M : Type ?u.29410) → (N : Type ?u.29409) → (MNN) → (NNProp) → Prop
CovariantClass
CovariantClass $α $α (·+·) (·≤·): ?m.25693
$
α: Type u
α
CovariantClass $α $α (·+·) (·≤·): ?m.25693
$
α: Type u
α
CovariantClass $α $α (·+·) (·≤·): ?m.25693
(·+·): «$α»«$α»«$α»
(·+·)
CovariantClass $α $α (·+·) (·≤·): ?m.25693
(·≤·): «$α»«$α»Prop
(·≤·)
) : Q(
Prop: Type
Prop
))
pure: {f : Type ?u.29685 → Type ?u.29684} → [self : Pure f] → {α : Type ?u.29685} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
add_nonneg: ∀ {α : Type ?u.29716} [inst : AddZeroClass α] [inst_1 : Preorder α] [inst_2 : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x x_1] {a b : α}, 0 a0 b0 a + b
add_nonneg
add_nonneg $pa $pb: ?m.25693
$
pa: 0 «$a»
pa
add_nonneg $pa $pb: ?m.25693
$
pb: 0 «$b»
pb
)) | _, _ =>
failure: {f : Type ?u.29824 → Type ?u.29823} → [self : Alternative f] → {α : Type ?u.29824} → f α
failure
private theorem
mul_nonneg_of_pos_of_nonneg: ∀ {α : Type u_1} [inst : OrderedSemiring α] {a b : α}, 0 < a0 b0 a * b
mul_nonneg_of_pos_of_nonneg
[
OrderedSemiring: Type ?u.37331 → Type ?u.37331
OrderedSemiring
α: ?m.37328
α
] {
a: α
a
b: α
b
:
α: ?m.37328
α
} (
ha: 0 < a
ha
:
0: ?m.37340
0
<
a: α
a
) (
hb: 0 b
hb
:
0: ?m.37684
0
b: α
b
) :
0: ?m.37797
0
a: α
a
*
b: α
b
:=
mul_nonneg: ∀ {α : Type ?u.38180} {a b : α} [inst : MulZeroClass α] [inst_1 : Preorder α] [inst_2 : PosMulMono α], 0 a0 b0 a * b
mul_nonneg
ha: 0 < a
ha
.
le: ∀ {α : Type ?u.38534} [inst : Preorder α] {a b : α}, a < ba b
le
hb: 0 b
hb
private theorem
mul_nonneg_of_nonneg_of_pos: ∀ {α : Type u_1} [inst : OrderedSemiring α] {a b : α}, 0 a0 < b0 a * b
mul_nonneg_of_nonneg_of_pos
[
OrderedSemiring: Type ?u.38662 → Type ?u.38662
OrderedSemiring
α: ?m.38659
α
] {
a: α
a
b: α
b
:
α: ?m.38659
α
} (
ha: 0 a
ha
:
0: ?m.38671
0
a: α
a
) (
hb: 0 < b
hb
:
0: ?m.39015
0
<
b: α
b
) :
0: ?m.39128
0
a: α
a
*
b: α
b
:=
mul_nonneg: ∀ {α : Type ?u.39511} {a b : α} [inst : MulZeroClass α] [inst_1 : Preorder α] [inst_2 : PosMulMono α], 0 a0 b0 a * b
mul_nonneg
ha: 0 a
ha
hb: 0 < b
hb
.
le: ∀ {α : Type ?u.39867} [inst : Preorder α] {a b : α}, a < ba b
le
private theorem
mul_ne_zero_of_ne_zero_of_pos: ∀ {α : Type u_1} [inst : OrderedSemiring α] [inst_1 : NoZeroDivisors α] {a b : α}, a 00 < ba * b 0
mul_ne_zero_of_ne_zero_of_pos
[
OrderedSemiring: Type ?u.39992 → Type ?u.39992
OrderedSemiring
α: ?m.39989
α
] [
NoZeroDivisors: (M₀ : Type ?u.39995) → [inst : Mul M₀] → [inst : Zero M₀] → Prop
NoZeroDivisors
α: ?m.39989
α
] {
a: α
a
b: α
b
:
α: ?m.39989
α
} (
ha: a 0
ha
:
a: α
a
0: ?m.40393
0
) (
hb: 0 < b
hb
:
0: ?m.40574
0
<
b: α
b
) :
a: α
a
*
b: α
b
0: ?m.41024
0
:=
mul_ne_zero: ∀ {M₀ : Type ?u.41041} [inst : Mul M₀] [inst_1 : Zero M₀] [inst_2 : NoZeroDivisors M₀] {a b : M₀}, a 0b 0a * b 0
mul_ne_zero
ha: a 0
ha
(
ne_of_gt: ∀ {α : Type ?u.41139} [inst : Preorder α] {a b : α}, b < aa b
ne_of_gt
hb: 0 < b
hb
) private theorem
mul_ne_zero_of_pos_of_ne_zero: ∀ {α : Type u_1} [inst : OrderedSemiring α] [inst_1 : NoZeroDivisors α] {a b : α}, 0 < ab 0a * b 0
mul_ne_zero_of_pos_of_ne_zero
[
OrderedSemiring: Type ?u.41662 → Type ?u.41662
OrderedSemiring
α: ?m.41659
α
] [
NoZeroDivisors: (M₀ : Type ?u.41665) → [inst : Mul M₀] → [inst : Zero M₀] → Prop
NoZeroDivisors
α: ?m.41659
α
] {
a: α
a
b: α
b
:
α: ?m.41659
α
} (
ha: 0 < a
ha
:
0: ?m.42062
0
<
a: α
a
) (
hb: b 0
hb
:
b: α
b
0: ?m.42355
0
) :
a: α
a
*
b: α
b
0: ?m.42694
0
:=
mul_ne_zero: ∀ {M₀ : Type ?u.42711} [inst : Mul M₀] [inst_1 : Zero M₀] [inst_2 : NoZeroDivisors M₀] {a b : M₀}, a 0b 0a * b 0
mul_ne_zero
(
ne_of_gt: ∀ {α : Type ?u.42808} [inst : Preorder α] {a b : α}, b < aa b
ne_of_gt
ha: 0 < a
ha
)
hb: b 0
hb
/-- The `positivity` extension which identifies expressions of the form `a * b`, such that `positivity` successfully recognises both `a` and `b`. -/ @[positivity
_: ?m.53628
_
*
_: ?m.53631
_
,
Mul.mul: {α : Type ?u.53651} → [self : Mul α] → ααα
Mul.mul
_: ?m.53652
_
_: ?m.53652
_
] def
evalMul: PositivityExt
evalMul
:
PositivityExt: Type
PositivityExt
where eval {
u: ?m.43329
u
α: ?m.43332
α
}
: ?m.43335
: ?m.43338
e: ?m.43341
e
:= do let
.app: ExprExprExpr
.app
(
.app: ExprExprExpr
.app
(
f: Q(«$α»«$α»«$α»)
f
: Q($α → $α → $α)) (
a: Q(«$α»)
a
: Q($α))) (
b: Q(«$α»)
b
: Q($α)) ←
withReducible: {n : TypeType ?u.43404} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withReducible
(
whnf: ExprMetaM Expr
whnf
e: ?m.43341
e
) |
throwError "not *": ?m.46614 ?m.46615
throwError
throwError "not *": ?m.46614 ?m.46615
"not *"
let
_e_eq: «$e» =Q «$f» «$a» «$b»
_e_eq
: $
e: «$α»
e
=Q $
f: «$α»«$α»«$α»
f
$
a: «$α»
a
$
b: «$α»
b
:=
⟨⟩: «$e» =Q «$f» «$a» «$b»
⟨⟩
let
_a: ?m.43656
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
StrictOrderedSemiring: Type ?u.43642 → Type ?u.43642
StrictOrderedSemiring
StrictOrderedSemiring $α: ?m.43329
$
α: Type u
α
) : Q(
Type u: Type (u+1)
Type u
)) assumeInstancesCommute let
_f_eq: «$f» =Q HMul.hMul
_f_eq
⟩ ←
withDefault: {n : TypeType ?u.43993} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withDefault
<|
withNewMCtxDepth: {n : TypeType ?u.44039} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αoptParam Bool falsen α
withNewMCtxDepth
<|
assertDefEqQ: {u : Level} → {α : let u := u; Q(Sort u)} → (a b : Q(«$α»)) → MetaM (PLift («$a» =Q «$b»))
assertDefEqQ
(u :=
u: ?m.43329
u
.
succ: LevelLevel
succ
)
f: Q(«$α»«$α»«$α»)
f
q(
HMul.hMul: {α : Type ?u.44091} → {β : Type ?u.44090} → {γ : outParam (Type ?u.44089)} → [self : HMul α β γ] → αβγ
HMul.hMul
) let
ra: ?m.44348
ra
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.43335
: ?m.43338
a: Q(«$α»)
a
; let
rb: ?m.44400
rb
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.43335
: ?m.43338
b: Q(«$α»)
b
match
ra: ?m.44348
ra
,
rb: ?m.44400
rb
with |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=>
pure: {f : Type ?u.44436 → Type ?u.44435} → [self : Pure f] → {α : Type ?u.44436} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
q(
mul_pos: ∀ {α : Type ?u.44467} {a b : α} [inst : MulZeroClass α] [inst_1 : Preorder α] [inst_2 : PosMulStrictMono α], 0 < a0 < b0 < a * b
mul_pos
mul_pos $pa $pb: ?m.43329
$
pa: 0 < «$a»
pa
mul_pos $pa $pb: ?m.43329
$
pb: 0 < «$b»
pb
)) |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=>
pure: {f : Type ?u.44841 → Type ?u.44840} → [self : Pure f] → {α : Type ?u.44841} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
mul_nonneg_of_pos_of_nonneg: ∀ {α : Type ?u.44872} [inst : OrderedSemiring α] {a b : α}, 0 < a0 b0 a * b
mul_nonneg_of_pos_of_nonneg
mul_nonneg_of_pos_of_nonneg $pa $pb: ?m.43329
$
pa: 0 < «$a»
pa
mul_nonneg_of_pos_of_nonneg $pa $pb: ?m.43329
$
pb: 0 «$b»
pb
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=>
pure: {f : Type ?u.44983 → Type ?u.44982} → [self : Pure f] → {α : Type ?u.44983} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
mul_nonneg_of_nonneg_of_pos: ∀ {α : Type ?u.45014} [inst : OrderedSemiring α] {a b : α}, 0 a0 < b0 a * b
mul_nonneg_of_nonneg_of_pos
mul_nonneg_of_nonneg_of_pos $pa $pb: ?m.43329
$
pa: 0 «$a»
pa
mul_nonneg_of_nonneg_of_pos $pa $pb: ?m.43329
$
pb: 0 < «$b»
pb
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
,
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=>
pure: {f : Type ?u.45064 → Type ?u.45063} → [self : Pure f] → {α : Type ?u.45064} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
mul_nonneg: ∀ {α : Type ?u.45095} {a b : α} [inst : MulZeroClass α] [inst_1 : Preorder α] [inst_2 : PosMulMono α], 0 a0 b0 a * b
mul_nonneg
mul_nonneg $pa $pb: ?m.43329
$
pa: 0 «$a»
pa
mul_nonneg $pa $pb: ?m.43329
$
pb: 0 «$b»
pb
)) |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pb: Q(«$b» 0)
pb
=> let
_a: ?m.45437
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
NoZeroDivisors: (M₀ : Type ?u.45292) → [inst : Mul M₀] → [inst : Zero M₀] → Prop
NoZeroDivisors
NoZeroDivisors $α: ?m.43329
$
α: Type u
α
) : Q(
Prop: Type
Prop
))
pure: {f : Type ?u.45440 → Type ?u.45439} → [self : Pure f] → {α : Type ?u.45440} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
q(
mul_ne_zero_of_pos_of_ne_zero: ∀ {α : Type ?u.45471} [inst : OrderedSemiring α] [inst_1 : NoZeroDivisors α] {a b : α}, 0 < ab 0a * b 0
mul_ne_zero_of_pos_of_ne_zero
mul_ne_zero_of_pos_of_ne_zero $pa $pb: ?m.43329
$
pa: 0 < «$a»
pa
mul_ne_zero_of_pos_of_ne_zero $pa $pb: ?m.43329
$
pb: «$b» 0
pb
)) |
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pa: Q(«$a» 0)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=> let
_a: ?m.45668
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
NoZeroDivisors: (M₀ : Type ?u.45659) → [inst : Mul M₀] → [inst : Zero M₀] → Prop
NoZeroDivisors
NoZeroDivisors $α: ?m.43329
$
α: Type u
α
) : Q(
Prop: Type
Prop
))
pure: {f : Type ?u.45671 → Type ?u.45670} → [self : Pure f] → {α : Type ?u.45671} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
q(
mul_ne_zero_of_ne_zero_of_pos: ∀ {α : Type ?u.45702} [inst : OrderedSemiring α] [inst_1 : NoZeroDivisors α] {a b : α}, a 00 < ba * b 0
mul_ne_zero_of_ne_zero_of_pos
mul_ne_zero_of_ne_zero_of_pos $pa $pb: ?m.43329
$
pa: «$a» 0
pa
mul_ne_zero_of_ne_zero_of_pos $pa $pb: ?m.43329
$
pb: 0 < «$b»
pb
)) |
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pa: Q(«$a» 0)
pa
,
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pb: Q(«$b» 0)
pb
=> let
_a: ?m.45878
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
NoZeroDivisors: (M₀ : Type ?u.45869) → [inst : Mul M₀] → [inst : Zero M₀] → Prop
NoZeroDivisors
NoZeroDivisors $α: ?m.43329
$
α: Type u
α
) : Q(
Prop: Type
Prop
))
pure: {f : Type ?u.45881 → Type ?u.45880} → [self : Pure f] → {α : Type ?u.45881} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
(q(
mul_ne_zero: ∀ {M₀ : Type ?u.45912} [inst : Mul M₀] [inst_1 : Zero M₀] [inst_2 : NoZeroDivisors M₀] {a b : M₀}, a 0b 0a * b 0
mul_ne_zero
mul_ne_zero $pa $pb: ?m.43329
$
pa: «$a» 0
pa
mul_ne_zero $pa $pb: ?m.43329
$
pb: «$b» 0
pb
))) | _, _ =>
pure: {f : Type ?u.46160 → Type ?u.46159} → [self : Pure f] → {α : Type ?u.46160} → αf α
pure
.none: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Strictness e
.none
private lemma
int_div_self_pos: ∀ {a : }, 0 < a0 < a / a
int_div_self_pos
{
a:
a
:
: Type
} (
ha: 0 < a
ha
:
0: ?m.53688
0
<
a:
a
) :
0: ?m.53725
0
<
a:
a
/
a:
a
:=

Goals accomplished! 🐙
a:

ha: 0 < a


0 < a / a
a:

ha: 0 < a


0 < a / a
a:

ha: 0 < a


0 < a / a
a:

ha: 0 < a


0 < a / a
a:

ha: 0 < a


0 < 1
a:

ha: 0 < a


0 < 1
a:

ha: 0 < a


0 < 1
a:

ha: 0 < a


0 < a / a

Goals accomplished! 🐙

Goals accomplished! 🐙
private lemma
int_div_nonneg_of_pos_of_nonneg: ∀ {a b : }, 0 < a0 b0 a / b
int_div_nonneg_of_pos_of_nonneg
{
a:
a
b:
b
:
: Type
} (
ha: 0 < a
ha
:
0: ?m.54569
0
<
a:
a
) (
hb: 0 b
hb
:
0: ?m.54606
0
b:
b
) :
0: ?m.54635
0
a:
a
/
b:
b
:=
Int.ediv_nonneg: ∀ {a b : }, 0 a0 b0 a / b
Int.ediv_nonneg
ha: 0 < a
ha
.
le: ∀ {α : Type ?u.54732} [inst : Preorder α] {a b : α}, a < ba b
le
hb: 0 b
hb
private lemma
int_div_nonneg_of_nonneg_of_pos: ∀ {a b : }, 0 a0 < b0 a / b
int_div_nonneg_of_nonneg_of_pos
{
a:
a
b:
b
:
: Type
} (
ha: 0 a
ha
:
0: ?m.54799
0
a:
a
) (
hb: 0 < b
hb
:
0: ?m.54836
0
<
b:
b
) :
0: ?m.54865
0
a:
a
/
b:
b
:=
Int.ediv_nonneg: ∀ {a b : }, 0 a0 b0 a / b
Int.ediv_nonneg
ha: 0 a
ha
hb: 0 < b
hb
.
le: ∀ {α : Type ?u.54962} [inst : Preorder α] {a b : α}, a < ba b
le
private lemma
int_div_nonneg_of_pos_of_pos: ∀ {a b : }, 0 < a0 < b0 a / b
int_div_nonneg_of_pos_of_pos
{
a:
a
b:
b
:
: Type
} (
ha: 0 < a
ha
:
0: ?m.55029
0
<
a:
a
) (
hb: 0 < b
hb
:
0: ?m.55066
0
<
b:
b
) :
0: ?m.55092
0
a:
a
/
b:
b
:=
Int.ediv_nonneg: ∀ {a b : }, 0 a0 b0 a / b
Int.ediv_nonneg
ha: 0 < a
ha
.
le: ∀ {α : Type ?u.55192} [inst : Preorder α] {a b : α}, a < ba b
le
hb: 0 < b
hb
.
le: ∀ {α : Type ?u.55248} [inst : Preorder α] {a b : α}, a < ba b
le
/-- The `positivity` extension which identifies expressions of the form `a / b`, where `a` and `b` are integers. -/ @[positivity (
_:
_
: ℤ) / (
_:
_
: ℤ)] def
evalIntDiv: PositivityExt
evalIntDiv
:
PositivityExt: Type
PositivityExt
where eval {
_u: ?m.55267
_u
: ?m.55270
}
: ?m.55273
: ?m.55276
e: ?m.55279
e
:= do let
.app: ExprExprExpr
.app
(
.app: ExprExprExpr
.app
f: Expr
f
(
a: Q()
a
: Q(ℤ))) (
b: Q()
b
: Q(ℤ)) ←
withReducible: {n : TypeType ?u.55342} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withReducible
(
whnf: ExprMetaM Expr
whnf
e: ?m.55279
e
) |
throwError "not /": ?m.57039 ?m.57040
throwError
throwError "not /": ?m.57039 ?m.57040
"not /"
let
ra: ?m.55552
ra
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.55273
: ?m.55276
a: Q()
a
; let
rb: ?m.55604
rb
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.55273
: ?m.55276
b: Q()
b
guard: {f : TypeType ?u.55848} → [inst : Alternative f] → (p : Prop) → [inst : Decidable p] → f Unit
guard
<|←
withDefault: {n : TypeType ?u.55648} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withDefault
<|
withNewMCtxDepth: {n : TypeType ?u.55694} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αoptParam Bool falsen α
withNewMCtxDepth
<|
isDefEq: ExprExprMetaM Bool
isDefEq
f: Expr
f
q(
HDiv.hDiv: {α : Type ?u.55754} → {β : Type ?u.55753} → {γ : outParam (Type ?u.55752)} → [self : HDiv α β γ] → αβγ
HDiv.hDiv
(α :=
: Type
) (β :=
: Type
)) match
ra: ?m.55552
ra
,
rb: ?m.55604
rb
with |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=> have
pa': Q(0 < «$a»)
pa'
: Q(
0: ?m.56009
0
< $
a:
a
) :=
pa: Q(0 < «$a»)
pa
have
pb': Q(0 < «$b»)
pb'
: Q(
0: ?m.56049
0
< $
b:
b
) :=
pb: Q(0 < «$b»)
pb
if
pa: Q(0 < «$a»)
pa
==
pb: Q(0 < «$b»)
pb
then -- Only attempts to prove `0 < a / a`, otherwise falls back to `0 ≤ a / b`
pure: {f : Type ?u.56149 → Type ?u.56148} → [self : Pure f] → {α : Type ?u.56149} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
(q(
int_div_self_pos: ∀ {a : }, 0 < a0 < a / a
int_div_self_pos
$
pa': 0 < «$a»
pa'
) :
Expr: Type
Expr
)) else
pure: {f : Type ?u.56218 → Type ?u.56217} → [self : Pure f] → {α : Type ?u.56218} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
(q(
int_div_nonneg_of_pos_of_pos: ∀ {a b : }, 0 < a0 < b0 a / b
int_div_nonneg_of_pos_of_pos
$
pa': 0 < «$a»
pa'
$
pb': 0 < «$b»
pb'
) :
Expr: Type
Expr
)) |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=> have
pa': Q(0 < «$a»)
pa'
: Q(
0: ?m.56303
0
< $
a:
a
) :=
pa: Q(0 < «$a»)
pa
have
pb': Q(0 «$b»)
pb'
: Q(
0: ?m.56332
0
≤ $
b:
b
) :=
pb: Q(0 «$b»)
pb
pure: {f : Type ?u.56359 → Type ?u.56358} → [self : Pure f] → {α : Type ?u.56359} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
(q(
int_div_nonneg_of_pos_of_nonneg: ∀ {a b : }, 0 < a0 b0 a / b
int_div_nonneg_of_pos_of_nonneg
$
pa': 0 < «$a»
pa'
$
pb': 0 «$b»
pb'
) :
Expr: Type
Expr
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=> have
pa': Q(0 «$a»)
pa'
: Q(
0: ?m.56443
0
≤ $
a:
a
) :=
pa: Q(0 «$a»)
pa
have
pb': Q(0 < «$b»)
pb'
: Q(
0: ?m.56472
0
< $
b:
b
) :=
pb: Q(0 < «$b»)
pb
pure: {f : Type ?u.56496 → Type ?u.56495} → [self : Pure f] → {α : Type ?u.56496} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
(q(
int_div_nonneg_of_nonneg_of_pos: ∀ {a b : }, 0 a0 < b0 a / b
int_div_nonneg_of_nonneg_of_pos
$
pa': 0 «$a»
pa'
$
pb': 0 < «$b»
pb'
) :
Expr: Type
Expr
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
,
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=> have
pa': Q(0 «$a»)
pa'
: Q(
0: ?m.56576
0
≤ $
a:
a
) :=
pa: Q(0 «$a»)
pa
have
pb': Q(0 «$b»)
pb'
: Q(
0: ?m.56605
0
≤ $
b:
b
) :=
pb: Q(0 «$b»)
pb
pure: {f : Type ?u.56629 → Type ?u.56628} → [self : Pure f] → {α : Type ?u.56629} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
(q(
Int.ediv_nonneg: ∀ {a b : }, 0 a0 b0 a / b
Int.ediv_nonneg
$
pa': 0 «$a»
pa'
$
pb': 0 «$b»
pb'
) :
Expr: Type
Expr
)) | _, _ =>
pure: {f : Type ?u.56690 → Type ?u.56689} → [self : Pure f] → {α : Type ?u.56690} → αf α
pure
.none: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Strictness e
.none
section LinearOrderedSemifield variable [
LinearOrderedSemifield: Type ?u.63074 → Type ?u.63074
LinearOrderedSemifield
R: ?m.63083
R
] {
a: R
a
b: R
b
:
R: ?m.63071
R
} private lemma
div_nonneg_of_pos_of_nonneg: ∀ {R : Type u_1} [inst : LinearOrderedSemifield R] {a b : R}, 0 < a0 b0 a / b
div_nonneg_of_pos_of_nonneg
(
ha: 0 < a
ha
:
0: ?m.63095
0
<
a: R
a
) (
hb: 0 b
hb
:
0: ?m.63251
0
b: R
b
) :
0: ?m.63332
0
a: R
a
/
b: R
b
:=
div_nonneg: ∀ {α : Type ?u.63423} [inst : LinearOrderedSemifield α] {a b : α}, 0 a0 b0 a / b
div_nonneg
ha: 0 < a
ha
.
le: ∀ {α : Type ?u.63467} [inst : Preorder α] {a b : α}, a < ba b
le
hb: 0 b
hb
private lemma
div_nonneg_of_nonneg_of_pos: ∀ {R : Type u_1} [inst : LinearOrderedSemifield R] {a b : R}, 0 a0 < b0 a / b
div_nonneg_of_nonneg_of_pos
(
ha: 0 a
ha
:
0: ?m.63573
0
a: R
a
) (
hb: 0 < b
hb
:
0: ?m.63729
0
<
b: R
b
) :
0: ?m.63810
0
a: R
a
/
b: R
b
:=
div_nonneg: ∀ {α : Type ?u.63901} [inst : LinearOrderedSemifield α] {a b : α}, 0 a0 b0 a / b
div_nonneg
ha: 0 a
ha
hb: 0 < b
hb
.
le: ∀ {α : Type ?u.63945} [inst : Preorder α] {a b : α}, a < ba b
le
private lemma
div_ne_zero_of_pos_of_ne_zero: 0 < ab 0a / b 0
div_ne_zero_of_pos_of_ne_zero
(
ha: 0 < a
ha
:
0: ?m.64051
0
<
a: R
a
) (
hb: b 0
hb
:
b: R
b
0: ?m.64208
0
) :
a: R
a
/
b: R
b
0: ?m.64279
0
:=
div_ne_zero: ∀ {G₀ : Type ?u.64286} [inst : GroupWithZero G₀] {a b : G₀}, a 0b 0a / b 0
div_ne_zero
ha: 0 < a
ha
.
ne': ∀ {α : Type ?u.64336} [inst : Preorder α] {x y : α}, x < yy x
ne'
hb: b 0
hb
private lemma
div_ne_zero_of_ne_zero_of_pos: a 00 < ba / b 0
div_ne_zero_of_ne_zero_of_pos
(
ha: a 0
ha
:
a: R
a
0: ?m.64449
0
) (
hb: 0 < b
hb
:
0: ?m.64512
0
<
b: R
b
) :
a: R
a
/
b: R
b
0: ?m.64676
0
:=
div_ne_zero: ∀ {G₀ : Type ?u.64683} [inst : GroupWithZero G₀] {a b : G₀}, a 0b 0a / b 0
div_ne_zero
ha: a 0
ha
hb: 0 < b
hb
.
ne': ∀ {α : Type ?u.64734} [inst : Preorder α] {x y : α}, x < yy x
ne'
end LinearOrderedSemifield /-- The `positivity` extension which identifies expressions of the form `a / b`, such that `positivity` successfully recognises both `a` and `b`. -/ @[positivity
_: ?m.72696
_
/
_: ?m.72699
_
] def
evalDiv: PositivityExt
evalDiv
:
PositivityExt: Type
PositivityExt
where eval {
u: ?m.64833
u
α: ?m.64836
α
}
: ?m.64839
: ?m.64842
e: ?m.64845
e
:= do let
.app: ExprExprExpr
.app
(
.app: ExprExprExpr
.app
(
f: Q(«$α»«$α»«$α»)
f
: Q($α → $α → $α)) (
a: Q(«$α»)
a
: Q($α))) (
b: Q(«$α»)
b
: Q($α)) ←
withReducible: {n : TypeType ?u.64908} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withReducible
(
whnf: ExprMetaM Expr
whnf
e: ?m.64845
e
) |
throwError "not /": ?m.66751 ?m.66752
throwError
throwError "not /": ?m.66751 ?m.66752
"not /"
let
_e_eq: «$e» =Q «$f» «$a» «$b»
_e_eq
: $
e: «$α»
e
=Q $
f: «$α»«$α»«$α»
f
$
a: «$α»
a
$
b: «$α»
b
:=
⟨⟩: «$e» =Q «$f» «$a» «$b»
⟨⟩
let
_a: ?m.65160
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
LinearOrderedSemifield: Type ?u.65146 → Type ?u.65146
LinearOrderedSemifield
LinearOrderedSemifield $α: ?m.64833
$
α: Type u
α
) : Q(
Type u: Type (u+1)
Type u
)) assumeInstancesCommute let
_f_eq: «$f» =Q HDiv.hDiv
_f_eq
⟩ ←
withDefault: {n : TypeType ?u.65340} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withDefault
<|
withNewMCtxDepth: {n : TypeType ?u.65386} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αoptParam Bool falsen α
withNewMCtxDepth
<|
assertDefEqQ: {u : Level} → {α : let u := u; Q(Sort u)} → (a b : Q(«$α»)) → MetaM (PLift («$a» =Q «$b»))
assertDefEqQ
(u :=
u: ?m.64833
u
.
succ: LevelLevel
succ
)
f: Q(«$α»«$α»«$α»)
f
q(
HDiv.hDiv: ?m.64833
HDiv.hDiv
) let
ra: ?m.65571
ra
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.64839
: ?m.64842
a: Q(«$α»)
a
; let
rb: ?m.65623
rb
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.64839
: ?m.64842
b: Q(«$α»)
b
match
ra: ?m.65571
ra
,
rb: ?m.65623
rb
with |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=>
pure: {f : Type ?u.65659 → Type ?u.65658} → [self : Pure f] → {α : Type ?u.65659} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
q(
div_pos: ∀ {α : Type ?u.65690} [inst : LinearOrderedSemifield α] {a b : α}, 0 < a0 < b0 < a / b
div_pos
div_pos $pa $pb: ?m.64833
$
pa: 0 < «$a»
pa
div_pos $pa $pb: ?m.64833
$
pb: 0 < «$b»
pb
)) |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=>
pure: {f : Type ?u.65795 → Type ?u.65794} → [self : Pure f] → {α : Type ?u.65795} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
div_nonneg_of_pos_of_nonneg: ∀ {R : Type ?u.65826} [inst : LinearOrderedSemifield R] {a b : R}, 0 < a0 b0 a / b
div_nonneg_of_pos_of_nonneg
div_nonneg_of_pos_of_nonneg $pa $pb: ?m.64833
$
pa: 0 < «$a»
pa
div_nonneg_of_pos_of_nonneg $pa $pb: ?m.64833
$
pb: 0 «$b»
pb
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=>
pure: {f : Type ?u.65884 → Type ?u.65883} → [self : Pure f] → {α : Type ?u.65884} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
div_nonneg_of_nonneg_of_pos: ∀ {R : Type ?u.65915} [inst : LinearOrderedSemifield R] {a b : R}, 0 a0 < b0 a / b
div_nonneg_of_nonneg_of_pos
div_nonneg_of_nonneg_of_pos $pa $pb: ?m.64833
$
pa: 0 «$a»
pa
div_nonneg_of_nonneg_of_pos $pa $pb: ?m.64833
$
pb: 0 < «$b»
pb
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
,
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pb: Q(0 «$b»)
pb
=>
pure: {f : Type ?u.65965 → Type ?u.65964} → [self : Pure f] → {α : Type ?u.65965} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
div_nonneg: ∀ {α : Type ?u.65996} [inst : LinearOrderedSemifield α] {a b : α}, 0 a0 b0 a / b
div_nonneg
div_nonneg $pa $pb: ?m.64833
$
pa: 0 «$a»
pa
div_nonneg $pa $pb: ?m.64833
$
pb: 0 «$b»
pb
)) |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
,
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pb: Q(«$b» 0)
pb
=>
pure: {f : Type ?u.66046 → Type ?u.66045} → [self : Pure f] → {α : Type ?u.66046} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
q(
div_ne_zero_of_pos_of_ne_zero: ∀ {R : Type ?u.66077} [inst : LinearOrderedSemifield R] {a b : R}, 0 < ab 0a / b 0
div_ne_zero_of_pos_of_ne_zero
div_ne_zero_of_pos_of_ne_zero $pa $pb: ?m.64833
$
pa: 0 < «$a»
pa
div_ne_zero_of_pos_of_ne_zero $pa $pb: ?m.64833
$
pb: «$b» 0
pb
)) |
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pa: Q(«$a» 0)
pa
,
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pb: Q(0 < «$b»)
pb
=>
pure: {f : Type ?u.66127 → Type ?u.66126} → [self : Pure f] → {α : Type ?u.66127} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
q(
div_ne_zero_of_ne_zero_of_pos: ∀ {R : Type ?u.66158} [inst : LinearOrderedSemifield R] {a b : R}, a 00 < ba / b 0
div_ne_zero_of_ne_zero_of_pos
div_ne_zero_of_ne_zero_of_pos $pa $pb: ?m.64833
$
pa: «$a» 0
pa
div_ne_zero_of_ne_zero_of_pos $pa $pb: ?m.64833
$
pb: 0 < «$b»
pb
)) |
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pa: Q(«$a» 0)
pa
,
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pb: Q(«$b» 0)
pb
=>
pure: {f : Type ?u.66203 → Type ?u.66202} → [self : Pure f] → {α : Type ?u.66203} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
q(
div_ne_zero: ∀ {G₀ : Type ?u.66234} [inst : GroupWithZero G₀] {a b : G₀}, a 0b 0a / b 0
div_ne_zero
div_ne_zero $pa $pb: ?m.64833
$
pa: «$a» 0
pa
div_ne_zero $pa $pb: ?m.64833
$
pb: «$b» 0
pb
)) | _, _ =>
pure: {f : Type ?u.66295 → Type ?u.66294} → [self : Pure f] → {α : Type ?u.66295} → αf α
pure
.none: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Strictness e
.none
/-- The `positivity` extension which identifies expressions of the form `a⁻¹`, such that `positivity` successfully recognises `a`. -/ @[positivity (
_: α
_
:
α: ?m.77498
α
)⁻¹] def
evalInv: PositivityExt
evalInv
:
PositivityExt: Type
PositivityExt
where eval {
u: ?m.72720
u
α: ?m.72723
α
}
: ?m.72726
: ?m.72729
e: ?m.72732
e
:= do let
.app: ExprExprExpr
.app
(
f: Q(«$α»«$α»)
f
: Q($α → $α)) (
a: Q(«$α»)
a
: Q($α)) ←
withReducible: {n : TypeType ?u.72795} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withReducible
(
whnf: ExprMetaM Expr
whnf
e: ?m.72732
e
) |
throwError "not ⁻¹": ?m.74031 ?m.74032
throwError
throwError "not ⁻¹": ?m.74031 ?m.74032
"not ⁻¹"
let
_e_eq: «$e» =Q «$f» «$a»
_e_eq
: $
e: «$α»
e
=Q $
f: «$α»«$α»
f
$
a: «$α»
a
:=
⟨⟩: «$e» =Q «$f» «$a»
⟨⟩
let
_a: ?m.73035
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
LinearOrderedSemifield: Type ?u.73021 → Type ?u.73021
LinearOrderedSemifield
LinearOrderedSemifield $α: ?m.72720
$
α: Type u
α
) : Q(
Type u: ?m.72720
Type u
)) assumeInstancesCommute let
_f_eq: «$f» =Q Inv.inv
_f_eq
⟩ ←
withDefault: {n : TypeType ?u.73215} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withDefault
<|
withNewMCtxDepth: {n : TypeType ?u.73261} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αoptParam Bool falsen α
withNewMCtxDepth
<|
assertDefEqQ: {u : Level} → {α : let u := u; Q(Sort u)} → (a b : Q(«$α»)) → MetaM (PLift («$a» =Q «$b»))
assertDefEqQ
(u :=
u: ?m.72720
u
.
succ: LevelLevel
succ
)
f: Q(«$α»«$α»)
f
q(
Inv.inv: ?m.72720
Inv.inv
) let
ra: ?m.73454
ra
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.72726
: ?m.72729
a: Q(«$α»)
a
match
ra: ?m.73454
ra
with |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
=>
pure: {f : Type ?u.73476 → Type ?u.73475} → [self : Pure f] → {α : Type ?u.73476} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
q(
inv_pos_of_pos: ∀ {α : Type ?u.73507} [inst : LinearOrderedSemifield α] {a : α}, 0 < a0 < a⁻¹
inv_pos_of_pos
inv_pos_of_pos $pa: ?m.72720
$
pa: 0 < «$a»
pa
)) |
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
pa: Q(0 «$a»)
pa
=>
pure: {f : Type ?u.73594 → Type ?u.73593} → [self : Pure f] → {α : Type ?u.73594} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
q(
inv_nonneg_of_nonneg: ∀ {α : Type ?u.73625} [inst : LinearOrderedSemifield α] {a : α}, 0 a0 a⁻¹
inv_nonneg_of_nonneg
inv_nonneg_of_nonneg $pa: ?m.72720
$
pa: 0 «$a»
pa
)) |
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
pa: Q(«$a» 0)
pa
=>
pure: {f : Type ?u.73668 → Type ?u.73667} → [self : Pure f] → {α : Type ?u.73668} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
q(
inv_ne_zero: ∀ {G₀ : Type ?u.73699} [inst : GroupWithZero G₀] {a : G₀}, a 0a⁻¹ 0
inv_ne_zero
inv_ne_zero $pa: ?m.72720
$
pa: «$a» 0
pa
)) |
.none: Strictness a
.none
=>
pure: {f : Type ?u.73754 → Type ?u.73753} → [self : Pure f] → {α : Type ?u.73754} → αf α
pure
.none: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Strictness e
.none
private theorem
pow_zero_pos: ∀ {α : Type u_1} [inst : OrderedSemiring α] [inst_1 : Nontrivial α] (a : α), 0 < a ^ 0
pow_zero_pos
[
OrderedSemiring: Type ?u.77668 → Type ?u.77668
OrderedSemiring
α: ?m.77665
α
] [
Nontrivial: Type ?u.77671 → Prop
Nontrivial
α: ?m.77665
α
] (
a: α
a
:
α: ?m.77665
α
) :
0: ?m.77678
0
<
a: α
a
^
0: ?m.77697
0
:=
zero_lt_one: ∀ {α : Type ?u.78303} [inst : Zero α] [inst_1 : One α] [inst_2 : PartialOrder α] [inst_3 : ZeroLEOneClass α] [inst_4 : NeZero 1], 0 < 1
zero_lt_one
.
trans_le: ∀ {α : Type ?u.78590} [inst : Preorder α] {a b c : α}, a < bb ca < c
trans_le
(
pow_zero: ∀ {M : Type ?u.78794} [inst : Monoid M] (a : M), a ^ 0 = 1
pow_zero
a: α
a
).
ge: ∀ {α : Type ?u.78903} [inst : Preorder α] {x y : α}, x = yy x
ge
private lemma
zpow_zero_pos: ∀ {R : Type u_1} [inst : LinearOrderedSemifield R] (a : R), 0 < a ^ 0
zpow_zero_pos
[
LinearOrderedSemifield: Type ?u.79471 → Type ?u.79471
LinearOrderedSemifield
R: ?m.79468
R
] (
a: R
a
:
R: ?m.79468
R
) :
0: ?m.79478
0
<
a: R
a
^ (
0: ?m.79498
0
:
: Type
) :=
zero_lt_one: ∀ {α : Type ?u.82408} [inst : Zero α] [inst_1 : One α] [inst_2 : PartialOrder α] [inst_3 : ZeroLEOneClass α] [inst_4 : NeZero 1], 0 < 1
zero_lt_one
.
trans_le: ∀ {α : Type ?u.82695} [inst : Preorder α] {a b c : α}, a < bb ca < c
trans_le
(
zpow_zero: ∀ {G : Type ?u.82859} [inst : DivInvMonoid G] (a : G), a ^ 0 = 1
zpow_zero
a: R
a
).
ge: ∀ {α : Type ?u.82903} [inst : Preorder α] {x y : α}, x = yy x
ge
/-- The `positivity` extension which identifies expressions of the form `a ^ (0:ℕ)`. This extension is run in addition to the general `a ^ b` extension (they are overlapping). -/ @[positivity (
_: α
_
:
α: ?m.86414
α
) ^ (
0: ?m.86423
0
:ℕ),
Pow.pow: {α : Type ?u.89497} → {β : Type ?u.89496} → [self : Pow α β] → αβα
Pow.pow
_: ?m.89498
_
(
0: ?m.89504
0
:ℕ)] def
evalPowZeroNat: PositivityExt
evalPowZeroNat
:
PositivityExt: Type
PositivityExt
where eval {
u: ?m.83360
u
α: ?m.83363
α
}
_zα: ?m.83366
_zα
_pα: ?m.83369
_pα
e: ?m.83372
e
:= do let
.app: ExprExprExpr
.app
(
.app: ExprExprExpr
.app
_ (
a: Q(«$α»)
a
: Q($α))) _ ←
withReducible: {n : TypeType ?u.83435} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withReducible
(
whnf: ExprMetaM Expr
whnf
e: ?m.83372
e
) |
throwError "not ^": ?m.83834 ?m.83835
throwError
throwError "not ^": ?m.83834 ?m.83835
"not ^"
_: ?m.83646
_
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
OrderedSemiring: Type ?u.83632 → Type ?u.83632
OrderedSemiring
OrderedSemiring $α: ?m.83360
$
α: Type u
α
) : Q(
Type u: Type (u+1)
Type u
))
_: ?m.83710
_
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
Nontrivial: Type ?u.83698 → Prop
Nontrivial
Nontrivial $α: ?m.83360
$
α: Type u
α
) : Q(
Prop: Type
Prop
))
pure: {f : Type ?u.83714 → Type ?u.83713} → [self : Pure f] → {α : Type ?u.83714} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
(q(
pow_zero_pos: ∀ {α : Type ?u.83755} [inst : OrderedSemiring α] [inst_1 : Nontrivial α] (a : α), 0 < a ^ 0
pow_zero_pos
pow_zero_pos $a: ?m.83360
$
a: «$α»
a
) :
Expr: Type
Expr
)) /-- The `positivity` extension which identifies expressions of the form `a ^ (0:ℤ)`. -/ @[positivity (
_: α
_
:
α: ?m.92419
α
) ^ (
0: ?m.92428
0
:ℤ),
Pow.pow: {α : Type ?u.95222} → {β : Type ?u.95221} → [self : Pow α β] → αβα
Pow.pow
_: ?m.95223
_
(
0: ?m.95229
0
:ℤ)] def
evalPowZeroInt: PositivityExt
evalPowZeroInt
:
PositivityExt: Type
PositivityExt
where eval {
u: ?m.89531
u
α: ?m.89534
α
}
_zα: ?m.89537
_zα
_pα: ?m.89540
_pα
e: ?m.89543
e
:= do let
.app: ExprExprExpr
.app
(
.app: ExprExprExpr
.app
_ (
a: Q(«$α»)
a
: Q($α))) _ ←
withReducible: {n : TypeType ?u.89606} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withReducible
(
whnf: ExprMetaM Expr
whnf
e: ?m.89543
e
) |
throwError "not ^": ?m.89915 ?m.89916
throwError
throwError "not ^": ?m.89915 ?m.89916
"not ^"
_: ?m.89817
_
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
LinearOrderedSemifield: Type ?u.89803 → Type ?u.89803
LinearOrderedSemifield
LinearOrderedSemifield $α: ?m.89531
$
α: Type u
α
) : Q(
Type u: Type (u+1)
Type u
))
pure: {f : Type ?u.89821 → Type ?u.89820} → [self : Pure f] → {α : Type ?u.89821} → αf α
pure
(
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
(q(
zpow_zero_pos: ∀ {R : Type ?u.89862} [inst : LinearOrderedSemifield R] (a : R), 0 < a ^ 0
zpow_zero_pos
zpow_zero_pos $a: ?m.89531
$
a: «$α»
a
) :
Expr: Type
Expr
)) /-- The `positivity` extension which identifies expressions of the form `a ^ (b : ℕ)`, such that `positivity` successfully recognises both `a` and `b`. -/ @[positivity (
_: α
_
:
α: ?m.107867
α
) ^ (
_:
_
: ℕ),
Pow.pow: {α : Type ?u.110938} → {β : Type ?u.110937} → [self : Pow α β] → αβα
Pow.pow
_: ?m.110939
_
(
_:
_
: ℕ)] def
evalPow: PositivityExt
evalPow
:
PositivityExt: Type
PositivityExt
where eval {
u: ?m.95256
u
α: ?m.95259
α
}
: ?m.95262
: ?m.95265
e: ?m.95268
e
:= do let
.app: ExprExprExpr
.app
(
.app: ExprExprExpr
.app
_ (
a: Q(«$α»)
a
: Q($α))) (
b: Q()
b
: Q(ℕ)) ←
withReducible: {n : TypeType ?u.95331} → [inst : MonadControlT MetaM n] → [inst : Monad n] → {α : Type} → n αn α
withReducible
(
whnf: ExprMetaM Expr
whnf
e: ?m.95268
e
) |
throwError "not ^": ?m.100035 ?m.100036
throwError
throwError "not ^": ?m.100035 ?m.100036
"not ^"
let
result: ?m.96605
result
catchNone: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → MetaM (Strictness e)MetaM (Strictness e)
catchNone
do let
.true: Bool
.true
:=
b: Q()
b
.
isAppOfArity: ExprNameBool
isAppOfArity
``
OfNat.ofNat: {α : Type u} → (x : ) → [self : OfNat α x] → α
OfNat.ofNat
3: ?m.95548
3
|
throwError "not a ^ n where n is a literal": ?m.96299 ?m.96300
throwError
throwError "not a ^ n where n is a literal": ?m.96299 ?m.96300
"not a ^ n where n is a literal"
let
some: {α : Type ?u.95575} → αOption α
some
n:
n
:= (
b: Q()
b
.
getRevArg!: ExprExpr
getRevArg!
1: ?m.95567
1
).
natLit?: ExprOption
natLit?
|
throwError "not a ^ n where n is a literal": ?m.95999 ?m.96000
throwError
throwError "not a ^ n where n is a literal": ?m.95999 ?m.96000
"not a ^ n where n is a literal"
guard: {f : TypeType ?u.95632} → [inst : Alternative f] → (p : Prop) → [inst : Decidable p] → f Unit
guard
(
n:
n
%
2: ?m.95652
2
=
0: ?m.95666
0
) let
m: Q()
m
: Q(
: Type
) :=
mkRawNatLit: Expr
mkRawNatLit
(
n:
n
/
2: ?m.95762
2
) let
_a: ?m.95885
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
LinearOrderedRing: Type ?u.95876 → Type ?u.95876
LinearOrderedRing
LinearOrderedRing $α: ?m.95256
$
α: Type u
α
) : Q(
Type u: Type (u+1)
Type u
))
pure: {f : Type ?u.95888 → Type ?u.95887} → [self : Pure f] → {α : Type ?u.95888} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
(q(
pow_bit0_nonneg: ∀ {R : Type ?u.95934} [inst : LinearOrderedRing R] (a : R) (n : ), 0 a ^ bit0 n
pow_bit0_nonneg
pow_bit0_nonneg $a $m: ?m.95256
$
a: «$α»
a
pow_bit0_nonneg $a $m: ?m.95256
$
m:
m
) :
Expr: Type
Expr
))
orElse: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Strictness eMetaM (Strictness e)MetaM (Strictness e)
orElse
result: ?m.96605
result
do let
ra: ?m.96699
ra
core: {u : Level} → {α : Q(Type u)} → ( : Q(Zero «$α»)) → ( : Q(PartialOrder «$α»)) → (e : Q(«$α»)) → MetaM (Strictness e)
core
: ?m.95262
: ?m.95265
a: Q(«$α»)
a
let
ofNonneg: ExprQ(OrderedSemiring «$α»)MetaM (Strictness e)
ofNonneg
pa: ?m.96702
pa
(
: Q(OrderedSemiring «$α»)
: Q(
OrderedSemiring: Type ?u.96710 → Type ?u.96710
OrderedSemiring
OrderedSemiring $α: ?m.95256
$
α: Type u
α
)) :
MetaM: TypeType
MetaM
(
Strictness: {u : Level} → {α : Q(Type u)} → Q(Zero «$α»)Q(PartialOrder «$α»)Q(«$α»)Type
Strictness
: ?m.95262
: ?m.95265
e: ?m.95268
e
) := do have
pa': Q(0 «$a»)
pa'
: Q(

Goals accomplished! 🐙
«$α»: Type u

«$zα»: Zero «$α»

«$pα»: PartialOrder «$α»

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»


Sort ?u.96722
«$α»: Type u

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»


Sort ?u.96722
«$α»: Type u

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»


Sort ?u.96722
«$α»: Type u

«$zα»: Zero «$α»

«$pα»: PartialOrder «$α»

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»


Sort ?u.96722

Goals accomplished! 🐙
) :=
pa: ?m.96702
pa
pure: {f : Type ?u.97071 → Type ?u.97070} → [self : Pure f] → {α : Type ?u.97071} → αf α
pure
(
.nonnegative: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 «$e»)Strictness e
.nonnegative
(q(
pow_nonneg: ∀ {α : Type ?u.97107} [inst : OrderedSemiring α] {a : α}, 0 a∀ (n : ), 0 a ^ n
pow_nonneg
pow_nonneg $pa' $b: ?m.95256
$
pa': 0 «$a»
pa'
pow_nonneg $pa' $b: ?m.95256
$
b:
b
) :
Expr: Type
Expr
)) let
ofNonzero: ExprQ(OrderedSemiring «$α»)MetaM (Strictness e)
ofNonzero
pa: ?m.97185
pa
(
: Q(OrderedSemiring «$α»)
: Q(
OrderedSemiring: Type ?u.97194 → Type ?u.97194
OrderedSemiring
OrderedSemiring $α: ?m.95256
$
α: Type u
α
)) :
MetaM: TypeType
MetaM
(
Strictness: {u : Level} → {α : Q(Type u)} → Q(Zero «$α»)Q(PartialOrder «$α»)Q(«$α»)Type
Strictness
: ?m.95262
: ?m.95265
e: ?m.95268
e
) := do have
pa': Q(«$a» 0)
pa'
: Q(

Goals accomplished! 🐙
«$α»: Type u

«$zα»: Zero «$α»

«$pα»: PartialOrder «$α»

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»


Sort ?u.97206
«$α»: Type u

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»


Sort ?u.97206
«$α»: Type u

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»


Sort ?u.97206
«$α»: Type u

«$zα»: Zero «$α»

«$pα»: PartialOrder «$α»

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»


Sort ?u.97206

Goals accomplished! 🐙
) :=
pa: ?m.97185
pa
let
_a: ?m.97784
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(

Goals accomplished! 🐙
«$α»: Type u

«$zα»: Zero «$α»

«$pα»: PartialOrder «$α»

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»

«$pa'»: «$a» 0


«$α»: Type u

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»

«$pa'»: «$a» 0


«$α»: Type u

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»

«$pa'»: «$a» 0


«$α»: Type u

«$zα»: Zero «$α»

«$pα»: PartialOrder «$α»

«$e»: «$α»

$fn✝: Expr

«$a»: «$α»

«$b»:

«$oα»: OrderedSemiring «$α»

«$pa'»: «$a» 0



Goals accomplished! 🐙
) : Q(
Prop: Type
Prop
))
pure: {f : Type ?u.97787 → Type ?u.97786} → [self : Pure f] → {α : Type ?u.97787} → αf α
pure
(
.nonzero: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(«$e» 0)Strictness e
.nonzero
(q(
pow_ne_zero: ∀ {M : Type ?u.97823} [inst : MonoidWithZero M] [inst_1 : NoZeroDivisors M] {a : M} (n : ), a 0a ^ n 0
pow_ne_zero
pow_ne_zero $b $pa': ?m.95256
$
b:
b
pow_ne_zero $b $pa': ?m.95256
$
pa': «$a» 0
pa'
) :
Expr: Type
Expr
)) match
ra: ?m.96699
ra
with |
.positive: {u : Level} → {α : Q(Type u)} → { : Q(Zero «$α»)} → { : Q(PartialOrder «$α»)} → {e : Q(«$α»)} → Q(0 < «$e»)Strictness e
.positive
pa: Q(0 < «$a»)
pa
=> try let
_a: ?m.98123
_a
synthInstanceQ: {u : Level} → (α : Q(Sort u)) → MetaM Q(«$α»)
synthInstanceQ
(q(
StrictOrderedSemiring: Type ?u.98116 → Type ?u.98116
StrictOrderedSemiring
StrictOrderedSemiring $α: ?m.95256
$
α: Type u
α
) : Q(
Type u: ?m.95256
Type u
)) have
pa': Q(0 < «$a»)
pa'
: Q(

Goals accomplished! 🐙