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) 2016 Jeremy Avigad. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jeremy Avigad, Mario Carneiro
-/
import Std.Data.Int.Lemmas

/-!
# Lemmas about integer division
-/


open Nat

namespace Int

/-! ### `/`  -/

theorem 
ofNat_div: ∀ (m n : Nat), ↑(m / n) = div m n
ofNat_div
(
m: Nat
m
n: Nat
n
:
Nat: Type
Nat
) : ↑(
m: Nat
m
/
n: Nat
n
) =
div: IntIntInt
div
m: Nat
m
n: Nat
n
:=
rfl: ∀ {α : Sort ?u.133} {a : α}, a = a
rfl
theorem
ofNat_fdiv: ∀ (m n : Nat), ↑(m / n) = fdiv m n
ofNat_fdiv
: ∀
m: Nat
m
n: Nat
n
:
Nat: Type
Nat
, ↑(
m: Nat
m
/
n: Nat
n
) =
fdiv: IntIntInt
fdiv
m: Nat
m
n: Nat
n
|
0: Nat
0
, _ =>

Goals accomplished! 🐙
x✝: Nat


↑(0 / x✝) = fdiv 0 x✝

Goals accomplished! 🐙
|
succ: NatNat
succ
_, _ =>
rfl: ∀ {α : Sort ?u.330} {a : α}, a = a
rfl
@[simp, norm_cast] theorem
ofNat_ediv: ∀ (m n : Nat), ↑(m / n) = m / n
ofNat_ediv
(
m: Nat
m
n: Nat
n
:
Nat: Type
Nat
) : (↑(
m: Nat
m
/
n: Nat
n
) :
Int: Type
Int
) = ↑
m: Nat
m
/ ↑
n: Nat
n
:=
rfl: ∀ {α : Sort ?u.673} {a : α}, a = a
rfl
theorem
negSucc_ediv: ∀ (m : Nat) {b : Int}, 0 < b-[m+1] / b = -(div (m) b + 1)
negSucc_ediv
(
m: Nat
m
:
Nat: Type
Nat
) {
b: Int
b
:
Int: Type
Int
} (
H: 0 < b
H
:
0: ?m.795
0
<
b: Int
b
) : -[
m: Nat
m
+1] /
b: Int
b
= -(
div: IntIntInt
div
m: Nat
m
b: Int
b
+
1: ?m.865
1
) := match
b: Int
b
,
eq_succ_of_zero_lt: ∀ {a : Int}, 0 < an, a = ↑(succ n)
eq_succ_of_zero_lt
H: 0 < b
H
with | _, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.964} {a : α}, a = a
rfl
⟩ =>
rfl: ∀ {α : Sort ?u.1024} {a : α}, a = a
rfl
@[simp] protected theorem
zero_div: ∀ (b : Int), div 0 b = 0
zero_div
: ∀
b: Int
b
:
Int: Type
Int
,
div: IntIntInt
div
0: ?m.1313
0
b: Int
b
=
0: ?m.1322
0
|
ofNat: NatInt
ofNat
_ => show
ofNat: NatInt
ofNat
_: Nat
_
=
_: ?m.1355
_
by

Goals accomplished! 🐙
| -[_+1] => show -
ofNat: NatInt
ofNat
_: Nat
_
=
_: ?m.1405
_
by

Goals accomplished! 🐙
@[local simp] theorem
zero_ediv: ∀ (b : Int), 0 / b = 0
zero_ediv
: ∀
b: Int
b
:
Int: Type
Int
,
0: ?m.1740
0
/
b: Int
b
=
0: ?m.1752
0
|
ofNat: NatInt
ofNat
_ => show
ofNat: NatInt
ofNat
_: Nat
_
=
_: ?m.1821
_
by

Goals accomplished! 🐙
| -[_+1] => show -
ofNat: NatInt
ofNat
_: Nat
_
=
_: ?m.1876
_
by

Goals accomplished! 🐙
@[simp] theorem
zero_fdiv: ∀ (b : Int), fdiv 0 b = 0
zero_fdiv
(
b: Int
b
:
Int: Type
Int
) :
fdiv: IntIntInt
fdiv
0: ?m.2710
0
b: Int
b
=
0: ?m.2719
0
:=

Goals accomplished! 🐙
b: Int


fdiv 0 b = 0
a✝: Nat


ofNat
fdiv 0 (ofNat a✝) = 0
a✝: Nat


negSucc
fdiv 0 -[a✝+1] = 0
b: Int


fdiv 0 b = 0
a✝: Nat


ofNat
fdiv 0 (ofNat a✝) = 0
a✝: Nat


negSucc
fdiv 0 -[a✝+1] = 0
b: Int


fdiv 0 b = 0

Goals accomplished! 🐙
@[simp] protected theorem
div_zero: ∀ (a : Int), div a 0 = 0
div_zero
: ∀
a: Int
a
:
Int: Type
Int
,
div: IntIntInt
div
a: Int
a
0: ?m.2838
0
=
0: ?m.2847
0
|
ofNat: NatInt
ofNat
_ => show
ofNat: NatInt
ofNat
_: Nat
_
=
_: ?m.2880
_
by

Goals accomplished! 🐙
| -[_+1] =>
rfl: ∀ {α : Sort ?u.2925} {a : α}, a = a
rfl
-- Will be generalized to Euclidean domains. @[local simp] protected theorem
ediv_zero: ∀ (a : Int), a / 0 = 0
ediv_zero
: ∀
a: Int
a
:
Int: Type
Int
,
a: Int
a
/
0: ?m.3111
0
=
0: ?m.3123
0
|
ofNat: NatInt
ofNat
_ => show
ofNat: NatInt
ofNat
_: Nat
_
=
_: ?m.3192
_
by

Goals accomplished! 🐙
| -[_+1] =>
rfl: ∀ {α : Sort ?u.3242} {a : α}, a = a
rfl
@[simp] protected theorem
fdiv_zero: ∀ (a : Int), fdiv a 0 = 0
fdiv_zero
: ∀
a: Int
a
:
Int: Type
Int
,
fdiv: IntIntInt
fdiv
a: Int
a
0: ?m.3391
0
=
0: ?m.3400
0
|
0: Int
0
=>
rfl: ∀ {α : Sort ?u.3423} {a : α}, a = a
rfl
|
succ: NatNat
succ
_ =>
rfl: ∀ {α : Sort ?u.3496} {a : α}, a = a
rfl
| -[_+1] =>
rfl: ∀ {α : Sort ?u.3545} {a : α}, a = a
rfl
theorem
fdiv_eq_ediv: ∀ (a : Int) {b : Int}, 0 bfdiv a b = a / b
fdiv_eq_ediv
: ∀ (
a: Int
a
:
Int: Type
Int
) {
b: Int
b
:
Int: Type
Int
},
0: ?m.3675
0
b: Int
b
fdiv: IntIntInt
fdiv
a: Int
a
b: Int
b
=
a: Int
a
/
b: Int
b
|
0: Int
0
, _, _ | -[_+1],
0: Int
0
, _ =>

