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) 2017 Mario Carneiro. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Mario Carneiro

! This file was ported from Lean 3 source module data.int.char_zero
! leanprover-community/mathlib commit 29cb56a7b35f72758b05a30490e1f10bd62c35c1
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.Int.Cast.Field

/-!
# Injectivity of `Int.Cast` into characteristic zero rings and fields.

-/


variable {
α: Type ?u.5
α
:
Type _: Type (?u.1806+1)
Type _
} open Nat namespace Int @[simp] theorem
cast_eq_zero: ∀ {α : Type u_1} [inst : AddGroupWithOne α] [inst_1 : CharZero α] {n : }, n = 0 n = 0
cast_eq_zero
[
AddGroupWithOne: Type ?u.8 → Type ?u.8
AddGroupWithOne
α: Type ?u.5
α
] [
CharZero: (R : Type ?u.11) → [inst : AddMonoidWithOne R] → Prop
CharZero
α: Type ?u.5
α
] {
n:
n
:
: Type
} : (
n:
n
:
α: Type ?u.5
α
) =
0: ?m.154
0
n:
n
=
0: ?m.569
0
:= ⟨fun
h: ?m.606
h
=>

Goals accomplished! 🐙
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:

h: n = 0


n = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: ↑(ofNat a✝) = 0


ofNat
ofNat a✝ = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: -[a✝+1] = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:

h: n = 0


n = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: ↑(ofNat a✝) = 0


ofNat
ofNat a✝ = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: ↑(ofNat a✝) = 0


ofNat
ofNat a✝ = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: -[a✝+1] = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: ↑(ofNat a✝) = 0


ofNat
ofNat a✝ = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: a✝ = 0


ofNat
ofNat a✝ = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: a✝ = 0


ofNat
ofNat a✝ = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: a✝ = 0


ofNat
ofNat a✝ = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: ↑(ofNat a✝) = 0


ofNat
ofNat a✝ = 0

Goals accomplished! 🐙
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:

h: n = 0


n = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: -[a✝+1] = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: -[a✝+1] = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: -[a✝+1] = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: -↑(a✝ + 1) = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: -[a✝+1] = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: ↑(a✝ + 1) = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: -[a✝+1] = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: a✝ + 1 = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: a✝ + 1 = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: a✝ + 1 = 0


negSucc
-[a✝+1] = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

a✝:

h: -[a✝+1] = 0


negSucc
-[a✝+1] = 0

Goals accomplished! 🐙
, fun
h: ?m.613
h
=>

Goals accomplished! 🐙
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:

h: n = 0


n = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:

h: n = 0


n = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:

h: n = 0


0 = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:

h: n = 0


n = 0
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:

h: n = 0


0 = 0

Goals accomplished! 🐙
#align int.cast_eq_zero
Int.cast_eq_zero: ∀ {α : Type u_1} [inst : AddGroupWithOne α] [inst_1 : CharZero α] {n : }, n = 0 n = 0
Int.cast_eq_zero
@[simp, norm_cast] theorem
cast_inj: ∀ [inst : AddGroupWithOne α] [inst_1 : CharZero α] {m n : }, m = n m = n
cast_inj
[
AddGroupWithOne: Type ?u.1176 → Type ?u.1176
AddGroupWithOne
α: Type ?u.1173
α
] [
CharZero: (R : Type ?u.1179) → [inst : AddMonoidWithOne R] → Prop
CharZero
α: Type ?u.1173
α
] {
m:
m
n:
n
:
: Type
} : (
m:
m
:
α: Type ?u.1173
α
) =
n:
n
m:
m
=
n:
n
:=

Goals accomplished! 🐙
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

m, n:


m = n m = n
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

m, n:


m = n m = n
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

m, n:


m - n = 0 m = n
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

m, n:


m = n m = n
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

m, n:


↑(m - n) = 0 m = n
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

m, n:


m = n m = n
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

m, n:


m - n = 0 m = n
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

m, n:


m = n m = n
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

m, n:


m = n m = n

