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) 2014 Jeremy Avigad. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jeremy Avigad, Leonardo de Moura, Floris van Doorn, Amelia Livingston, Yury Kudryashov,
Neil Strickland, Aaron Anderson

! This file was ported from Lean 3 source module algebra.group_with_zero.divisibility
! leanprover-community/mathlib commit e8638a0fcaf73e4500469f368ef9494e495099b3
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.GroupWithZero.Basic
import Mathlib.Algebra.Divisibility.Units

/-!
# Divisibility in groups with zero.

Lemmas about divisibility in groups and monoids with zero.

-/


variable {
α: Type ?u.4176
α
:
Type _: Type (?u.1627+1)
Type _
} section SemigroupWithZero variable [
SemigroupWithZero: Type ?u.16 → Type ?u.16
SemigroupWithZero
α: Type ?u.5
α
] {
a: α
a
:
α: Type ?u.268
α
} theorem
eq_zero_of_zero_dvd: 0 aa = 0
eq_zero_of_zero_dvd
(
h: 0 a
h
:
0: ?m.28
0
a: α
a
) :
a: α
a
=
0: ?m.60
0
:=
Dvd.elim: ∀ {α : Type ?u.146} [inst : Semigroup α] {P : Prop} {a b : α}, a b(∀ (c : α), b = a * cP) → P
Dvd.elim
h: 0 a
h
fun
c: ?m.171
c
H': ?m.174
H'
=>
H': ?m.174
H'
.
trans: ∀ {α : Sort ?u.176} {a b c : α}, a = bb = ca = c
trans
(
zero_mul: ∀ {M₀ : Type ?u.190} [self : MulZeroClass M₀] (a : M₀), 0 * a = 0
zero_mul
c: ?m.171
c
) #align eq_zero_of_zero_dvd
eq_zero_of_zero_dvd: ∀ {α : Type u_1} [inst : SemigroupWithZero α] {a : α}, 0 aa = 0
eq_zero_of_zero_dvd
/-- Given an element `a` of a commutative semigroup with zero, there exists another element whose product with zero equals `a` iff `a` equals zero. -/ @[simp] theorem
zero_dvd_iff: 0 a a = 0
zero_dvd_iff
:
0: ?m.280
0
a: α
a
a: α
a
=
0: ?m.310
0
:= ⟨
eq_zero_of_zero_dvd: ∀ {α : Type ?u.403} [inst : SemigroupWithZero α] {a : α}, 0 aa = 0
eq_zero_of_zero_dvd
, fun
h: ?m.434
h
=>

Goals accomplished! 🐙
α: Type u_1

inst✝: SemigroupWithZero α

a: α

h: a = 0


0 a
α: Type u_1

inst✝: SemigroupWithZero α

a: α

h: a = 0


0 a
α: Type u_1

inst✝: SemigroupWithZero α

a: α

h: a = 0


0 0
α: Type u_1

inst✝: SemigroupWithZero α

a: α

h: a = 0


0 0
α: Type u_1

inst✝: SemigroupWithZero α

a: α

h: a = 0


0 a
α: Type u_1

inst✝: SemigroupWithZero α

a: α

h: a = 0


0 0

Goals accomplished! 🐙
α: Type u_1

inst✝: SemigroupWithZero α

a: α

h: a = 0


0 = 0 * 0

Goals accomplished! 🐙

Goals accomplished! 🐙
#align zero_dvd_iff
zero_dvd_iff: ∀ {α : Type u_1} [inst : SemigroupWithZero α] {a : α}, 0 a a = 0
zero_dvd_iff
@[simp] theorem
dvd_zero: ∀ {α : Type u_1} [inst : SemigroupWithZero α] (a : α), a 0
dvd_zero
(
a: α
a
:
α: Type ?u.832
α
) :
a: α
a
0: ?m.849
0
:=
Dvd.intro: ∀ {α : Type ?u.941} [inst : Semigroup α] {a b : α} (c : α), a * c = ba b
Dvd.intro
0: ?m.965
0
(

Goals accomplished! 🐙
α: Type u_1

inst✝: SemigroupWithZero α

a✝, a: α


a * 0 = 0

Goals accomplished! 🐙
) #align dvd_zero
dvd_zero: ∀ {α : Type u_1} [inst : SemigroupWithZero α] (a : α), a 0
dvd_zero
end SemigroupWithZero /-- Given two elements `b`, `c` of a `CancelMonoidWithZero` and a nonzero element `a`, `a*b` divides `a*c` iff `b` divides `c`. -/ theorem
mul_dvd_mul_iff_left: ∀ [inst : CancelMonoidWithZero α] {a b c : α}, a 0 → (a * b a * c b c)
mul_dvd_mul_iff_left
[
CancelMonoidWithZero: Type ?u.1186 → Type ?u.1186
CancelMonoidWithZero
α: Type ?u.1183
α
] {
a: α
a
b: α
b
c: α
c
:
α: Type ?u.1183
α
} (
ha: a 0
ha
:
a: α
a
0: ?m.1198
0
) :
a: α
a
*
b: α
b
a: α
a
*
c: α
c
b: α
b
c: α
c
:=
exists_congr: ∀ {α : Sort ?u.1464} {p q : αProp}, (∀ (a : α), p a q a) → ((a, p a) a, q a)
exists_congr
fun
d: ?m.1480
d
=>