Goals accomplished! 🐙
a✝: Nat

x✝: 0 0


fdiv -[a✝+1] 0 = -[a✝+1] / 0

Goals accomplished! 🐙
|
succ: NatNat
succ
_,
ofNat: NatInt
ofNat
_, _ | -[_+1],
succ: NatNat
succ
_, _ =>
rfl: ∀ {α : Sort ?u.3951} {a : α}, a = a
rfl
theorem
div_eq_ediv: ∀ {a b : Int}, 0 a0 bdiv a b = a / b
div_eq_ediv
: ∀ {
a: Int
a
b: Int
b
:
Int: Type
Int
},
0: ?m.4634
0
a: Int
a
0: ?m.4662
0
b: Int
b
a: Int
a
.
div: IntIntInt
div
b: Int
b
=
a: Int
a
/
b: Int
b
|
0: Int
0
, _, _, _ | _,
0: Int
0
, _, _ =>

Goals accomplished! 🐙
x✝²: Int

x✝¹: 0 x✝²

x✝: 0 0


div x✝² 0 = x✝² / 0

Goals accomplished! 🐙
|
succ: NatNat
succ
_,
succ: NatNat
succ
_, _, _ =>
rfl: ∀ {α : Sort ?u.4884} {a : α}, a = a
rfl
theorem
fdiv_eq_div: ∀ {a b : Int}, 0 a0 bfdiv a b = div a b
fdiv_eq_div
{
a: Int
a
b: Int
b
:
Int: Type
Int
} (
Ha: 0 a
Ha
:
0: ?m.6091
0
a: Int
a
) (
Hb: 0 b
Hb
:
0: ?m.6119
0
b: Int
b
) :
fdiv: IntIntInt
fdiv
a: Int
a
b: Int
b
=
div: IntIntInt
div
a: Int
a
b: Int
b
:=
div_eq_ediv: ∀ {a b : Int}, 0 a0 bdiv a b = a / b
div_eq_ediv
Ha: 0 a
Ha
Hb: 0 b
Hb
fdiv_eq_ediv: ∀ (a : Int) {b : Int}, 0 bfdiv a b = a / b
fdiv_eq_ediv
_: Int
_
Hb: 0 b
Hb
@[simp] protected theorem
div_neg: ∀ (a b : Int), div a (-b) = -div a b
div_neg
: ∀
a: Int
a
b: Int
b
:
Int: Type
Int
,
a: Int
a
.
div: IntIntInt
div
(-
b: Int
b
) = -(
a: Int
a
.
div: IntIntInt
div
b: Int
b
) |
ofNat: NatInt
ofNat
m: Nat
m
,
0: Int
0
=> show
ofNat: NatInt
ofNat
(
m: Nat
m
/
0: ?m.6225
0
) = -↑(
m: Nat
m
/
0: ?m.6280
0
) by
m: Nat


ofNat (m / 0) = -↑(m / 0)
m: Nat


ofNat 0 = -0
m: Nat


ofNat 0 = -0
m: Nat


ofNat 0 = -0
m: Nat


ofNat (m / 0) = -↑(m / 0)

Goals accomplished! 🐙
|
ofNat: NatInt
ofNat
m: Nat
m
, -[
n: Nat
n
+1] | -[
m: Nat
m
+1],
succ: NatNat
succ
n: Nat
n
=> (
Int.neg_neg: ∀ (a : Int), - -a = a
Int.neg_neg
_: Int
_
).
symm: ∀ {α : Sort ?u.6519} {a b : α}, a = bb = a
symm
|
ofNat: NatInt
ofNat
m: Nat
m
,
succ: NatNat
succ
n: Nat
n
| -[
m: Nat
m
+1],
0: Int
0
| -[
m: Nat
m
+1], -[
n: Nat
n
+1] =>
rfl: ∀ {α : Sort ?u.6731} {a : α}, a = a
rfl
@[simp] protected theorem
ediv_neg: ∀ (a b : Int), a / -b = -(a / b)
ediv_neg
: ∀
a: Int
a
b: Int
b
:
Int: Type
Int
,
a: Int
a
/ (-
b: Int
b
) = -(
a: Int
a
/
b: Int
b
) |
ofNat: NatInt
ofNat
m: Nat
m
,
0: Int
0
=> show
ofNat: NatInt
ofNat
(
m: Nat
m
/
0: ?m.7134
0
) = -↑(
m: Nat
m
/
0: ?m.7181
0
) by
m: Nat


ofNat (m / 0) = -↑(m / 0)
m: Nat


ofNat 0 = -0
m: Nat


ofNat 0 = -0
m: Nat


ofNat 0 = -0
m: Nat


ofNat (m / 0) = -↑(m / 0)

Goals accomplished! 🐙
|
ofNat: NatInt
ofNat
m: Nat
m
, -[
n: Nat
n
+1] => (
Int.neg_neg: ∀ (a : Int), - -a = a
Int.neg_neg
_: Int
_
).
symm: ∀ {α : Sort ?u.7352} {a b : α}, a = bb = a
symm
|
ofNat: NatInt
ofNat
m: Nat
m
,
succ: NatNat
succ
n: Nat
n
| -[
m: Nat
m
+1],
0: Int
0
| -[
m: Nat
m
+1],
succ: NatNat
succ
n: Nat
n
| -[
m: Nat
m
+1], -[
n: Nat
n
+1] =>
rfl: ∀ {α : Sort ?u.7707} {a : α}, a = a
rfl
protected theorem
div_def: ∀ (a b : Int), a / b = ediv a b
div_def
(
a: Int
a
b: Int
b
:
Int: Type
Int
) :
a: Int
a
/
b: Int
b
=
Int.ediv: IntIntInt
Int.ediv
a: Int
a
b: Int
b
:=
rfl: ∀ {α : Sort ?u.8063} {a : α}, a = a
rfl
-- Lean 4 core provides an instance for `Div Int` using `Int.div`. -- Even though we provide a higher priority instance in `Std.Data.Int.Basic`, -- we provide a `simp` lemma here to unfold usages of that instance back to `Int.div`. @[simp] theorem
div_def': ∀ (a b : Int), a / b = div a b
div_def'
(
a: Int
a
b: Int
b
:
Int: Type
Int
) : @
HDiv.hDiv: {α : Type ?u.8079} → {β : Type ?u.8078} → {γ : outParam (Type ?u.8077)} → [self : HDiv α β γ] → αβγ
HDiv.hDiv
Int: Type
Int
Int: Type
Int
Int: Type
Int
(@
instHDiv: {α : Type ?u.8080} → [inst : Div α] → HDiv α α α
instHDiv
Int: Type
Int
Int.instDivInt: Div Int
Int.instDivInt
)
a: Int
a
b: Int
b
=
Int.div: IntIntInt
Int.div
a: Int
a
b: Int
b
:=
rfl: ∀ {α : Sort ?u.8089} {a : α}, a = a
rfl
@[simp] protected theorem
neg_div: ∀ (a b : Int), div (-a) b = -div a b
neg_div
: ∀
a: Int
a
b: Int
b
:
Int: Type
Int
, (-
a: Int
a
).
div: IntIntInt
div
b: Int
b
= -(
a: Int
a
.
div: IntIntInt
div
b: Int
b
) |
0: Int
0
,
n: Int
n
=>