Goals accomplished! 🐙
#align int.cast_inj
Int.cast_inj: ∀ {α : Type u_1} [inst : AddGroupWithOne α] [inst_1 : CharZero α] {m n : }, m = n m = n
Int.cast_inj
theorem
cast_injective: ∀ {α : Type u_1} [inst : AddGroupWithOne α] [inst_1 : CharZero α], Function.Injective Int.cast
cast_injective
[
AddGroupWithOne: Type ?u.1809 → Type ?u.1809
AddGroupWithOne
α: Type ?u.1806
α
] [
CharZero: (R : Type ?u.1812) → [inst : AddMonoidWithOne R] → Prop
CharZero
α: Type ?u.1806
α
] :
Function.Injective: {α : Sort ?u.1829} → {β : Sort ?u.1828} → (αβ) → Prop
Function.Injective
(
Int.cast: {R : Type ?u.1835} → [inst : IntCast R] → R
Int.cast
:
: Type
α: Type ?u.1806
α
) | _, _ =>
cast_inj: ∀ {α : Type ?u.1975} [inst : AddGroupWithOne α] [inst_1 : CharZero α] {m n : }, m = n m = n
cast_inj
.
1: ∀ {a b : Prop}, (a b) → ab
1
#align int.cast_injective
Int.cast_injective: ∀ {α : Type u_1} [inst : AddGroupWithOne α] [inst_1 : CharZero α], Function.Injective Int.cast
Int.cast_injective
theorem
cast_ne_zero: ∀ {α : Type u_1} [inst : AddGroupWithOne α] [inst_1 : CharZero α] {n : }, n 0 n 0
cast_ne_zero
[
AddGroupWithOne: Type ?u.2072 → Type ?u.2072
AddGroupWithOne
α: Type ?u.2069
α
] [
CharZero: (R : Type ?u.2075) → [inst : AddMonoidWithOne R] → Prop
CharZero
α: Type ?u.2069
α
] {
n:
n
:
: Type
} : (
n:
n
:
α: Type ?u.2069
α
) ≠
0: ?m.2219
0
n:
n
0: ?m.2621
0
:=
not_congr: ∀ {a b : Prop}, (a b) → (¬a ¬b)
not_congr
cast_eq_zero: ∀ {α : Type ?u.2640} [inst : AddGroupWithOne α] [inst_1 : CharZero α] {n : }, n = 0 n = 0
cast_eq_zero
#align int.cast_ne_zero
Int.cast_ne_zero: ∀ {α : Type u_1} [inst : AddGroupWithOne α] [inst_1 : CharZero α] {n : }, n 0 n 0
Int.cast_ne_zero
@[simp] theorem
cast_eq_one: ∀ [inst : AddGroupWithOne α] [inst_1 : CharZero α] {n : }, n = 1 n = 1
cast_eq_one
[
AddGroupWithOne: Type ?u.2680 → Type ?u.2680
AddGroupWithOne
α: Type ?u.2677
α
] [
CharZero: (R : Type ?u.2683) → [inst : AddMonoidWithOne R] → Prop
CharZero
α: Type ?u.2677
α
] {
n:
n
:
: Type
} : (
n:
n
:
α: Type ?u.2677
α
) =
1: ?m.2826
1
n:
n
=
1: ?m.3051
1
:=

Goals accomplished! 🐙
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:


n = 1 n = 1
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:


n = 1 n = 1
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:


n = 1 n = 1
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:


n = 1 n = 1
α: Type u_1

inst✝¹: AddGroupWithOne α

inst✝: CharZero α

n:


n = 1 n = 1

Goals accomplished! 🐙
#align int.cast_eq_one
Int.cast_eq_one: ∀ {α : Type u_1} [inst : AddGroupWithOne α] [inst_1 : CharZero α] {n : }, n = 1 n = 1
Int.cast_eq_one
theorem
cast_ne_one: ∀ [inst : AddGroupWithOne α] [inst_1 : CharZero α] {n : }, n 1 n 1
cast_ne_one
[
AddGroupWithOne: Type ?u.3193 → Type ?u.3193
AddGroupWithOne
α: Type ?u.3190
α
] [
CharZero: (R : Type ?u.3196) → [inst : AddMonoidWithOne R] → Prop
CharZero
α: Type ?u.3190
α
] {
n:
n
:
: Type
} : (
n:
n
:
α: Type ?u.3190
α
) ≠
1: ?m.3340
1
n:
n
1: ?m.3552
1
:=
cast_eq_one: ∀ {α : Type ?u.3566} [inst : AddGroupWithOne α] [inst_1 : CharZero α] {n : }, n = 1 n = 1
cast_eq_one
.
not: ∀ {a b : Prop}, (a b) → (¬a ¬b)
not
#align int.cast_ne_one
Int.cast_ne_one: ∀ {α : Type u_1} [inst : AddGroupWithOne α] [inst_1 : CharZero α] {n : }, n 1 n 1
Int.cast_ne_one
@[simp, norm_cast] theorem
cast_div_charZero: ∀ {k : Type u_1} [inst : DivisionRing k] [inst_1 : CharZero k] {m n : }, n m↑(m / n) = m / n
cast_div_charZero
{
k: Type u_1
k
:
Type _: Type (?u.3618+1)
Type _
} [
DivisionRing: Type ?u.3621 → Type ?u.3621
DivisionRing
k: Type ?u.3618
k
] [
CharZero: (R : Type ?u.3624) → [inst : AddMonoidWithOne R] → Prop
CharZero
k: Type ?u.3618
k
] {
m:
m
n:
n
:
: Type
} (
n_dvd: n m
n_dvd
:
n:
n
m:
m
) : ((
m:
m
/
n:
n
:
: Type
) :
k: Type ?u.3618
k
) =
m:
m
/
n:
n
:=