Goals accomplished! 🐙
α: Type u_1

inst✝: CancelMonoidWithZero α

a, b, c: α

ha: a 0

d: α


a * c = a * b * d c = b * d
α: Type u_1

inst✝: CancelMonoidWithZero α

a, b, c: α

ha: a 0

d: α


a * c = a * b * d c = b * d
α: Type u_1

inst✝: CancelMonoidWithZero α

a, b, c: α

ha: a 0

d: α


a * c = a * (b * d) c = b * d
α: Type u_1

inst✝: CancelMonoidWithZero α

a, b, c: α

ha: a 0

d: α


a * c = a * b * d c = b * d
α: Type u_1

inst✝: CancelMonoidWithZero α

a, b, c: α

ha: a 0

d: α


c = b * d c = b * d

Goals accomplished! 🐙
#align mul_dvd_mul_iff_left
mul_dvd_mul_iff_left: ∀ {α : Type u_1} [inst : CancelMonoidWithZero α] {a b c : α}, a 0 → (a * b a * c b c)
mul_dvd_mul_iff_left
/-- Given two elements `a`, `b` of a commutative `CancelMonoidWithZero` and a nonzero element `c`, `a*c` divides `b*c` iff `a` divides `b`. -/ theorem
mul_dvd_mul_iff_right: ∀ [inst : CancelCommMonoidWithZero α] {a b c : α}, c 0 → (a * c b * c a b)
mul_dvd_mul_iff_right
[
CancelCommMonoidWithZero: Type ?u.1630 → Type ?u.1630
CancelCommMonoidWithZero
α: Type ?u.1627
α
] {
a: α
a
b: α
b
c: α
c
:
α: Type ?u.1627
α
} (
hc: c 0
hc
:
c: α
c
0: ?m.1642
0
) :
a: α
a
*
c: α
c
b: α
b
*
c: α
c
a: α
a
b: α
b
:=
exists_congr: ∀ {α : Sort ?u.1876} {p q : αProp}, (∀ (a : α), p a q a) → ((a, p a) a, q a)
exists_congr
fun
d: ?m.1892
d
=>

Goals accomplished! 🐙
α: Type u_1

inst✝: CancelCommMonoidWithZero α

a, b, c: α

hc: c 0

d: α


b * c = a * c * d b = a * d
α: Type u_1

inst✝: CancelCommMonoidWithZero α

a, b, c: α

hc: c 0

d: α


b * c = a * c * d b = a * d
α: Type u_1

inst✝: CancelCommMonoidWithZero α

a, b, c: α

hc: c 0

d: α


b * c = a * d * c b = a * d
α: Type u_1

inst✝: CancelCommMonoidWithZero α

a, b, c: α

hc: c 0

d: α


b * c = a * c * d b = a * d
α: Type u_1

inst✝: CancelCommMonoidWithZero α

a, b, c: α

hc: c 0

d: α


b = a * d b = a * d

Goals accomplished! 🐙
#align mul_dvd_mul_iff_right
mul_dvd_mul_iff_right: ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] {a b c : α}, c 0 → (a * c b * c a b)
mul_dvd_mul_iff_right
section CommMonoidWithZero variable [
CommMonoidWithZero: Type ?u.2239 → Type ?u.2239
CommMonoidWithZero
α: Type ?u.2015
α
] /-- `DvdNotUnit a b` expresses that `a` divides `b` "strictly", i.e. that `b` divided by `a` is not a unit. -/ def
DvdNotUnit: ααProp
DvdNotUnit
(
a: α
a
b: α
b
:
α: Type ?u.2021
α
) :
Prop: Type
Prop
:=
a: α
a
0: ?m.2037
0
∧ ∃
x: ?m.2071
x
, ¬
IsUnit: {M : Type ?u.2073} → [inst : Monoid M] → MProp
IsUnit
x: ?m.2071
x
b: α
b
=
a: α
a
*
x: ?m.2071
x
#align dvd_not_unit
DvdNotUnit: {α : Type u_1} → [inst : CommMonoidWithZero α] → ααProp
DvdNotUnit
theorem
dvdNotUnit_of_dvd_of_not_dvd: ∀ {a b : α}, a b¬b aDvdNotUnit a b
dvdNotUnit_of_dvd_of_not_dvd
{
a: α
a
b: α
b
:
α: Type ?u.2236
α
} (
hd: a b
hd
:
a: α
a
b: α
b
) (
hnd: ¬b a
hnd
: ¬
b: α
b
a: α
a
) :
DvdNotUnit: {α : Type ?u.2298} → [inst : CommMonoidWithZero α] → ααProp
DvdNotUnit
a: α
a
b: α
b
:=