Goals accomplished! 🐙
n: Int


div (-0) n = -div 0 n

Goals accomplished! 🐙
|
succ: NatNat
succ
m: Nat
m
, (n:Nat) | -[
m: Nat
m
+1],
0: Int
0
| -[
m: Nat
m
+1], -[
n: Nat
n
+1] =>
rfl: ∀ {α : Sort ?u.8303} {a : α}, a = a
rfl
|
succ: NatNat
succ
m: Nat
m
, -[
n: Nat
n
+1] | -[
m: Nat
m
+1],
succ: NatNat
succ
n: Nat
n
=> (
Int.neg_neg: ∀ (a : Int), - -a = a
Int.neg_neg
_: Int
_
).
symm: ∀ {α : Sort ?u.8546} {a b : α}, a = bb = a
symm
protected theorem
neg_div_neg: ∀ (a b : Int), div (-a) (-b) = div a b
neg_div_neg
(
a: Int
a
b: Int
b
:
Int: Type
Int
) : (-
a: Int
a
).
div: IntIntInt
div
(-
b: Int
b
) =
a: Int
a
.
div: IntIntInt
div
b: Int
b
:=

Goals accomplished! 🐙
a, b: Int


div (-a) (-b) = div a b

Goals accomplished! 🐙
protected theorem
div_nonneg: ∀ {a b : Int}, 0 a0 b0 div a b
div_nonneg
{
a: Int
a
b: Int
b
:
Int: Type
Int
} (
Ha: 0 a
Ha
:
0: ?m.9293
0
a: Int
a
) (
Hb: 0 b
Hb
:
0: ?m.9321
0
b: Int
b
) :
0: ?m.9341
0
a: Int
a
.
div: IntIntInt
div
b: Int
b
:= match
a: Int
a
,
b: Int
b
,
eq_ofNat_of_zero_le: ∀ {a : Int}, 0 an, a = n
eq_ofNat_of_zero_le
Ha: 0 a
Ha
,
eq_ofNat_of_zero_le: ∀ {a : Int}, 0 an, a = n
eq_ofNat_of_zero_le
Hb: 0 b
Hb
with | _, _, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.9393} {a : α}, a = a
rfl
⟩, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.9397} {a : α}, a = a
rfl
⟩ =>
ofNat_zero_le: ∀ (n : Nat), 0 n
ofNat_zero_le
_: Nat
_
theorem
fdiv_nonneg: ∀ {a b : Int}, 0 a0 b0 fdiv a b
fdiv_nonneg
{
a: Int
a
b: Int
b
:
Int: Type
Int
} (
Ha: 0 a
Ha
:
0: ?m.9915
0
a: Int
a
) (
Hb: 0 b
Hb
:
0: ?m.9943
0
b: Int
b
) :
0: ?m.9963
0
a: Int
a
.
fdiv: IntIntInt
fdiv
b: Int
b
:= match
a: Int
a
,
b: Int
b
,
eq_ofNat_of_zero_le: ∀ {a : Int}, 0 an, a = n
eq_ofNat_of_zero_le
Ha: 0 a
Ha
,
eq_ofNat_of_zero_le: ∀ {a : Int}, 0 an, a = n
eq_ofNat_of_zero_le
Hb: 0 b
Hb
with | _, _, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.10023} {a : α}, a = a
rfl
⟩, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.10027} {a : α}, a = a
rfl
⟩ =>
ofNat_fdiv: ∀ (m n : Nat), ↑(m / n) = fdiv m n
ofNat_fdiv
.. ▸
ofNat_zero_le: ∀ (n : Nat), 0 n
ofNat_zero_le
_: Nat
_
theorem
ediv_nonneg: ∀ {a b : Int}, 0 a0 b0 a / b
ediv_nonneg
{
a: Int
a
b: Int
b
:
Int: Type
Int
} (
Ha: 0 a
Ha
:
0: ?m.10516
0
a: Int
a
) (
Hb: 0 b
Hb
:
0: ?m.10544
0
b: Int
b
) :
0: ?m.10564
0
a: Int
a
/
b: Int
b
:= match
a: Int
a
,
b: Int
b
,
eq_ofNat_of_zero_le: ∀ {a : Int}, 0 an, a = n
eq_ofNat_of_zero_le
Ha: 0 a
Ha
,
eq_ofNat_of_zero_le: ∀ {a : Int}, 0 an, a = n
eq_ofNat_of_zero_le
Hb: 0 b
Hb
with | _, _, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.10648} {a : α}, a = a
rfl
⟩, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.10652} {a : α}, a = a
rfl
⟩ =>
ofNat_zero_le: ∀ (n : Nat), 0 n
ofNat_zero_le
_: Nat
_
protected theorem
div_nonpos: ∀ {a b : Int}, 0 ab 0div a b 0
div_nonpos
{
a: Int
a
b: Int
b
:
Int: Type
Int
} (
Ha: 0 a
Ha
:
0: ?m.11155
0
a: Int
a
) (
Hb: b 0
Hb
:
b: Int
b
0: ?m.11183
0
) :
a: Int
a
.
div: IntIntInt
div
b: Int
b
0: ?m.11202
0
:=
Int.nonpos_of_neg_nonneg: ∀ {a : Int}, 0 -aa 0
Int.nonpos_of_neg_nonneg
<|
Int.div_neg: ∀ (a b : Int), div a (-b) = -div a b
Int.div_neg
.. ▸
Int.div_nonneg: ∀ {a b : Int}, 0 a0 b0 div a b
Int.div_nonneg
Ha: 0 a
Ha
(
Int.neg_nonneg_of_nonpos: ∀ {a : Int}, a 00 -a
Int.neg_nonneg_of_nonpos
Hb: b 0
Hb
) theorem
fdiv_nonpos: ∀ {a b : Int}, 0 ab 0fdiv a b 0
fdiv_nonpos
: ∀ {
a: Int
a
b: Int
b
:
Int: Type
Int
},
0: ?m.11260
0
a: Int
a
b: Int
b
0: ?m.11288
0
a: Int
a
.
fdiv: IntIntInt
fdiv
b: Int
b
0: ?m.11306
0
|
0: Int
0
,
0: Int
0
, _, _ |
0: Int
0
, -[_+1], _, _ |
succ: NatNat
succ
_,
0: Int
0
, _, _ |
succ: NatNat
succ
_, -[_+1], _, _ => ⟨
_: Nat
_
theorem
ediv_nonpos: ∀ {a b : Int}, 0 ab 0a / b 0
ediv_nonpos
{
a: Int
a
b: Int
b
:
Int: Type
Int
} (
Ha: 0 a
Ha
:
0: ?m.13065
0
a: Int
a
) (
Hb: b 0
Hb
:
b: Int
b
0: ?m.13093
0
) :
a: Int
a
/
b: Int
b
0: ?m.13113
0
:=
Int.nonpos_of_neg_nonneg: ∀ {a : Int}, 0 -aa 0
Int.nonpos_of_neg_nonneg
<|
Int.ediv_neg: ∀ (a b : Int), a / -b = -(a / b)
Int.ediv_neg
.. ▸
Int.ediv_nonneg: ∀ {a b : Int}, 0 a0 b0 a / b
Int.ediv_nonneg
Ha: 0 a
Ha
(
Int.neg_nonneg_of_nonpos: ∀ {a : Int}, a 00 -a
Int.neg_nonneg_of_nonpos
Hb: b 0
Hb
) theorem
fdiv_neg': ∀ {a b : Int}, a < 00 < bfdiv a b < 0
fdiv_neg'
: ∀ {
a: Int
a
b: Int
b
:
Int: Type
Int
},
a: Int
a
<
0: ?m.13206
0
0: ?m.13231
0
<
b: Int
b
a: Int
a
.
fdiv: IntIntInt
fdiv
b: Int
b
<
0: ?m.13252
0
| -[_+1],
succ: NatNat
succ
_, _, _ =>
negSucc_lt_zero: ∀ (n : Nat), -[n+1] < 0
negSucc_lt_zero
_: Nat
_
theorem
ediv_neg': ∀ {a b : Int}, a < 00 < ba / b < 0
ediv_neg'
{
a: Int
a
b: Int
b
:
Int: Type
Int
} (
Ha: a < 0
Ha
:
a: Int
a
<
0: ?m.14527
0
) (
Hb: 0 < b
Hb
:
0: ?m.14552
0
<
b: Int
b
) :
a: Int
a
/
b: Int
b
<
0: ?m.14575
0
:= match
a: Int
a
,
b: Int
b
,
eq_negSucc_of_lt_zero: ∀ {a : Int}, a < 0n, a = -[n+1]
eq_negSucc_of_lt_zero
Ha: a < 0
Ha
,
eq_succ_of_zero_lt: ∀ {a : Int}, 0 < an, a = ↑(succ n)
eq_succ_of_zero_lt
Hb: 0 < b
Hb
with | _, _, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.14653} {a : α}, a = a
rfl
⟩, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.14657} {a : α}, a = a
rfl
⟩ =>
negSucc_lt_zero: ∀ (n : Nat), -[n+1] < 0
negSucc_lt_zero
_: Nat
_
@[simp] protected theorem
div_one: ∀ (a : Int), div a 1 = a
div_one
: ∀
a: Int
a
:
Int: Type
Int
,
a: Int
a
.
div: IntIntInt
div
1: ?m.15180
1
=
a: Int
a
| (n:Nat) =>
congrArg: ∀ {α : Sort ?u.15243} {β : Sort ?u.15242} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
ofNat: NatInt
ofNat
(
Nat.div_one: ∀ (n : Nat), n / 1 = n
Nat.div_one
_: Nat
_
) | -[
n: Nat
n
+1] =>