Goals accomplished! 🐙
α: Type ?u.3615

k: Type u_1

inst✝¹: DivisionRing k

inst✝: CharZero k

m, n:

n_dvd: n m


↑(m / n) = m / n
α: Type ?u.3615

k: Type u_1

inst✝¹: DivisionRing k

inst✝: CharZero k

m:

n_dvd: 0 m


inl
↑(m / 0) = m / 0
α: Type ?u.3615

k: Type u_1

inst✝¹: DivisionRing k

inst✝: CharZero k

m, n:

n_dvd: n m

hn: n 0


inr
↑(m / n) = m / n
α: Type ?u.3615

k: Type u_1

inst✝¹: DivisionRing k

inst✝: CharZero k

m, n:

n_dvd: n m


↑(m / n) = m / n
α: Type ?u.3615

k: Type u_1

inst✝¹: DivisionRing k

inst✝: CharZero k

m:

n_dvd: 0 m


inl
↑(m / 0) = m / 0
α: Type ?u.3615

k: Type u_1

inst✝¹: DivisionRing k

inst✝: CharZero k

m:

n_dvd: 0 m


inl
↑(m / 0) = m / 0
α: Type ?u.3615

k: Type u_1

inst✝¹: DivisionRing k

inst✝: CharZero k

m, n:

n_dvd: n m

hn: n 0


inr
↑(m / n) = m / n

Goals accomplished! 🐙
α: Type ?u.3615

k: Type u_1

inst✝¹: DivisionRing k

inst✝: CharZero k

m, n:

n_dvd: n m


↑(m / n) = m / n
α: Type ?u.3615

k: Type u_1

inst✝¹: DivisionRing k

inst✝: CharZero k

m, n:

n_dvd: n m

hn: n 0


inr
↑(m / n) = m / n
α: Type ?u.3615

k: Type u_1

inst✝¹: DivisionRing k

inst✝: CharZero k

m, n:

n_dvd: n m

hn: n 0


inr
↑(m / n) = m / n

Goals accomplished! 🐙
#align int.cast_div_char_zero
Int.cast_div_charZero: ∀ {k : Type u_1} [inst : DivisionRing k] [inst_1 : CharZero k] {m n : }, n m↑(m / n) = m / n
Int.cast_div_charZero
end Int theorem
RingHom.injective_int: ∀ {α : Type u_1} [inst : NonAssocRing α] (f : →+* α) [inst_1 : CharZero α], Function.Injective f
RingHom.injective_int
{
α: Type ?u.4664
α
:
Type _: Type (?u.4664+1)
Type _
} [
NonAssocRing: Type ?u.4667 → Type ?u.4667
NonAssocRing
α: Type ?u.4664
α
] (
f: →+* α
f
:
: Type
→+*
α: Type ?u.4664
α
) [
CharZero: (R : Type ?u.4869) → [inst : AddMonoidWithOne R] → Prop
CharZero
α: Type ?u.4664
α
] :
Function.Injective: {α : Sort ?u.4941} → {β : Sort ?u.4940} → (αβ) → Prop
Function.Injective
f: →+* α
f
:=
Subsingleton.elim: ∀ {α : Sort ?u.5330} [h : Subsingleton α] (a b : α), a = b
Subsingleton.elim
(
Int.castRingHom: (α : Type ?u.5333) → [inst : NonAssocRing α] → →+* α
Int.castRingHom
_: Type ?u.5333
_
)
f: →+* α
f
Int.cast_injective: ∀ {α : Type ?u.5363} [inst : AddGroupWithOne α] [inst_1 : CharZero α], Function.Injective Int.cast
Int.cast_injective
#align ring_hom.injective_int
RingHom.injective_int: ∀ {α : Type u_1} [inst : NonAssocRing α] (f : →+* α) [inst_1 : CharZero α], Function.Injective f
RingHom.injective_int