Goals accomplished! 🐙
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


left
a 0
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


right
x, ¬IsUnit x b = a * x
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


left
a 0
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


left
a 0
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


right
x, ¬IsUnit x b = a * x
α: Type u_1

inst✝: CommMonoidWithZero α

b: α

hd: 0 b

hnd: ¬b 0


left
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


left
a 0

Goals accomplished! 🐙
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


right
x, ¬IsUnit x b = a * x
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


right
x, ¬IsUnit x b = a * x
α: Type u_1

inst✝: CommMonoidWithZero α

a, c: α

hnd: ¬a * c a


right.intro
x, ¬IsUnit x a * c = a * x
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


right
x, ¬IsUnit x b = a * x
α: Type u_1

inst✝: CommMonoidWithZero α

a, c: α

hnd: ¬a * c a


right.intro
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


right
x, ¬IsUnit x b = a * x
α: Type u_1

inst✝: CommMonoidWithZero α

a: α

u: αˣ

hnd: ¬a * u a


right.intro.intro
α: Type u_1

inst✝: CommMonoidWithZero α

a, b: α

hd: a b

hnd: ¬b a


right
x, ¬IsUnit x b = a * x

Goals accomplished! 🐙
#align dvd_not_unit_of_dvd_of_not_dvd
dvdNotUnit_of_dvd_of_not_dvd: ∀ {α : Type u_1} [inst : CommMonoidWithZero α] {a b : α}, a b¬b aDvdNotUnit a b
dvdNotUnit_of_dvd_of_not_dvd
end CommMonoidWithZero theorem
dvd_and_not_dvd_iff: ∀ [inst : CancelCommMonoidWithZero α] {x y : α}, x y ¬y x DvdNotUnit x y
dvd_and_not_dvd_iff
[
CancelCommMonoidWithZero: Type ?u.2786 → Type ?u.2786
CancelCommMonoidWithZero
α: Type ?u.2783
α
] {
x: α
x
y: α
y
:
α: Type ?u.2783
α
} :
x: α
x
y: α
y
∧ ¬
y: α
y
x: α
x
DvdNotUnit: {α : Type ?u.2844} → [inst : CommMonoidWithZero α] → ααProp
DvdNotUnit
x: α
x
y: α
y
:= ⟨fun ⟨⟨
d: α
d
,
hd: y = x * d
hd
⟩,
hyx: ¬y x
hyx
⟩ => ⟨fun
hx0: ?m.2918
hx0
=>

Goals accomplished! 🐙
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝: x y ¬y x

d: α

hd: y = x * d

hyx: ¬y x

hx0: x = 0



Goals accomplished! 🐙
, ⟨
d: α
d
,
mt: ∀ {a b : Prop}, (ab) → ¬b¬a
mt
isUnit_iff_dvd_one: ∀ {α : Type ?u.2942} [inst : CommMonoid α] {x : α}, IsUnit x x 1
isUnit_iff_dvd_one
.
1: ∀ {a b : Prop}, (a b) → ab
1
fun
e: α
e
,
he: 1 = d * e
he
⟩ =>
hyx: ¬y x
hyx
e: α
e
,

Goals accomplished! 🐙
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: x y ¬y x

d: α

hd: y = x * d

hyx: ¬y x

x✝: d 1

e: α

he: 1 = d * e


x = y * e
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: x y ¬y x

d: α

hd: y = x * d

hyx: ¬y x

x✝: d 1

e: α

he: 1 = d * e


x = y * e
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: x y ¬y x

d: α

hd: y = x * d

hyx: ¬y x

x✝: d 1

e: α

he: 1 = d * e


x = x * d * e
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: x y ¬y x

d: α

hd: y = x * d

hyx: ¬y x

x✝: d 1

e: α

he: 1 = d * e


x = y * e
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: x y ¬y x

d: α

hd: y = x * d