Goals accomplished! 🐙

Goals accomplished! 🐙
@[simp] theorem
fdiv_one: ∀ (a : Int), fdiv a 1 = a
fdiv_one
: ∀
a: Int
a
:
Int: Type
Int
,
a: Int
a
.
fdiv: IntIntInt
fdiv
1: ?m.15511
1
=
a: Int
a
|
0: Int
0
=>
rfl: ∀ {α : Sort ?u.15533} {a : α}, a = a
rfl
|
succ: NatNat
succ
_ =>
congrArg: ∀ {α : Sort ?u.15607} {β : Sort ?u.15606} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
Nat.cast: {R : Type ?u.15612} → [inst : NatCast R] → NatR
Nat.cast
(
Nat.div_one: ∀ (n : Nat), n / 1 = n
Nat.div_one
_: Nat
_
) | -[_+1] =>
congrArg: ∀ {α : Sort ?u.15663} {β : Sort ?u.15662} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
negSucc: NatInt
negSucc
(
Nat.div_one: ∀ (n : Nat), n / 1 = n
Nat.div_one
_: Nat
_
) @[simp] theorem
ediv_one: ∀ (a : Int), a / 1 = a
ediv_one
: ∀
a: Int
a
:
Int: Type
Int
,
a: Int
a
/
1: ?m.15797
1
=
a: Int
a
| (_:Nat) =>
congrArg: ∀ {α : Sort ?u.15900} {β : Sort ?u.15899} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
Nat.cast: {R : Type ?u.15905} → [inst : NatCast R] → NatR
Nat.cast
(
Nat.div_one: ∀ (n : Nat), n / 1 = n
Nat.div_one
_: Nat
_
) | -[_+1] =>
congrArg: ∀ {α : Sort ?u.15964} {β : Sort ?u.15963} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
negSucc: NatInt
negSucc
(
Nat.div_one: ∀ (n : Nat), n / 1 = n
Nat.div_one
_: Nat
_
) theorem
div_eq_zero_of_lt: ∀ {a b : Int}, 0 aa < bdiv a b = 0
div_eq_zero_of_lt
{
a: Int
a
b: Int
b
:
Int: Type
Int
} (
H1: 0 a
H1
:
0: ?m.16065
0
a: Int
a
) (
H2: a < b
H2
:
a: Int
a
<
b: Int
b
) :
a: Int
a
.
div: IntIntInt
div
b: Int
b
=
0: ?m.16102
0
:= match
a: Int
a
,
b: Int
b
,
eq_ofNat_of_zero_le: ∀ {a : Int}, 0 an, a = n
eq_ofNat_of_zero_le
H1: 0 a
H1
,
eq_succ_of_zero_lt: ∀ {a : Int}, 0 < an, a = ↑(succ n)
eq_succ_of_zero_lt
(
Int.lt_of_le_of_lt: ∀ {a b c : Int}, a bb < ca < c
Int.lt_of_le_of_lt
H1: 0 a
H1
H2: a < b
H2
) with | _, _, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.16151} {a : α}, a = a
rfl
⟩, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.16163} {a : α}, a = a
rfl
⟩ =>
congrArg: ∀ {α : Sort ?u.16261} {β : Sort ?u.16260} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
Nat.cast: {R : Type ?u.16266} → [inst : NatCast R] → NatR
Nat.cast
<|
Nat.div_eq_of_lt: ∀ {a b : Nat}, a < ba / b = 0
Nat.div_eq_of_lt
<|
ofNat_lt: ∀ {n m : Nat}, n < m n < m
ofNat_lt
.
1: ∀ {a b : Prop}, (a b) → ab
1
H2: w✝¹ < ↑(succ w✝)
H2
theorem
ediv_eq_zero_of_lt: ∀ {a b : Int}, 0 aa < ba / b = 0
ediv_eq_zero_of_lt
{
a: Int
a
b: Int
b
:
Int: Type
Int
} (
H1: 0 a
H1
:
0: ?m.16712
0
a: Int
a
) (
H2: a < b
H2
:
a: Int
a
<
b: Int
b
) :
a: Int
a
/
b: Int
b
=
0: ?m.16750
0
:= match
a: Int
a
,
b: Int
b
,
eq_ofNat_of_zero_le: ∀ {a : Int}, 0 an, a = n
eq_ofNat_of_zero_le
H1: 0 a
H1
,
eq_succ_of_zero_lt: ∀ {a : Int}, 0 < an, a = ↑(succ n)
eq_succ_of_zero_lt
(
Int.lt_of_le_of_lt: ∀ {a b c : Int}, a bb < ca < c
Int.lt_of_le_of_lt
H1: 0 a
H1
H2: a < b
H2
) with | _, _, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.16838} {a : α}, a = a
rfl
⟩, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.16842} {a : α}, a = a
rfl
⟩ =>
congrArg: ∀ {α : Sort ?u.16940} {β : Sort ?u.16939} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
Nat.cast: {R : Type ?u.16945} → [inst : NatCast R] → NatR
Nat.cast
<|
Nat.div_eq_of_lt: ∀ {a b : Nat}, a < ba / b = 0
Nat.div_eq_of_lt
<|
ofNat_lt: ∀ {n m : Nat}, n < m n < m
ofNat_lt
.
1: ∀ {a b : Prop}, (a b) → ab
1
H2: w✝¹ < ↑(succ w✝)
H2
theorem
add_mul_ediv_right: ∀ (a b : Int) {c : Int}, c 0(a + b * c) / c = a / c + b
add_mul_ediv_right
(
a: Int
a
b: Int
b
:
Int: Type
Int
) {
c: Int
c
:
Int: Type
Int
} (
H: c 0
H
:
c: Int
c
0: ?m.17380
0
) : (
a: Int
a
+
b: Int
b
*
c: Int
c
) /
c: Int
c
=
a: Int
a
/
c: Int
c
+
b: Int
b
:= suffices ∀ {{
a: Int
a
b: Int
b
c: Int
c
:
Int: Type
Int
}},
0: ?m.17552
0
<
c: Int
c
→ (
a: Int
a
+
b: Int
b
*
c: Int
c
).
ediv: IntIntInt
ediv
c: Int
c
=
a: Int
a
.
ediv: IntIntInt
ediv
c: Int
c
+
b: Int
b
from match
Int.lt_trichotomy: ∀ (a b : Int), a < b a = b b < a
Int.lt_trichotomy
c: Int
c
0: ?m.19295
0
with |
Or.inl: ∀ {a b : Prop}, aa b
Or.inl
hlt: c < 0
hlt
=>

Goals accomplished! 🐙
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + b * c) / c = a / c + b
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + b * c) / c = a / c + b
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


-((a + b * c) / c) = -(a / c + b)
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + b * c) / c = a / c + b
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + b * c) / -c = -(a / c + b)
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + b * c) / c = a / c + b
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + b * c) / -c = -(a / c) + -b
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + b * c) / c = a / c + b
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + b * c) / -c = a / -c + -b
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + b * c) / c = a / c + b
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + -b * -c) / -c = a / -c + -b
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + -b * -c) / -c = a / -c + -b
a, b, c: Int

H: c 0

this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b

hlt: c < 0


(a + b * c) / c = a / c + b

Goals accomplished! 🐙
|
Or.inr: ∀ {a b : Prop}, ba b
Or.inr
(
Or.inl: ∀ {a b : Prop}, aa b
Or.inl
HEq: c = 0
HEq
) =>
absurd: ∀ {a : Prop} {b : Sort ?u.19344}, a¬ab
absurd
HEq: c = 0
HEq
H: c 0
H
|
Or.inr: ∀ {a b : Prop}, ba b
Or.inr
(
Or.inr: ∀ {a b : Prop}, ba b
Or.inr
hgt: 0 < c
hgt
) =>
this: ∀ ⦃a b c : Int⦄, 0 < cediv (a + b * c) c = ediv a c + b
this
hgt: 0 < c
hgt
suffices ∀ {
k: Nat
k
n: Nat
n
:
Nat: Type
Nat
} {
a: Int
a
:
Int: Type
Int
}, (
a: Int
a
+
n: Nat
n
*
k: Nat
k
.
succ: NatNat
succ
).
ediv: IntIntInt
ediv
k: Nat
k
.
succ: NatNat
succ
=
a: Int
a
.
ediv: IntIntInt
ediv
k: Nat
k
.
succ: NatNat
succ
+
n: Nat
n
from fun
a: ?m.18068
a
b: ?m.18071
b
c: ?m.18074
c
H: ?m.18077
H
=> match
c: ?m.18074
c
,
eq_succ_of_zero_lt: ∀ {a : Int}, 0 < an, a = ↑(succ n)
eq_succ_of_zero_lt
H: ?m.18077
H
,
b: ?m.18071
b
with | _, ⟨
_: Nat
_
,
rfl: ∀ {α : Sort ?u.18106} {a : α}, a = a
rfl
⟩,
ofNat: NatInt
ofNat
_ =>
this: ∀ {k n : Nat} {a : Int}, ediv (a + n * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) + n
this
| _, ⟨
k: Nat
k
,
rfl: ∀ {α : Sort ?u.18181} {a : α}, a = a
rfl
⟩, -[
n: Nat
n
+1] => show (
a: ?m.18068
a
-
n: Nat
n
.
succ: NatNat
succ
*
k: Nat
k
.
succ: NatNat
succ
).
ediv: IntIntInt
ediv
k: Nat
k
.
succ: NatNat
succ
=
a: ?m.18068
a
.
ediv: IntIntInt
ediv
k: Nat
k
.
succ: NatNat
succ
-
n: Nat
n
.
succ: NatNat
succ
by
a✝, b✝, c✝: Int

H✝: c✝ 0

this: ∀ {k n : Nat} {a : Int}, ediv (a + n * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) + n

a, b, c: Int

k, n: Nat

H: 0 < ↑(succ k)


ediv (a - ↑(succ n) * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) - ↑(succ n)
a✝, b✝, c✝: Int

H✝: c✝ 0

this: ∀ {k n : Nat} {a : Int}, ediv (a + n * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) + n

a, b, c: Int

k, n: Nat

H: 0 < ↑(succ k)


ediv (a - ↑(succ n) * ↑(succ k)) ↑(succ k) + ?m.22475 - ?m.22475 = ediv a ↑(succ k) - ↑(succ n)
a✝, b✝, c✝: Int

H✝: c✝ 0