hyx: ¬y x

x✝: d 1

e: α

he: 1 = d * e


x = x * (d * e)
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: x y ¬y x

d: α

hd: y = x * d

hyx: ¬y x

x✝: d 1

e: α

he: 1 = d * e


x = y * e
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: x y ¬y x

d: α

hd: y = x * d

hyx: ¬y x

x✝: d 1

e: α

he: 1 = d * e


x = x * 1
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: x y ¬y x

d: α

hd: y = x * d

hyx: ¬y x

x✝: d 1

e: α

he: 1 = d * e


x = y * e
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: x y ¬y x

d: α

hd: y = x * d

hyx: ¬y x

x✝: d 1

e: α

he: 1 = d * e


x = x

Goals accomplished! 🐙
⟩,
hd: y = x * d
hd
⟩⟩, fun
hx0: x 0
hx0
,
d: α
d
,
hdu: ¬IsUnit d
hdu
,
hdx: y = x * d
hdx
⟩ => ⟨⟨
d: α
d
,
hdx: y = x * d
hdx
⟩, fun
e: α
e
,
he: x = y * e
he
⟩ =>
hdu: ¬IsUnit d
hdu
(
isUnit_of_dvd_one: ∀ {α : Type ?u.3308} [inst : CommMonoid α] {a : α}, a 1IsUnit a
isUnit_of_dvd_one
e: α
e
,
mul_left_cancel₀: ∀ {M₀ : Type ?u.3352} [inst : Mul M₀] [inst_1 : Zero M₀] [inst_2 : IsLeftCancelMulZero M₀] {a b c : M₀}, a 0a * b = a * cb = c
mul_left_cancel₀
hx0: x 0
hx0
<|

Goals accomplished! 🐙
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * 1 = x * (d * e)
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * (d * e)
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * 1 = x * (d * e)
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * 1
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * 1 = x * (d * e)
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * 1
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


y * e * 1
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * 1
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * d * e * 1
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * d * e * 1
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * 1 = x * (d * e)
α: Type u_1

inst✝: CancelCommMonoidWithZero α

x, y: α

x✝¹: DvdNotUnit x y

hx0: x 0

d: α

hdu: ¬IsUnit d

hdx: y = x * d

x✝: y x

e: α

he: x = y * e


x * (d * e)
⟩)⟩⟩ #align dvd_and_not_dvd_iff
dvd_and_not_dvd_iff: ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] {x y : α}, x y ¬y x DvdNotUnit x y
dvd_and_not_dvd_iff
section MonoidWithZero variable [
MonoidWithZero: Type ?u.4185 → Type ?u.4185
MonoidWithZero
α: Type ?u.4176
α
] theorem
ne_zero_of_dvd_ne_zero: ∀ {p q : α}, q 0p qp 0
ne_zero_of_dvd_ne_zero
{
p: α
p
q: α
q
:
α: Type ?u.4182
α
} (
h₁: q 0
h₁
:
q: α
q
0: ?m.4195
0
) (
h₂: p q
h₂
:
p: α
p
q: α
q
) :
p: α
p
0: ?m.4273
0
:=

Goals accomplished! 🐙
α: Type u_1

inst✝: MonoidWithZero α

p, q: α

h₁: q 0

h₂: p q


p 0
α: Type u_1

inst✝: MonoidWithZero α

p, u: α

h₁: p * u 0


intro
p 0
α: Type u_1

inst✝: MonoidWithZero α

p, q: α

h₁: q 0

h₂: p q


p 0

Goals accomplished! 🐙
#align ne_zero_of_dvd_ne_zero
ne_zero_of_dvd_ne_zero: ∀ {α : Type u_1} [inst : MonoidWithZero α] {p q : α}, q 0p qp 0
ne_zero_of_dvd_ne_zero
end MonoidWithZero section CancelCommMonoidWithZero variable [
CancelCommMonoidWithZero: Type ?u.5525 → Type ?u.5525
CancelCommMonoidWithZero
α: Type ?u.5101
α
] [
Subsingleton: Sort ?u.5107 → Prop
Subsingleton
α: Type ?u.5101
α
ˣ] {
a: α
a
b: α
b
:
α: Type ?u.4387
α
} theorem
dvd_antisymm: a bb aa = b
dvd_antisymm
:
a: α
a
b: α
b
b: α
b
a: α
a
a: α
a
=
b: α
b
:=

Goals accomplished! 🐙
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, b: α


a bb aa = b
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: a = a * c * d


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, b: α