this: ∀ {k n : Nat} {a : Int}, ediv (a + n * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) + n

a, b, c: Int

k, n: Nat

H: 0 < ↑(succ k)


a✝, b✝, c✝: Int

H✝: c✝ 0

this: ∀ {k n : Nat} {a : Int}, ediv (a + n * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) + n

a, b, c: Int

k, n: Nat

H: 0 < ↑(succ k)


ediv (a - ↑(succ n) * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) - ↑(succ n)
a✝, b✝, c✝: Int

H✝: c✝ 0

this: ∀ {k n : Nat} {a : Int}, ediv (a + n * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) + n

a, b, c: Int

k, n: Nat

H: 0 < ↑(succ k)


ediv (a - ↑(succ n) * ↑(succ k) + ?m.22482 * ↑(succ k)) ↑(succ k) - ?m.22482 = ediv a ↑(succ k) - ↑(succ n)
a✝, b✝, c✝: Int

H✝: c✝ 0

this: ∀ {k n : Nat} {a : Int}, ediv (a + n * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) + n

a, b, c: Int

k, n: Nat

H: 0 < ↑(succ k)


a✝, b✝, c✝: Int

H✝: c✝ 0

this: ∀ {k n : Nat} {a : Int}, ediv (a + n * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) + n

a, b, c: Int

k, n: Nat

H: 0 < ↑(succ k)


ediv (a - ↑(succ n) * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) - ↑(succ n)
a✝, b✝, c✝: Int

H✝: c✝ 0

this: ∀ {k n : Nat} {a : Int}, ediv (a + n * ↑(succ k)) ↑(succ k) = ediv a ↑(succ k) + n

a, b, c: Int

k, n: Nat

H: 0 < ↑(succ k)


ediv a ↑(succ k) - ↑(succ n) = ediv a ↑(succ k) - ↑(succ n)

Goals accomplished! 🐙
fun {
k: ?m.17858
k
n: ?m.17861
n
} => @fun |
ofNat: NatInt
ofNat
m: Nat
m
=>
congrArg: ∀ {α : Sort ?u.17877} {β : Sort ?u.17876} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
ofNat: NatInt
ofNat
<|
Nat.add_mul_div_right: ∀ (x y : Nat) {z : Nat}, 0 < z(x + y * z) / z = x / z + y
Nat.add_mul_div_right
_: Nat
_
_: Nat
_
k: ?m.17858
k
.
succ_pos: ∀ (n : Nat), 0 < succ n
succ_pos
| -[
m: Nat
m
+1] =>

Goals accomplished! 🐙
a, b, c: Int

H: c 0

k, n, m: Nat


ediv (-[m+1] + n * ↑(succ k)) ↑(succ k) = ediv -[m+1] ↑(succ k) + n
a, b, c: Int

H: c 0

k, n, m: Nat


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat


ediv (-[m+1] + n * ↑(succ k)) ↑(succ k) = ediv -[m+1] ↑(succ k) + n
a, b, c: Int

H: c 0

k, n, m: Nat


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


ediv ↑(n * succ k - succ m) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


ediv ↑(n * succ k - succ m) ↑(succ k) = ↑(n - succ (m / succ k))
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


ediv ↑(n * succ k - succ m) ↑(succ k) = ↑(n - succ (m / succ k))
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


(n * succ k - succ m) / succ k = n - succ (m / succ k)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


(n * succ k - succ m) / succ k = n - succ (m / succ k)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


(succ k * n - succ m) / succ k = n - succ (m / succ k)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


(n * succ k - succ m) / succ k = n - succ (m / succ k)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


n - succ (m / succ k) = n - succ (m / succ k)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


h₁
m < succ k * n
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


h₁
m < succ k * n
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


h₁
m < succ k * n
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


h₁
m < succ k * n
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


h₁
m < n * succ k
a, b, c: Int

H: c 0

k, n, m: Nat

h: m < n * succ k


h₁
m < n * succ k
a, b, c: Int

H: c 0

k, n, m: Nat


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: ¬m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: ¬m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)

Goals accomplished! 🐙
a✝, b✝, c: Int

H: c 0

k, n, m: Nat

h✝¹: ¬m < n * succ k

h✝: n * succ k m

a, b: Nat

h: a b


a + -(b + 1) = -[b - a+1]
a✝, b✝, c: Int

H: c 0

k, n, m: Nat

h✝¹: ¬m < n * succ k

h✝: n * succ k m

a, b: Nat

h: a b


a + -(b + 1) = -[b - a+1]
a✝, b✝, c: Int

H: c 0

k, n, m: Nat

h✝¹: ¬m < n * succ k

h✝: n * succ k m

a, b: Nat

h: a b


a + -(b + 1) = -(↑(b - a) + 1)
a✝, b✝, c: Int

H: c 0

k, n, m: Nat

h✝¹: ¬m < n * succ k

h✝: n * succ k m

a, b: Nat

h: a b


a + -(b + 1) = -[b - a+1]
a✝, b✝, c: Int

H: c 0

k, n, m: Nat

h✝¹: ¬m < n * succ k

h✝: n * succ k m

a, b: Nat

h: a b


a + -(b + 1) = -(b - a + 1)
a✝, b✝, c: Int

H: c 0

k, n, m: Nat

h✝¹: ¬m < n * succ k

h✝: n * succ k m

a, b: Nat

h: a b


a + -(b + 1) = -(b - a + 1)
a✝, b✝, c: Int

H: c 0

k, n, m: Nat

h✝¹: ¬m < n * succ k

h✝: n * succ k m

a, b: Nat

h: a b


a + -(b + 1) = -[b - a+1]

Goals accomplished! 🐙
a, b, c: Int

H: c 0

k, n, m: Nat

h: ¬m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


ediv (↑(n * succ k) + -(m + 1)) ↑(succ k) = n + -(↑(m / succ k) + 1)
a, b, c: Int

H: c 0

k, n, m: Nat

h: ¬m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


ediv (↑(n * succ k) + -(m + 1)) ↑(succ k) = n + -(↑(m / succ k) + 1)
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


ediv -[m - n * succ k+1] ↑(succ k) = n + -(↑(m / succ k) + 1)
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


ediv (↑(n * succ k) + -(m + 1)) ↑(succ k) = n + -(↑(m / succ k) + 1)
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


ediv -[m - n * succ k+1] ↑(succ k) = -[m / succ k - n+1]
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


ediv -[m - n * succ k+1] ↑(succ k) = -[m / succ k - n+1]
a, b, c: Int

H: c 0

k, n, m: Nat

h: ¬m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


(m - n * succ k) / succ k = m / succ k - n
a, b, c: Int

H: c 0

k, n, m: Nat

h: ¬m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


(m - n * succ k) / succ k = m / succ k - n
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


(m - succ k * n) / succ k = m / succ k - n
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


(m - n * succ k) / succ k = m / succ k - n
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


m / succ k - n = m / succ k - n
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


h₁
succ k * n m
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


h₁
succ k * n m
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


h₁
succ k * n m
a, b, c: Int

H: c 0

k, n, m: Nat

h: ¬m < n * succ k


ediv (↑(n * succ k) - ↑(succ m)) ↑(succ k) = n - ↑(m / succ k + 1)
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


h₁
succ k * n m
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


h₁
n * succ k m
a, b, c: Int

H✝: c 0

k, n, m: Nat

h✝: ¬m < n * succ k

h: n * succ k m

H: ∀ {a b : Nat}, a ba + -(b + 1) = -[b - a+1]


h₁
n * succ k m
theorem
add_mul_ediv_left: ∀ (a : Int) {b : Int} (c : Int), b 0(a + b * c) / b = a / b + c
add_mul_ediv_left
(
a: Int
a
:
Int: Type
Int
) {
b: Int
b
:
Int: Type
Int
} (
c: Int
c
:
Int: Type
Int
) (
H: b 0
H
:
b: Int
b
0: ?m.22707
0
) : (
a: Int
a
+
b: Int
b
*
c: Int
c
) /
b: Int
b
=
a: Int
a
/
b: Int
b
+
c: Int
c
:=
Int.mul_comm: ∀ (a b : Int), a * b = b * a
Int.mul_comm
.. ▸
Int.add_mul_ediv_right: ∀ (a b : Int) {c : Int}, c 0(a + b * c) / c = a / c + b
Int.add_mul_ediv_right
_: Int
_
_: Int
_
H: b 0
H
theorem
add_ediv_of_dvd_right: ∀ {a b c : Int}, c b(a + b) / c = a / c + b / c
add_ediv_of_dvd_right
{
a: Int
a
b: Int
b
c: Int
c
:
Int: Type
Int
} (
H: c b
H
:
c: Int
c
b: Int
b
) : (
a: Int
a
+
b: Int
b
) /
c: Int
c
=
a: Int
a
/
c: Int
c
+
b: Int
b
/
c: Int
c
:= if
h: ?m.23104
h
:
c: Int
c
=
0: ?m.23066
0
then

Goals accomplished! 🐙
a, b, c: Int

H: c b

h: c = 0


(a + b) / c = a / c + b / c

Goals accomplished! 🐙
else

Goals accomplished! 🐙
a, b, c: Int

H: c b

h: ¬c = 0


(a + b) / c = a / c + b / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


(a + b) / c = a / c + b / c
a, b, c: Int

H: c b

h: ¬c = 0


(a + b) / c = a / c + b / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


(a + b) / c = a / c + b / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


(a + c * k) / c = a / c + c * k / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


(a + b) / c = a / c + b / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


(a + k * c) / c = a / c + k * c / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


(a + b) / c = a / c + b / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


a / c + k = a / c + k * c / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


(a + b) / c = a / c + b / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


a / c + k = a / c + (0 + k * c) / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


(a + b) / c = a / c + b / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


a / c + k = a / c + (0 / c + k)
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


(a + b) / c = a / c + b / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


a / c + k = a / c + (0 + k)
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


(a + b) / c = a / c + b / c
a, b, c: Int

H: c b

h: ¬c = 0

k: Int

hk: b = c * k


a / c + k = a / c + k

Goals accomplished! 🐙
theorem
add_ediv_of_dvd_left: ∀ {a b c : Int}, c a(a + b) / c = a / c + b / c
add_ediv_of_dvd_left
{
a: Int
a
b: Int
b
c: Int
c
:
Int: Type
Int
} (
H: c a
H
:
c: Int
c
a: Int
a
) : (
a: Int
a
+
b: Int
b
) /
c: Int
c
=
a: Int
a
/
c: Int
c
+
b: Int
b
/
c: Int
c
:=

Goals accomplished! 🐙
a, b, c: Int

H: c a


(a + b) / c = a / c + b / c
a, b, c: Int

H: c a


(a + b) / c = a / c + b / c
a, b, c: Int

H: c a


(b + a) / c = a / c + b / c
a, b, c: Int

H: c a


(a + b) / c = a / c + b / c
a, b, c: Int

H: c a


b / c + a / c = a / c + b / c
a, b, c: Int

H: c a


(a + b) / c = a / c + b / c
a, b, c: Int

H: c a


a / c + b / c = a / c + b / c

Goals accomplished! 🐙
@[simp] theorem
mul_ediv_cancel: ∀ (a : Int) {b : Int}, b 0a * b / b = a
mul_ediv_cancel
(
a: Int
a
:
Int: Type
Int
) {
b: Int
b
:
Int: Type
Int
} (
H: b 0
H
:
b: Int
b
0: ?m.23851
0
) : (
a: Int
a
*
b: Int
b
) /
b: Int
b
=
a: Int
a
:=

Goals accomplished! 🐙
a, b: Int

H: b 0


a * b / b = a
a, b: Int

H: b 0

this: (0 + a * b) / b = 0 / b + a


a * b / b = a
a, b: Int

H: b 0


a * b / b = a
a, b: Int

H: b 0

this: (0 + a * b) / b = 0 / b + a


a * b / b = a
a, b: Int

H: b 0

this: a * b / b = 0 / b + a


a * b / b = a
a, b: Int

H: b 0

this: (0 + a * b) / b = 0 / b + a


a * b / b = a
a, b: Int

H: b 0

this: a * b / b = 0 + a


a * b / b = a
a, b: Int

H: b 0

this: (0 + a * b) / b = 0 / b + a


a * b / b = a
a, b: Int

H: b 0

this: a * b / b = a


a * b / b = a
a, b: Int

H: b 0

this: a * b / b = a


a * b / b = a

Goals accomplished! 🐙
@[simp] theorem
mul_fdiv_cancel: ∀ (a : Int) {b : Int}, b 0fdiv (a * b) b = a
mul_fdiv_cancel
(
a: Int
a
:
Int: Type
Int
) {
b: Int
b
:
Int: Type
Int
} (
H: b 0
H
:
b: Int
b
0: ?m.24066
0
) :
fdiv: IntIntInt
fdiv
(
a: Int
a
*
b: Int
b
)
b: Int
b
=
a: Int
a
:= if
b0: ?m.24158
b0
:
0: ?m.24118
0
b: Int
b
then

Goals accomplished! 🐙
a, b: Int

H: b 0

b0: 0 b


fdiv (a * b) b = a
a, b: Int

H: b 0

b0: 0 b


fdiv (a * b) b = a
a, b: Int

H: b 0

b0: 0 b


a * b / b = a
a, b: Int

H: b 0

b0: 0 b


fdiv (a * b) b = a
a, b: Int

H: b 0

b0: 0 b


a = a

Goals accomplished! 🐙
else match
a: Int
a
,
b: Int
b
,
Int.not_le: ∀ {a b : Int}, ¬a b b < a
Int.not_le
.
1: ∀ {a b : Prop}, (a b) → ab
1
b0: ?m.24158
b0
with |
0: Int
0
, _, _ =>