a bb aa = b
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: a = a * c * d


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: a = a * (c * d)


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: a = a * c * d


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: a * (c * d) = a


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: a = a * c * d


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: c * d = 1 a = 0


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: a = a * c * d


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: c = 1 d = 1 a = 0


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: c = 1 d = 1 a = 0


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: c = 1 d = 1 a = 0


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, b: α


a bb aa = b
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, d: α


intro.intro.inl.intro
a = a * 1
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

c, d: α


intro.intro.inr
0 = 0 * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: c = 1 d = 1 a = 0


intro.intro
a = a * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, d: α


intro.intro.inl.intro
a = a * 1
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

c, d: α


intro.intro.inr
0 = 0 * c
α: Type u_1

inst✝¹: CancelCommMonoidWithZero α

inst✝: Subsingleton αˣ

a, c, d: α

hcd: c = 1 d = 1 a = 0


intro.intro
a = a * c

Goals accomplished! 🐙
#align dvd_antisymm
dvd_antisymm: ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb aa = b
dvd_antisymm
-- porting note: `attribute [protected]` is currently unsupported -- attribute [protected] Nat.dvd_antisymm --This lemma is in core, so we protect it here theorem
dvd_antisymm': ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb ab = a
dvd_antisymm'
:
a: α
a
b: α
b
b: α
b
a: α
a
b: α
b
=
a: α
a
:=
flip: ∀ {α : Sort ?u.5217} {β : Sort ?u.5216} {φ : Sort ?u.5215}, (αβφ) → βαφ
flip
dvd_antisymm: ∀ {α : Type ?u.5225} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb aa = b
dvd_antisymm
#align dvd_antisymm'
dvd_antisymm': ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb ab = a
dvd_antisymm'
alias
dvd_antisymm: ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb aa = b
dvd_antisymm
Dvd.dvd.antisymm: ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb aa = b
Dvd.dvd.antisymm
#align has_dvd.dvd.antisymm
Dvd.dvd.antisymm: ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb aa = b
Dvd.dvd.antisymm
alias
dvd_antisymm': ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb ab = a
dvd_antisymm'
Dvd.dvd.antisymm': ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb ab = a
Dvd.dvd.antisymm'
#align has_dvd.dvd.antisymm'
Dvd.dvd.antisymm': ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb ab = a
Dvd.dvd.antisymm'
theorem
eq_of_forall_dvd: ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, (∀ (c : α), a c b c) → a = b
eq_of_forall_dvd
(
h: ∀ (c : α), a c b c
h
: ∀
c: ?m.5335
c
,
a: α
a
c: ?m.5335
c
b: α
b
c: ?m.5335
c
) :
a: α
a
=
b: α
b
:= ((
h: ∀ (c : α), a c b c
h
_: α
_
).
2: ∀ {a b : Prop}, (a b) → ba
2
dvd_rfl: ∀ {α : Type ?u.5400} [inst : Monoid α] {a : α}, a a
dvd_rfl
).
antisymm: ∀ {α : Type ?u.5466} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb aa = b
antisymm
<| (
h: ∀ (c : α), a c b c
h
_: α
_
).
1: ∀ {a b : Prop}, (a b) → ab
1
dvd_rfl: ∀ {α : Type ?u.5496} [inst : Monoid α] {a : α}, a a
dvd_rfl
#align eq_of_forall_dvd
eq_of_forall_dvd: ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, (∀ (c : α), a c b c) → a = b
eq_of_forall_dvd
theorem
eq_of_forall_dvd': (∀ (c : α), c a c b) → a = b
eq_of_forall_dvd'
(
h: ∀ (c : α), c a c b
h
: ∀
c: ?m.5573
c
,
c: ?m.5573
c
a: α
a
c: ?m.5573
c
b: α
b
) :
a: α
a
=
b: α
b
:= ((
h: ∀ (c : α), c a c b
h
_: α
_
).
1: ∀ {a b : Prop}, (a b) → ab
1
dvd_rfl: ∀ {α : Type ?u.5638} [inst : Monoid α] {a : α}, a a
dvd_rfl
).
antisymm: ∀ {α : Type ?u.5704} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, a bb aa = b
antisymm
<| (
h: ∀ (c : α), c a c b
h
_: α
_
).
2: ∀ {a b : Prop}, (a b) → ba
2
dvd_rfl: ∀ {α : Type ?u.5734} [inst : Monoid α] {a : α}, a a
dvd_rfl
#align eq_of_forall_dvd'
eq_of_forall_dvd': ∀ {α : Type u_1} [inst : CancelCommMonoidWithZero α] [inst_1 : Subsingleton αˣ] {a b : α}, (∀ (c : α), c a c b) → a = b
eq_of_forall_dvd'
end CancelCommMonoidWithZero