Goals accomplished! 🐙
a, b, x✝¹: Int

x✝: x✝¹ < 0

H: x✝¹ 0

b0: ¬0 x✝¹


fdiv (0 * x✝¹) x✝¹ = 0

Goals accomplished! 🐙
|
succ: NatNat
succ
a: Nat
a
, -[
b: Nat
b
+1], _ =>
congrArg: ∀ {α : Sort ?u.24313} {β : Sort ?u.24312} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
ofNat: NatInt
ofNat
<|
Nat.mul_div_cancel: ∀ (m : Nat) {n : Nat}, 0 < nm * n / n = m
Nat.mul_div_cancel
(
succ: NatNat
succ
a: Nat
a
)
b: Nat
b
.
succ_pos: ∀ (n : Nat), 0 < succ n
succ_pos
| -[
a: Nat
a
+1], -[
b: Nat
b
+1], _ =>
congrArg: ∀ {α : Sort ?u.24622} {β : Sort ?u.24621} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congrArg
negSucc: NatInt
negSucc
<|
Nat.div_eq_of_lt_le: ∀ {k n m : Nat}, k * n mm < succ k * nm / n = k
Nat.div_eq_of_lt_le
(
le_of_lt_succ: ∀ {m n : Nat}, m < succ nm n
le_of_lt_succ
<|
Nat.mul_lt_mul_of_pos_right: ∀ {n m k : Nat}, n < mk > 0n * k < m * k
Nat.mul_lt_mul_of_pos_right
a: Nat
a
.
lt_succ_self: ∀ (n : Nat), n < succ n
lt_succ_self
b: Nat
b
.
succ_pos: ∀ (n : Nat), 0 < succ n
succ_pos
) (
lt_succ_self: ∀ (n : Nat), n < succ n
lt_succ_self
_: Nat
_
) @[simp] protected theorem
mul_div_cancel: ∀ (a : Int) {b : Int}, b 0div (a * b) b = a
mul_div_cancel
(
a: Int
a
:
Int: Type
Int
) {
b: Int
b
:
Int: Type
Int
} (
H: b 0
H
:
b: Int
b
0: ?m.25516
0
) : (
a: Int
a
*
b: Int
b
).
div: IntIntInt
div
b: Int
b
=
a: Int
a
:= have : ∀ {
a: Nat
a
b: Nat
b
:
Nat: Type
Nat
}, (
b: Nat
b
:
Int: Type
Int
) ≠
0: ?m.25613
0
→ (
div: IntIntInt
div
(
a: Nat
a
*
b: Nat
b
)
b: Nat
b
:
Int: Type
Int
) =
a: Nat
a
:= fun
H: ?m.25803
H
=>

Goals accomplished! 🐙
a, b: Int

H✝: b 0

a✝, b✝: Nat

H: b✝ 0


div (a✝ * b✝) b✝ = a✝
a, b: Int

H✝: b 0

a✝, b✝: Nat

H: b✝ 0


div (a✝ * b✝) b✝ = a✝
a, b: Int

H✝: b 0

a✝, b✝: Nat

H: b✝ 0


div ↑(a✝ * b✝) b✝ = a✝
a, b: Int

H✝: b 0

a✝, b✝: Nat

H: b✝ 0


div (a✝ * b✝) b✝ = a✝
a, b: Int

H✝: b 0

a✝, b✝: Nat

H: b✝ 0


↑(a✝ * b✝ / b✝) = a✝
a, b: Int

H✝: b 0

a✝, b✝: Nat

H: b✝ 0


div (a✝ * b✝) b✝ = a✝
a, b: Int

H✝: b 0

a✝, b✝: Nat

H: b✝ 0


a✝ = a✝

Goals accomplished! 🐙
match
a: Int
a
,
b: Int
b
,
a: Int
a
.
eq_nat_or_neg: ∀ (a : Int), n, a = n a = -n
eq_nat_or_neg
,
b: Int
b
.
eq_nat_or_neg: ∀ (a : Int), n, a = n a = -n
eq_nat_or_neg
with | _, _, ⟨
a: Nat
a
,
.inl: ∀ {a b : Prop}, aa b
.inl
rfl: ∀ {α : Sort ?u.25840} {a : α}, a = a
rfl
⟩, ⟨
b: Nat
b
,
.inl: ∀ {a b : Prop}, aa b
.inl
rfl: ∀ {α : Sort ?u.25844} {a : α}, a = a
rfl
⟩ =>
this: ∀ {a b : Nat}, b 0div (a * b) b = a
this
H: b 0
H
| _, _, ⟨
a: Nat
a
,
.inl: ∀ {a b : Prop}, aa b
.inl
rfl: ∀ {α : Sort ?u.25983} {a : α}, a = a
rfl
⟩, ⟨
b: Nat
b
,
.inr: ∀ {a b : Prop}, ba b
.inr
rfl: ∀ {α : Sort ?u.25987} {a : α}, a = a
rfl
⟩ =>

Goals accomplished! 🐙
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (a * -b) (-b) = a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (a * -b) (-b) = a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (-(a * b)) (-b) = a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (a * -b) (-b) = a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


-div (a * b) (-b) = a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (a * -b) (-b) = a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


- -div (a * b) b = a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (a * -b) (-b) = a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (a * b) b = a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (a * -b) (-b) = a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


a = a

Goals accomplished! 🐙
| _, _, ⟨
a: Nat
a
,
.inr: ∀ {a b : Prop}, ba b
.inr
rfl: ∀ {α : Sort ?u.26066} {a : α}, a = a
rfl
⟩, ⟨
b: Nat
b
,
.inl: ∀ {a b : Prop}, aa b
.inl
rfl: ∀ {α : Sort ?u.26070} {a : α}, a = a
rfl
⟩ =>

Goals accomplished! 🐙
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: b 0


div (-a * b) b = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: b 0


div (-a * b) b = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: b 0


div (-(a * b)) b = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: b 0


div (-a * b) b = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: b 0


-div (a * b) b = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: b 0


div (-a * b) b = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: b 0


-a = -a

Goals accomplished! 🐙
| _, _, ⟨
a: Nat
a
,
.inr: ∀ {a b : Prop}, ba b
.inr
rfl: ∀ {α : Sort ?u.26149} {a : α}, a = a
rfl
⟩, ⟨
b: Nat
b
,
.inr: ∀ {a b : Prop}, ba b
.inr
rfl: ∀ {α : Sort ?u.26153} {a : α}, a = a
rfl
⟩ =>

Goals accomplished! 🐙
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (-a * -b) (-b) = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (-a * -b) (-b) = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (a * b) (-b) = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (-a * -b) (-b) = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


-div (a * b) b = -a
a✝, b✝: Int

this: ∀ {a b : Nat}, b 0div (a * b) b = a

a, b: Nat

H: -b 0


div (-a * -b) (-b) = -a